java集合体系图:
Iterator:对集合进行迭代的迭代器。
方法: hasNet()如果仍有元素可以迭代,则返回true。
next() 返回迭代的下一个元素。
remove()从迭代器指向的集合中移除迭代器返回的最后一个元素
Collection: List Set Queue接口的父接口。
Set:Set集合不允许包含相同的元素,集合里的多个对象之间没有明显的顺序。Set判断两个对象相同不是使用==运算符,而是根据equals方法。
HashSet: Set接口的典型实现。按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
不能保证元素的排列顺序。
此实现不是同步的。 如果多个线程同时访问一个集合,而其中至少一个线程修改了该集合,那么它必须 保持外部同步。这通常是通过对自然封装该集合的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装”集合。最好在创建时完成这一操作,以防止对 HashSet 实例进行意外的不同步访问:Set s =Collections.synchronizedSet(new HashSet(...));
原理:当想HashSet集合插入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashcode值,然后根据它们的hashcode值决定该对象在HashSet中存储位置。
HashSet集合判断两个元素相等的标准是 两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。
此类的 iterator 方法返回的迭代器是快速失败 的:在创建迭代器之后,如果对集合进行修改,除非通过迭代器自身的 remove 方法,否则在任何时间以任何方式对其进行修改,Iterator都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来在某个不确定时间发生任意不确定行为的风险。
LinkedHashSet:具有可预知迭代顺序的Set 接口的哈希表和链接列表实现,元素顺序总与添加顺序一致。
由于增加了维护链接列表的开支,其性能很可能会比HashSet 稍逊一筹,不过,在迭代访问Set元素时有很好的性能。
不是线程安全的,可以使用Collections.synchronizedSet()方法来“包装”该集合:Set s =Collections.synchronizedSet(new LinkedHashSet(...));
TreeSet:SortedSet接口的实现类。
此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序(参见 Comparable),或按照在创建 set 时所提供的比较器进行 排序。
Comparable接口:该接口里面定义一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大 小。
如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口,否则程序将会抛出异常。
向TreeSet中添加的应该是同一个类的对象。
判断标准是:两个对象通过compareTo(Object obj)方法比较是否返回0;返回0,认为它们相等,否则不相等。
当需要把一个对象放入TreeSet中,重写该对象对应类的equals()方法时,应保证与compareTo(Object obj)方法有一致的结果:
如果两个对象通过equals()方法比较返回true时,则这两个队象通过compareTo(Object obj)方法比较应返回0.
不是线程安全的,可以使用Collections.synchronizedSet()方法来“包装”该集合:Set s = Collections.synchronizedSortedSet(new TreeSet(...));
各Set实现类的性能分析:
HashSet和TreeSet是Set的两个典型实现;HashSet的性能总是比TreeSet好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。
LinkedHashSet是HashSet的子类,只有在遍历的时候会很快,其他方面都比HashSet稍慢。
List集合:元素有序,可重复的集合,集合中每个元素都有其对应的顺序索引,通过equals()方法判断两个对象是否相等。
ListIterator接口:继承Iterator接口,提供专门的操作List的方法。
hasPrevious():是否还有上一个元素
previous():返回该迭代器的上一个元素。
add(intindex, Eelement):在指定位置插入一个元素。
ArrayList和Vector是List的两个典型实现,List 接口的大小可变数组的实现;
size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间 运行,也就 是说,添加 n 个元素需要 O(n) 时间。其他所有操作都以线性时间运行(大体上讲)。
Vector是一个古老的集合。
ArrayList是线程不安全的;
Vector是线程安全的。
Vector的性能比ArrayList的性能要低,实际上,即使需要额外保证ArrayList集合线程安全,也不推荐使用Vector。
固定长度的List:数组的工具类Arrays的内部类ArrayList。是一个固定长度的List集合,程序只能遍历,不可增加,删除。
Queue集合 :模拟队列这种数据结构。队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。
Deque接口:是Queue接口的子接口,代表一个双端队列,可以从两端操作队列的元素。
典型实现:ArrayDeque,基于数组实现的双端队列。在程序需要使用“栈”这种队列时,推荐使用ArrayDeque和LinkedList,而不是Stack。
LinkeList: 既是List接口的实现类,也是Deque接口的实现类,所以既可以根据索引来随机访问集合中的元素,也可以当成双端队列来使用。
LinkedList与ArrayList, ArrayDeque的实现机制完全不同,ArrayList,ArraDeque内部以数组的形式来保存集合中的元素,因此随即访问集合元素时有较好的性能,而LinkedList内部以链表的形式来保存集合中的元素,因此在随即访问元素时性能较差,但在插入,删除元素时性能非常出色。
Map:保存具有映射关系的数据。一个映射不能包含重复的键;每个键最多只能映射一个值。