集合的引入
List (ArrayList LinkedList)
Set (HashSet LinkedHashSet TreeSet )
Map (HashMap LinkedHashMap TreeMap)
Collections
Iterator
使用泛型
1.为什么使用集合而不是数组?
集合和数组相似点
都可以存储多个对象,对外作为一个整体存在
数组的缺点
长度必须在初始化时指定,且固定不变
数组采用连续存储空间,删除和添加效率低下
数组无法直接保存映射关系
数组缺乏封装,操作繁琐
2.集合架构
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中
Collection 接口存储一组不唯一,无序的对象
List 接口存储一组不唯一,有序(索引顺序)的对象
Set 接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key到value的映射
Key 唯一 无序
value 不唯一 无序
2.1 List
特点:有序 不唯一(可重复)
ArrayList:ArrayList是一个对数组进行了封装的容器。使用过程中ArrayList对于数据的查找及遍历效率较高。
在内存中分配连续的空间,实现了长度可变的数组
优点:遍历元素和随机访问元素的效率比较高
缺点:添加和删除需大量移动元素效率低,按照内容查询效率低,
ArrayList常用方法
Add() :向现有集合中添加或插入一个元素
Get() :获取指定索引位置的元素
Set() :设置指定索引位置的元素值
Clear() :清除所有的元素值
Remove() :删除指定索引位置的元素
Size() :获取容器中元素的个数
LinkedList:LinkedList在底层是一双向链表的形式进行实现,LinkedList在执行数据的维护过程中效率较高。LinkedList允许以队列或栈的方式访问数据。
采用链表存储方式。
缺点:遍历和随机访问元素效率低下
优点:插入、删除元素效率比较高(但是前提也是必须先低效率查询才可。如果插入删除发生在头尾可以减少查询次数)
LinkedList常用方法:
getFirst() :获取列表中的第一个元素
getLast() :获取列表中的最后一个元素
peek() :以队列的方式获取列表数据(获取不删除)
poll() :以队列的方式获取列表数据(获取并删除)
push() :以栈的方式将数据压入到列表中
pop() :以出栈的方式访问元素(获取并删除)
其他方法参见ArrayList
List的遍历方法
for
for-each
Iterator迭代器
集合中内容是否相同
通过equals进行内容比较,而是==引用比较
2.2 Set
特点:无序 唯一(不重复)
HashSet
采用Hashtable哈希表存储结构(神奇的结构)
优点:添加速度快 查询速度快 删除速度快
缺点:无序
HashSet常用方法:
Add() :向集合中添加一个元素
Clear() :清除集合中所有元素
Remove() :按照元素之删除集合中指定的元素
注意:HashSet中不支持下标方式访问及修改元素值。
LinkedHashSet
采用哈希表存储结构,同时使用链表维护次序
有序(添加顺序)
TreeSet
采用二叉树(红黑树)的存储结构
优点:有序 查询速度比List快(按照内容查询)
缺点:查询速度没有HashSet快
Set常用方法
Set相对Collection没有增加任何方法
Set的遍历方法
for-each
Iterator迭代器
无法使用for进行遍历(因为无序,所以没有get(i))
HashSet、HashMap或Hashtable中对象唯一性判断
重写其hashCode()和equals()方法
TreeSet中指明排序依据
实现Comparable接口 创建实现Compator接口的类。
哈希表存储原理
2.3 Map
特点 key-value映射
HashMap
Key无序 唯一 (Set)
Value 无序 不唯一 (Collection)
LinkedHashMap
有序的HashMap 速度快
TreeMap
有序 速度没有hash快
问题:Set和Map有关系吗?
采用了相同的数据结构,只用于map的key存储数据,就是Set
3. Collections
专门用来操作集合的工具类
构造方法私有,禁止创建对象
提供一系列静态方法实现对各种集合的操作
具体操作:搜索、复制、排序、线程安全化等
常用方法
Collections.addAll(list, "aaa","bbb","ccc","ccc");
int index = Collections.binarySearch(list, "ccc");
Collections.copy(list2, list);
Collections.fill(list3, "888");
String max = Collections.max(list4);
String min = Collections.min(list4);
Collections.reverse(list4);
List list5 = Collections.synchronizedList(list4);
4. Iterator
所有集合类均未提供相应的遍历方法,而是把把遍历交给迭代器完成。
迭代器为集合而生,专门实现集合遍历
Iterator是迭代器设计模式的具体实现
Iterator方法
boolean hasNext(): 判断是否存在另一个可访问的元素
Object next(): 返回要访问的下一个元素
void remove(): 删除上次访问返回的对象。
问题:可以使用Iterator遍历的本质是什么
实现Iterable接口
For-each循环
增强的for循环,遍历array 或 Collection的时候相当简便
无需获得集合和数组长度,无需使用索引访问元素,无需循环条件
遍历集合时底层调用Iterator完成操作
For-each缺陷:
数组:
不能方便的访问下标值
不要在for-each中尝试对变量赋值,只是一个临时变量
集合:
与使用Iterator相比,不能方便的删除集合中的内容
For-each总结:
除了简单遍历并读出其中的内容外,不建议使用增强for
5.泛型
JDK1.4以前类型不明确: 装入集合的类型都被当作Object对待,从而失去自己的实际类型。 从集合中取出时往往需要转型,效率低,容易产生错误。
泛型:在定义集合的时候同时定义集合中对象的类型
好处: 增强程序的可读性和安全性
6.术语辨析
集合和数组的比较
Collection和Collections的区别
ArrayList和LinkedList 的联系和区别
Vector和ArrayList的联系和区别
HashMap和Hashtable的联系和区别
集合和数组的比较:
数组不是面向对象的,存在明显的缺陷,
集合完全弥补了数组的一些缺点,比数组更灵活更实用,
可大大提高软件的开发效率而且不同的集合框架类可适用于不同场合。具体如下:
1:数组能存放基本数据类型和对象,而集合类中只能放对象。
2 : 数组容量固定且无法动态改变,集合类容量动态改变。
3:数组无法判断其中实际存有多少元素,length只告诉了array容量
4:集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式
5:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率
ArrayList和LinkedList 的联系和区别
联系: 都实现了List接口 有序 不唯一(可重复)
ArrayList
在内存中分配连续的空间,采用了顺序表结构,实现了长度可变的数组
优点:遍历元素和随机访问元素的效率比较高
缺点:添加和删除需大量移动元素效率低,按照内容查询效率低,
LinkedList
采用链表存储方式。
缺点:遍历和随机访问元素效率低下
优点:插入、删除元素效率比较高(但是前提也是必须先低效率查询才可。如果插入删除发生在头尾可以减少查询次数)
Collection和Collections的区别:
Collection是Java提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口List和Set。
Java中还有一个Collections类,专门用来操作集合类 ,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
Vector和ArrayList的联系和区别:
实现原理相同,功能相同,都是长度可变的数组结构,很多情况下可以互用
两者的主要区别如下:
Vector是早期JDK接口,ArrayList是替代Vector的新接口
Vector线程安全,ArrayList重速度轻安全,线程非安全
长度需增长时,Vector默认增长一倍,ArrayList增长50%
HashMap和Hashtable的联系和区别
实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用
两者的主要区别如下:
Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口
Hashtable继承Dictionary类,HashMap实现Map接口
Hashtable线程安全,HashMap线程非安全
Hashtable不允许null值,HashMap允许null值
7.小结