Collection体系提供的常用⽅方法:
List/Set
new: new ArrayList(Collection), new ArrayList()
R: size()/isEmpty()/contains()/for()/stream()
C/U: add()/addAll()/retainAll()
D: clear()/remove()/removeAll()
List
- 它是一个元素存取有序的集合
- 带有索引的集合
- 可以有重复的元素
最常用的ArrayList
- 本质上就是一个数组
- 元素增删慢,查找快
- 常用来查询数据、遍历数据
面试题:动态扩容的实现
创建一个更大的空间,然后把原先的所有元素拷贝过去
add()方法
Set
不允许有重复元素的集合,并且元素无序
判断重复:equals方法
如果你要实现一个Set,你会如何实现?
容易想到的方法比较低效
hashCode
同一个对象必须始终返回相同的hashCode
两个对象的equals返回true,必须返回相同的hashCode
两个对象不不等,也可能返回相同的hashCode
哈希算法
哈希就是一个单向的映射
例子:从姓名到姓到哈希运算
从任意对象到一个整数的hashCode
HashSet
最常用,最高效的Set实现
实战:HashSet的高效性
实战:使用HashSet对ArrayList去重
HashSet是无序的!如果有需要可以使用LinkedHashSet
Map
key value 举例:微信id和微信用户名
Map的简介与实战:
C/U: put()/putAll()
R:
get()/size()
containsKey()/containsValue()
keySet()/values()/entrySet()
D: remove()/clear()
HashMap
元素的存取顺序不能保证一致
保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法
- HashMap的线程不不安全性
- HashMap的死循环:HashMap在多线程扩容的时候有可能变* 成死循环的链表
- HashMap在Java 7+后的改变:链表->红黑树
- HashMap和HashSet本质上是一种东西
有序集合TreeSet/TreeMap
- 二叉树/红黑树简介
- 使⽤用Comparable约定,认为排序相等的元素相等
- 二叉树查找、插入简介
面试题:
HashMap的扩容
扩容是一个特别耗性能的操作,所以在使用HashMap的时候,估算map的大小,初始化的时候给一个大致的数值,避免map进行频繁的扩容。
Collections工具方法集合
emptySet(): 等返回一个方便的空集合
synchronizedCollection: 将一个集合变成线程安全的
unmodifiableCollection: 将一个集合变成不不可变的(也可以使用Guava的Immutable)
Collection的其他实现
- Queue/Deque 队列:先进先出
- LinkedList 链表结构。方便元素添加、删除的集合。
- ConcurrentHashMap 并发的环境中建议使用
- PriorityQueue 更有优先级
Guava
不要重复发明轮子!尽量使用经过实战检验的类库
Lists/Sets/Maps
ImmutableMap/ImmutableSet
Multiset/Multimap
BiMap
「资料来源:饥人谷」