集合小结:
Collection
集合是用来存储引用类型数据的容器,集合只能存储引用类型数据,不能存储基本类型数据。
---- Collection集合,单个存储
基本操作:
add(o), contains(o), remove(o), iterator()
--------List
有序,可重复,存储数据的顺序与添加顺序一致,可以存储重复的数据
为每个元素指定了索引值,增加了针对索引值的操作
add(index, o), remove(index) get(index)
在JDK8中,List增加了sort(Comparator)排序功能
------------ArrayList
底层是数组, 访问快,添加删除慢
初始化容量: 10
扩容: 1.5倍
------------Vector
底层是数组,它是线程安全的
初始化容量: 10
扩容: 2倍
------------LinkedList
底层是双向链表, 添加删除效率高,访问慢
增加了针对第一个最后一个元素的操作
可以用来模拟栈,push()/pop(), 模拟队列: offer()/poll()
--------Set
无序,不可重复,存储顺序与添加顺序可能不一样,不允许存储重复的数据
------------HashSet
底层是HashMap
向HashSet添加元素就是把元素作为键添加到底层的HashMap中
HashSet就是HashMap键的集合
------------TreeSet
实现了SortedSet接口,可以对集合中的元素自然排序,要求集合中元素必须是可比较的
1)要么在构造方法中指定Comparator比较器
2)要么让元素的类实现Comparable接口
底层是TreeMap
向TreeSet添加元素就是把元素作为键添加到底层的TreeMap中
TreeSet就是TreeMap键的集合
应用场景:
单个存储数据时使用Collection集合
- 如果允许存储重复的数据选择List
如果以访问为主,选择ArrayList
如果频繁添加/删除选择LinkedList
如果开发多线程程序,也不使用Vector,使用java.util.concurrent包(juc)中线程安全的集合- 如果不允许存储重复的数据选择Set
如果不需要排序就选择HashSet
如果需要排序选择TreeSet
注意:
List集合与HashSet集合在存储自定义类型数据时,要重写equals()/hashCode()方法, contains(o),remove(o) 需要调用元素的equals()方法 。
TreeSet集合判断是否相同的元素,是根据Comparator/Comparable的比较结果是否为0来判断的,如果比较结果为0就认为是相同的元素。
Map
asaa
---- Map集合, 按<键,值>的形式存储
基本操作:
put( k , v), containsKey(k) containsValue(v) get(k)
keyset() values() entrySet()
remove(k) replace(k, v)
--------HashMap
底层是哈希表, 哈希表是一个数组,数组的每个元素是链表
初始化容量: 16
加载因子: 0.75 , 当键值对数量 > 容量 * 加载因子时, 扩容
扩容: 2倍
键值可以为null
指定初始化容量,系统会自动调整为2的幂次方, 为了快速计算数组的下标
-------- HashTable
底层是哈希表, 它是线程安全的 , HashMap不是线程安全的
初始化容量: 11
加载因子: 0.75 , 当键值对数量 > 容量 * 加载因子时, 扩容
扩容: 2倍 + 1
键值都 不 可以为null
指定初始化容量,
------------ Properties
继承了HashTable
键值都是String字符串
经常用来设置/读取系统属性: setProperty() , getProperty()
--------TreeMap
根据键自然排序, 要求键必须是可比较的
1)在构造方法中指定Comparator比较器
2)让键实现Comparable接口
TreeMap的键是根据红黑树进行排序的,红黑树是一种自平衡二叉树
在开发时,选择在构造方法中指定Comparator,还是选择让键实现Comparable接口?
一般让键实现Comparable接口,定义一个使用最广泛的比较规则
可以通过Comparator定义很多种不同的比较规则
应用场景:
存储<键,值>对时选择Map
- 如果不需要根据键排序就使用HashMap
- 如果需要根据键排序就选择TreeMap
- 如果开发多线程程序,使用java.util.current包中线程安全的集合类,HashTable并发效率低。juc包中ConcurrentHashMap并发效率高,在JDK7前ConcurrentHashMap采用分段锁协议,默认分为 16段锁,在JDK8中对ConcurrentHashMap进行性能提升,采用CAS(Compare And Swap)。