一、前言
近期正在找工作,为此准备了Java集合的相关内容
二、java集合概述
Java的集合类主要由两个接口派生而出:Collection和Map, Collection和Map是java集合根接口,这两个接口又包含了一些子接口或实现类,
以上的使用多的是Collection中的List接口:HashSet , LinkedHashSet ,TreeSet
List接口: ArrayList,LinkedList,Vector。
还有Map接口:HashMap , LinkedHashMap ,TreeMap
三、Collection接口
Set集合
1.HashSet
底层由Hash表支持,
这个同样适用于List集合两个对象是否相等
2.LinkedHashSet
结果:元素的顺序和添加顺序一致,但是不允许元素出现重复
3.TreeSet
理解:可以确保集合处于排序状态,有两种排序方法 : 自然排序和定制排序,默认的是自然排序
自然排序:根据集合元素大小进行排序,
定制排序:不管元素本身的大小,由Comparator对象负责元素的排序规则
4.set实现类性能分析
List集合
1.ArrayList和LinkedList的区别
四、Map接口
1.HashMap和HashTable的区别
1.HashTable是线程安全的,HashMap是线程不安全的,因此HashMap比HashTable的效率高
2.HashTable 不允许null值作为一个key值或value值
如何使HashMap线程安全?
(1)通过Collections.synchronizedMap()来封装所有不安全的HashMap的方法
(2) 把HashMap进行了拆分,拆分成了多个独立的块,这样在高并发的情况下减少了锁冲突的可能
3.HashMap的底层实现原理
由数组和链表组成,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,它和HashSet类似,如果定 位到的数组不含链表,那么对于查找,添加等操作很快,如果定位的数组包含链表,对于添加操作效率不变,但是对于 查找操作,需要遍历链表,效率就会有所减慢,然后通过key对象的equals方法注意比对查找。
对比: HashSet: 由哈希表支持,是无序的,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有的元素,HashSet没有提供get()方法,愿意是同HashMap一样,Set内部是无序的,只能通过迭代的方式获得
五、延伸
如何是map子类是线程安全的?
1.使用HashTable
2.HashMap加锁
3.使用 ConcurrentHashMap,它使用了锁分段技术
LinkedHashMap的概念,作用
底层使用双向链表维护key-value的次序,负责维护map的迭代顺序,
性能略低于HashMap,但是在迭代元素的时有较好的性能
TreeMap概念,作用
和TreeSet是差不多的概念,使用红黑树管理数据,TreeMap的通常比HashMap,HashTable
要慢(尤其是插入、删除时更慢),但是它总是可以保持一个有序状态