Set 无序 不可重复 HashSet TreeSet
Queue 队列 ArrayDeque
List 有序 可重复 LinkedList ArrayListc
Map HashMap TreeMap
java5开始有了泛型
java.util.Collections
8.3 Set集合
不重复元素的集合
HashSet 不保证元素的顺序排列 线程不安全 集合值可以为Null
HashSet判断两元素相等的标准:equals比较相等 且两个对象的hashCode()方法返回值也相等
**当需要将某个类的对象保存到HashSet中,重写hashCode和equals方法时,尽量两方法一致,即hashCode值一致,equals也也返回一致True
LinkedHashSet 将会保留元素的添加顺序
TreeSet 采用红黑树的数据结构
是Sorted接口的实现类,可以使集合元素保持有序
向TreeSet中存入的对象,都必须实现了Comparable 方法,有compareTo方法
如果希望TreeSet正常工作,TreeSet只能添加一种类型的对象
8.4 List集合
ArrayList和Vector是List类的典型实现
都是基于数组实现的,内部都封装了一个动态的 允许再分配的Object[]数组
只不过Vector是一个古老的集合(JDK1就有了),那时Java还没有集合框架
Vector是线程安全的,但速度较慢;ArrayList是线程不安全的
ArrayList(int initialCapacity)
构造一个具有指定初始容量的空列表。
void ensureCapacity(int minCapacity)
如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数
Vector的直接子类:Stack 先入后出的数据结构
Stack要尽量少用,需要用栈,可用ArrayDeque(实现了List和Deque)
Arrays.asList() 将数组转换成一个List集合 这个List类是Arrays的内部实现类
—>这个List集合里的元素只能被遍历 不能被增删
与Collection.toArray() 顺序相反
两者都是数组和集合之间的桥梁
8.5 Queue集合
offer 指定元素加入队列尾部
peek 获取头部元素 但是不删除
poll 获取头部元素 并删除
Queue 队列
Deque 双端队列(既可以当队列,也可以当栈)
1、PriorityQueue实现类 优先队列 基于堆实现的
会对队列中的元素进行排序,先poll出来的,都是小的元素(默认是一个最小堆)
已经违反了队列最基本的规则:FIFO
2、Deque接口和ArrayDeque实现类
Deque接口有一个典型的实现类ArrayDeque
双端队列,还可以当成是栈来使用
当程序中需要用到栈这种数据结构时,推荐使用ArrayDeque
ArrayDeque和ArrayList的实现机制基本相似
java.util.Stack是一个古老的集合,性能较差
3、LinkedList实现类
所有已实现的接口:
Serializable, Cloneable, Iterable, Collection, Deque, List, Queue
是链表,是栈,也是队列
值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用
总结:
总体来说ArrayList性能要比LinkedList要好,平时应该多考虑用ArrayList
LinkedList 遍历时,因为是链表结构,最好用迭代器 Iterator
ArrayList遍历时,因为是数组结构,用随机访问方法(get)比较好
Queue使用时要尽量避免Collection的add()和remove()方法,
而是要使用offer()来加入元素,使用poll()来获取并移出元素。
它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。
8.6 Java8增强的Map集合
Map其实就是一种Set,只不过多了Value而已
LinkedHashMap 使用一个双向链表来维护k-v的次序
迭代次序与K-V对的插入顺序保持一致
使用Properties读写属性文件
Properties是HashTable的子类
Properties是一个Key和Value 都是String的Map
TreeMap 基于红黑树,每个K-V对都是红黑树的一个节点。
TreeMap可以保证所有的K-V对都处于有序状态
Set和Map的关系非常紧密,
Java源码中先实现Map类,然后通过包装一个所有value值都是null的Map,实现了Set
现在主要考虑的是如何保证数据安全性的同时,降低存储费用