21Collection体系和Map

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

  1. 它是一个元素存取有序的集合
  2. 带有索引的集合
  3. 可以有重复的元素

最常用的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在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

「资料来源:饥人谷」

练习题

  1. 将List处理成Map<String, List>
  2. 求对象列表的公共元素
  3. hashCode保证键的唯一
  4. kaySet与HashMap相互影响
  5. LinkedHashSet有序
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注