您的位置:首页 > 编程语言 > Java开发

Java基础 集合详述

2016-04-02 14:30 816 查看
面试的时候总是会被问到集合,尤其是Map

特地总结复习一下。

一.Java集合概述

Java的集合主要由两个接口派生而出,Collection和Map

1.Collection集合体系的继承树



2.Map集合体系继承树



二.Set集合

1.HashSet

HashSet按Hash算法来存储集合中的元素。

不保证元素的排列顺序HashSet线程不安全。

元素的值可以是null

HashSet通过调用对象的hashCode()的值来得到对象的haskCode,根据hashCode来决定对象在HashSet中存储的位置。
如果有两个元素通过equals()方法返回true,但它们的hashcode不同,HashSet会把他们存储在不同位置,依然可以成功添加,但此时当作两个对象。
如果两个元素通过equals()方法返回false,但他们的hashcode相同,这个时候HashSet会采用链式结果来保存多个对象,在HashSet中访问这两个对象时,性能下降。
对于要保存在HashSet中的对象,应重写这个类的equals()和hashCode()方法,使其equals和hashCode同真假。

2.LinkedHashSet

LinkedHashSet是HashSet的子类
它使用链表维护元素的次序位置,在插入时,因为要维护插入顺序,其性能略低于HashSet,当在迭代访问Set里的元素时,有很好的性能。

3.TreeSet

可以将元素处于排序状态。
内部采用红黑树来存储
未定制实现Comparator接口的话,默认自然排序

4.EnumSet

其中的元素都必须是指定枚举类型的枚举值。
有序的,以枚举值的定义顺序来决定集合元素的顺序。
不允许加入null,但可以删除或判断是否包含null,返回false

各类Set分析性能分析

1.HashSet的性能总是比TreeSet好,因为TreeSet需要用红黑树来维护元素次序。当以Set需要排序的时候,使用TreeSet,否则,使用HashSet
2.对于普通的插入、删除操作,LinkedHashSet比HashSet要略慢一些,这是链表维护带来的开销,但遍历的时候LinkedHashSet要快一些
3.以上的各类Set都是线程不安全的,当多个线程同时访问一个Set时,必须手动保证同步性。通常可以使用Collections的synchronizedSortedSet.



三.List集合

1.ArrayList

1.默认初始数组长度为10
2.线程不安全

2.Vector

1.线程安全
2.固定长度的List
Arrays.asList()方法返回一个List,但这个List是ArrayList的内部类实例,不是第1种ArrayList,程序只能遍历其中的元素,不可增加、删除集合里的元素。
3.性能差

3.LinkedList
1.还实现了Queue接口。
2.内部是用链表实现的,在插入和删除时性能出色。
4.各种List的性能分析

对于ArrayList,Vector结合,应该使用随机访问方法get来遍历,这样性能更好。对于LinkedList集合,应该采用迭代器,来遍历集合元素

四.Map集合

1.HashMap

1.线程不安全
2.接受null作为key或value

2.Hashtable

1.线程安全
2.不接受null作为key或value
HashMap和Hashtable对于key的要求和冲突处理和HashSet相同



3.LinkedHashMap

1.需要维护插入的顺序
2.内部采用双向链表来维护key-value对的顺序

4.SortedMap接口和TreeMap

1.TreeMap内部是红黑树,每一个key-value都是红黑树的一个节点
2.自然排序。所有的key都必须事先Comparable接口。所有的key是一个类的对象,否则抛异常
3.定制排序。创建TreeMap时,传入一个Compatator对象。

5.WeakHashMap

1.与HashMap类似,但其中的元素都是原对象的弱引用,这意味着,如果所引用的对象没有其他的强引用,那么这些key所引用的对象可能会被垃圾回收期回收。

6.IdentityHashMap

1.与HashMap类似,但要求两个key必须==严格相等,才认为这两个key相等。

7.EnumMap

1.不接受null作为key,但接受null作为value
2.根据key进行自然排序,
3.与枚举类共用

各类Map的性能分析
TreeMap通常比HashMap和Hashtable要慢,一般的场景下,多用HashMap

HashSet和HashMap的性能选项
当遇到hash冲突时,一个位置会存储多个元素,这些元素通过链表形式存储,必须按顺序搜索,性能下降。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: