java.util包下
(虚线为接口,实线为实现类)
目录
单列集合跟接口Collection
List 有序(即:存入顺序和取出顺序一致)、可重
ArrayList实现 看做长度可变的数组
LinkedList实现 双向循环链表
Set 无序、无重
HashSet实现 根据对象的哈希值来存储对象在集合中的存储位置
当调用add()存入元素时,首先自动调用当前存入对象的hashCode()获得对象的哈希值,计算存储位置,若该位置上有元素则会调用equals()比较,若返回false则存入,返回true则舍弃。
所以需要重写hashCode()、equals()。若要比较的是String类型,String类已经重写了两个方法。若要比较的是Student 对象,则可在Student类中重写:
TreeSet实现 AVL(是一棵二叉排序树,所以是排序的)
每次向TreeSet集合中存入一个元素时,就会将该元素与其他元素比较,比较时,都会调用compareTo(),该方法是 Comparable接口中定义的,所以必须实现Comparable:
还可以使用自定义比较器:
Iterator接口 遍历Collection
ArrayList list = new ArrayList();
...
Iterator it = list.iterator();
while(it.hasNext()) {
Object obj = it.next();
}
jdk5新特性 foreach语法 比iterator简洁 只能访问,不能修改
ArrayList list = new ArrayList();
...
for (Object obj : list) {
System.out.println(obj);
}
ListiIterator接口 ListiIterator是Iterator的子类
ArrayList list = new ArrayList();
...
ListiIteratorit = list.listiIterator(list.size()); //list.size()用于起始位置
while(it.hasPrevious()) { //逆向迭代
Object obj = it.Previous();
}
Enumeration接口
双列集合跟接口Map 键唯一
HashMap实现
HashMap和LinkedHashMap的区别:
HashMap
根据键的HashCode 值存储数据。使用链地址法解决冲突,也就是数组+链表的方式,所以HashMap由数组+链表组成的。(具体实现:https://blog.csdn.net/chushoufengli/article/details/88089201)
不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。
LinkedHashMap
是HashMap的子类,其内部维持了一个双向链表,可以保持顺序。
第一种遍历方式 先遍历键,再根据键获取相应的值
第二种遍历方式 先获取集合中所有的映射关系,再从映射中取出键和值
第三种遍历方式
以上无序的,LinkedHashMap提供一种有序的:
TreeMap实现
理解为TreeMap的所有键为TreeSet。
自定义比较器:
、
HashTable实现类的子类Properties
java.util包下的,操作集合的工具类——Collections,操作数组的工具类——Arrays,见API