几天复习了Java集合的知识点,总结一下。
一.Vector和ArrayList的比较
1.Vector的方法是线程同步的,是线程安全的,ArrayList的方法不是,是线程不安全的。所以ArrayList比Vector的性能高。
2.两者在扩容时不同,Vector是变为原来的两倍,ArrayList是扩为原来的1.5倍。ArrayList相对来说比较节约内存空间。
3.Vector可以自定义增长因子,ArrayList不可以。
4.相同点是两者的初始容量都为10.
使用场景:
因为Vector是线程安全的,所以在多线程情况下使用Vector,不考虑线程安全的因素的时候,一般使用ArrayList比较好。
二.ArrayList和LinkedList的比较。
1.ArrayList的是基于动态数组的(地址是连续的),查询和修改比较快;而LinkedList是基于创想循环链表的,增加和删除操作 比较快。
2.ArrayList允许为空,LinkedList允许为NUll元素。
使用场景:
当需要对数据进行访问时选用ArrayList,需要对数据进行增删时选择LinkedList。
三.HashSet和TreeSet的比较。
1.HashSet是hash表实现的,TreeSet时二叉树实现的。
2.TreeSet中的数据是自动排好序的,不允许为为null;HashSet中的元素是无序的,可以为null但是能有一个。TreeSet和 HashSet中的元素都不能重复。
3.HashSet要求放入的元素必须实现hashcode()方法,因为HashSet判断两个元素是否相同实质上就是hashcode码是否相 同。
适用场景:
因为HashSet是hash表实现的所以性能优于TreeSet,一般使用HashSet,当遇到排序问题时,则选择TreeSet(因为TreeSet实现了SortedSet接口)。
四.HashMap和ConcurrentHashMap的比较。
1.HashMap是线程不安全的,而ConcurrentHashMap是线程安全的。
2.ConcurrentHashMap采用分段锁机制实现线程安全,将整个Hash桶进行了分段segment,将大数据分成几个小片段 segment,每个segment上有锁存在。在插入元素的时候先找到相对应的segment和segment锁,而后对其进行操作。
五.HashTable和ConcurrentHashMap的比较。
两者都是线程安全的,但是HashTable是在成员方法前加Synchronized锁,当数据量较大时HashTable的性能比较低,因为迭代时需要被锁住很长时间;而ConcurrentHashMap使用的是分段锁机制(对局部加锁)。
六.集合中线程安全的有:Vector、Stack、HashTable、Enumeration(枚举)
七.解决Hash冲突的方法:拉链法、开放地址法、建立公共溢出区、再哈希法。