Java中常见的集合
一、Collection
1、List(有序,可重复)
ArrayList
- 内部是通过数组实现(缺点是每个元素之间不能有间隔)
- 有序,可重复
- 当从ArrayList中间进行插入或者删除元素时,需要对数组进行复制,移动,代价很高
- 随机查找和遍历的速度很快,不适合插入和删除。
LinkedList
- 内部通过链表实现
- 有序,可重复
- 由于是通过链表实现**,动态的插入和删除比较方便,随机访问和遍历的速度比较慢**
Vertor
- 内部通过数组进行实现
- 与ArrayList不同的支持线程同步,某一时刻只能一个线程写Vertor,避免多线程同时写引起的不一致。
- 缺陷:由于线程同步,访问速度比较慢。
2、Set(无序,不可重复)
存储无序(存入和取出的顺序不一定相同),值不能重复,对象的相同本质是hashCode值判断,如果想让两个不相等的对象相等,就必须覆盖Object的hashCode方法和equals方法。
HashSet
- HashSet存储数据时是按照哈希值进行存储。取数据也是按照哈希值取数据的。
- 元素的哈希值通过HashCode方法来获取。HashSet首先判断两个的哈希值,哈希值相同再调用equals方法。
- Hash值会存在相同,equals不同的情况是,会有哈希桶的情况,即排成一列。
TreeSet
- 内部实现原理二叉树。
- 添加元素时:对新add()的对象进行排序,每增加一个对象就会进行排序,之后插入到二叉树
- Integer和String对象都可以进行默认的TreeSet排序,自定义对象,想要实现排序,自定义类需要实现Comparable接口,覆写compareTo()函数。
LinkHashSet
- 底层:继承于HashSet,基于LinkedHashMap实现,保存元素:使用LinkedHashMap保存元素
- 实现方法:LinkedHashSet只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器。直接调用父类HashSet的方法即可。
3、Queue
二、Map
1、HashMap(重要)
- 底层:Java8(数组+链表+红黑树),Java7(数据+链表)
- 键、值:最多只允许一条记录的键为null,允许多条记录的值为null
- 线程安全:非线程安全(任一时刻,可以有多个线程同时写HashMap)
- 实现线程安全的方法:1、用Collections的syschronziedMap方法实现;2、使用ConcurrentHashMap实现
详解:
- Java7下的HashMap
- 底层实现:数组+单向链表
- 每个实体是嵌套了一个Entry实例:Entry包含四个属性:key,value,hash值和单向链表的next.
-
- capacity:当前数组容量,始终保持2^n,扩容后数组的大小是当前的2倍。
- loadFactor:负载因子,默认为0.75
- threshold:扩容的阈值,等于capacity*loadFactor
- Java8下的HashMap
- 底层实现:数组+链表+红黑树
- 红黑树增加的意思:在java7时,查找的时候,通过数组能够快速的定位到具体的下标,之后就需要顺着链表一个一个进行比较。时间复杂度取决于链表的长度,为O(n), Java8时,当链表当中的元素超过8个的时候,就会将链表转换为红黑树,继而这些位置查找的时候,就降低了时间复杂度为O(log N).
2、ConcurrentHashMap(重要)
- 组成:由一个个的Segment组成。也被称为分段锁。
- 线程安全:ConcurrentHashMap是一个Segment数组(Segment继承ReentrantLock加锁),所以加锁的时候,是锁住一个segment,这样就保证了线程的安全。
- Java7下的ConcurrentHashMap
- concurrencyLevel(并行度默认16):也被称为segment数,默认为16,所以理论上可以有16个线程并发写,在初始化的时候,可以设置“16”这个数。但是一旦初始化,就不能够进行扩容。
- Java8下的ConcurrentHashMap
- 引用了红黑树
3、HashTable
- 线程安全:任一时刻,只能一个线程进行写。并发性不如ConcurrentHashMap
- 项目需要线程安全时一般使用ConcurrentHashMap,不需要线程安全时可以用HashMap替换。
4、TreeMap(可排序)
- 实现SortedMap接口,能够把保存的记录根据键排序,默认按照键值升序排序。
- 用Iterator遍历时,得到的记录也是排序之后的。
- 注意:使用TreeMap时,key必须实现Comparable接口,或者构造TreeMap时传入自定义的Comparator,否则会抛出异常。
5、LinkHashMap
- LinkHashMap是HashMap的一个子类。保存了记录的插入顺序。