Set集合:
加入Set的元素必须定义equals()方法,以确保对象的唯一性。
- HashSet:HashSet类按照哈希算法来存取集合中的对象,存取速度比较快;为快速查询你设计的Set,存入HashSet的对象必须定义hashCode();
- TreeSet:TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序,底层为树结构。
LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
List集合:
其元素以线性方式存储,集合中可以存放重复的对象;
ArrayList:由长度可变的数组实现。可以对元素进行随机访问,向ArrayList()中间插入与删除元素的速度慢。一个List可以生成ListIterator,使用它可以从两个方向遍历List;
LinkedList:在实现中采用链表数据结构。对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方法:
HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子loadfactor,已调整容器的性能。不是线程安全的,key和value的值都可以是null。
- LinkeHashMap:类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时更快,因为它使用链表维护内部次序。
- TreeMap:基于红黑树数据结构的实现。查看“键”或者“键值对”时,他们会被顺序(次序由Comparable或者Compatator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一带有subMap()方法的Map,它可以返回一个子树。
- WeakHashMao:弱键(weak key)Map,Map中使用的对象也被允许释放:这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
- IdentifyHashMap:使用==代替equals()对“键”作比较的hash map。转为解决特殊问题而设计。
Hashtable: Hashtable是线程安全的一个map实现类,它实现线程安全的方法是在各个方法上添加了synchronized关键字。但是现在已经不再推荐使用HashTable了,因为现在有了ConcurrentHashMap这个专门用于多线程场景下的map实现类,其大大优化了多线程下的性能。线程安全的,key、value的值都不能是null。
List和Set的区别:
-
Set集合和hashCode以及equals方法的联系:
重写hashCode()用于获得元素的存储位置;重写equals()用于在两个元素的位置相同的时候比较两个元素是否相等。最终去掉HashSet中的重复元素。
List和Map区别:
List:是存储单列数据的集合,存储的数据是有序并且是可以重复的。
Map:存储双列数据的集合,通过键值对存储数据,存储的数据是无序的,Key值不能重复,value值可以重复复。
ArrayList于LinkedList的区别:
ArrayList是一种可增长的数据实现,优点是它的随机存取速度快,缺点是新项的插入和现有项的删除花销大,除非变动是在ArrayList的末端。
LinkedList是双向链表实现,新项的插入和现有项的删除开销很小,随机访问速度不比ArrayList()。
ArrayList于Vector区别:
Vecotr的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
HashMap和Hashtable的区别:
HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行
- 线程安全方面Hashtable要比HashMap更安全,因为Hashtable中的方法都是synchronizd的,同时速度上比HashMap要慢,HashMap可以通过ConcurrentHashMap来使线程安全。
另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其他线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法一处元素则不会抛出ConcurrentModificationException异常,但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
HashSet和HashMap区别:
HashMap实现了Map接口,而HashSet实现了Set接口。
- HashMap存储的是键值对,而HashSet是存储对象。
- HashMap使用put()项Map添加元素,HashSe通过add()添加元素;
- HashMap使用Key计算hashcode,HashSet使用成员对象计算hashcode。
- HashMap要比HashSet快,因为它是使用唯一的键获取对象。
