四种体系:
Set:无序不重复
List:有序重复
Map:有映射关系
Queue:队列集合实现
两个接口:Collection(list set queue)和Map(根接口)
HashSet:不是同步;元素值可以是null。当向HashSet存入元素,调用该对象的hashCode()方法得到该对象的hashCode值,由值决定在在HashSet的存储位置。
两个元素相等的标准:equals()方法返回true,hashCode()相等
不要轻易修改HashSet的对象。
LinkedHashSet是Hashet的子类,使用链表维护元素次序
TreeSet是SortedSet接口的实现类,确保集合元素处于排序状态。只能添加同一种类型的对象
当一个对象加入加入TreeSet集合时,调用该对象的compareTo(Object obj)方法与容器其他方法比较大小,然后根据红黑树结构找到存储位置,若相等,无法添加。返回0表示相等。
EnumSet类
各Set实现类的性能分析
Hashset的性能优于TreeSet,除非需要一个保持排序的Set。遍历LinkedHashSet更快。
EnumSet是所有Set中性能最好的,但只能保存同一个枚举类的枚举值作为集合元素
这三个类都是线程不安全的,可以通过synchronizedSortedSet方法包装,在创建时进行。
SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
List集合
集合的每个元素都有对应的顺序索引。允许重复元素,默认按添加顺序设置索引。
Void add (int index,Object element)
Object get/remove(int index)
List类的两个典型实现:ArrarList和Vector,都是基于数组实现,动态允许再分配。使用initialCapacity设置数组长度,超过时会自动增加。
显著区别,ArrayList是线程不安全的
ArrayKust LinkedList是线性表的典型实现,基于数组和链。LinkedList提供了双端队列、栈的功能。总体上A的性能好。遍历集合,A和V使用随机访问方法(get),L使用迭代器(iterator)
Queue集合
PriorityQueue按队列大小重新排序,而不是先进先出
Map集合
List有数字索引,Map用key索引。从源码上看,包装所有value为null的Map即可实现Set。
HashSet和Hashtable(古老的类):
Table线程安全,不能有key或value为null。Map允许有key或value为null
判断key需要hashnode和equals。判断value只要equals
网友评论