概述:Java集合总的分为两阵营。一个以collection为首(单值元素),另一个则是map为首(键值对)。
List和Set
相同点:
操作数据集合的方法大致相同,例如:add()、remove()、congtains()、size()等
不同点:
1、List元素可重复、元素有序(和添加顺序一致)、元素可为空
2、Set元素不可重复、元素无序、元素可为空
set
HashSet类与LinkedHashSet类
相同点:同为set的实现类,同时也都是根据hashCode来决定元素存储位置
不同点:
1.HashSet不是同步的,多线程访问同一步HashSet对象时,需要手工同步,集合元素值可以为null,但不重复。
2.LinkedHashSet集合元素有序但不重复。需要维护元素的插入顺序,性能略低于HashSet
HashSet与TreeSet
1.HashSet不能保证元素的排列顺序,TreeSet是SortedSet接口的唯一实现类,可以确保集合元素处于排序状态
2.HashSet底层用的是哈希表,TreeSet采用的数据结构是红黑树
3.HashSet中元素可以是null,但只能有一个,TreeSet不允许放入null
List
ArrayList和Vector实现类
相同点:都是基于数组实现
不同点:
1.ArrayList是线程不安全,而Vector是线程安全
2.Vector的性能会比ArrayList低,且有很多重复方法
3.Vector提供一个子类Stack,可以挺方便的模拟“栈”这种数据结构(LIFO,后进先出)。
注:Vector现在已不经常使用
LinkedList类,基于链表实现的,且有固定的list方便数据的转换(特点是不可以增加元素,也不可以删除元素)
补充:那么数组和链表会有什么不同?
数组:下标访问,所以访问速度比较快,TC为O(1),插入的时候需要移动数据元素,插入慢。TC为O(n)
链表:插入速度快T(1)。只需要改变指针指向。访问慢O(n),需要从头开始一个一个查找。
MAP
HashMap和TreeMap
HashMap key和value值允许为空,key相同时,前者会覆盖后者,保持最新。
HashMap和HashTable的区别
相同点:
1.基于hash表实现的,每个元素都是key-value对,内部都是通过单向链表解决冲突,容量都会自动增长 (默认16)
不同点:
1. HashMap继承自AbstractMap类,HashTable继承自Dictionary类,
2. HashTable是同步的,适合多线程环境,而HashMap不是,但效率相对较高
3. HashMap允许key和value为null,而HashTable不允许
4. Hash值的使用不同,HashTable直接使用对象的hashcode值,而HashMap重新计算hash值
5. 在Java1.4中引入了HashMap的子类LinkedHashMap,若需要遍历顺序,可以从HashMap转向LinkedHashMap, 而HashTable的顺序是不可预知的
6. HashMap提供对key的Set进行遍历,因此它支持fail-fast机制,而HashTable提供对key的Enumeration进行遍历,不支持fail-fast
HashMap和ConcurrentHashMap的区别
1、HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。
2、ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。
Iterator和ListIterator的区别
相同点:
1. 两者都有hasNext()和next()方法,可以实现顺序向后遍历,ListIterator还有hasPrevious()和previous()方法,可以实现逆序遍历
2. 都有remove()方法可以实现删除对象,ListIterator还有添加方法add()和修改方法set(),可以实现添加和修改对象, Iterator的协议不能确保迭代的次序,所以没有提供add()方法
不同点:
1. ListIterator继承自Iterator接口,然后添加了一些额外的功能
2. Iterator可以遍历Set和List集合,而ListIterator只能遍历List集合
3. ListIterator有nextIndex()和previousIndex()方法,可以定位当前的索引位置,Iterator没有此功能
各种线性表选择策略
1.数组:是以一段连续内存保存数据的;随机访问是最快的,但不支持插入、删除、迭代等操作
2.ArrayList与ArrayDeque:以数组实现;随机访问速度还行,插入、删除、迭代操作速度一般;线程不安全
3.Vector:以数组实现;随机访问速度一般,插入、删除、迭代速度不太好;线程安全
4.LinkedList:以链表实现;随机访问速度不太好,插入、删除、迭代速度非常快