集合

类层次结构

202002201606

可以学习人家的接口是怎么划分的,这个类虽然接口众多,但是职责却很清晰

以及人家是如何复用已有的代码来实现新功能

注意事项

线程安全

Collections 帮我们实现了 List、Set、Map 对应的线程安全的方法

synchronized打头的方法可以将指定的集合包装成线程安全的集合

集合性能

  • 批量新增

在 List 和 Map 大量数据新增的时候,我们不要使用 for 循环 + add/put 方法新增,这样子会有很大的扩容成本,我们应该尽量使用 addAll 和 putAll 方法进行新增

  • 批量删除

ArrayList的remove方法,删除之后都会对被删除位置的元素进行移动,如果进行循环remove,会造成性能问题,可以采用removeAll方法,这个批量删除接口只会对数组的元素移动一次

集合的坑

  • Arrays.asList(array),当array被修改时,会造成list也被修改
  • toArray 方法如果声明的数组小于list长度,会得到一个空数组

JAVA7到JAVA8集合的升级

  • 所有集合都新增了forEach 方法
  • JAVA7中ArrayList无参初始化是直接初始化10,JAVA8无参初始化则是一个空数组
  • JAVA7中的HashMap无参初始化的大小是16,JAVA8无参初始化则是一个空数组,并且引入了红黑树,并且增加了xxIfAbsent等方法
  • Arrays 提供了很多 parallel 开头的方法,这些方法支持并行计算

Guava

工厂模式初始化

HashMap<Object, Object> map = Maps.newHashMap();

Lists

ArrayList<String> list = Lists.newArrayList();
ArrayList<Object> objects = Lists.newArrayListWithCapacity(10);
// 不知道精确值,给出一个模糊值
ArrayList<Object> objects1 = Lists.newArrayListWithExpectedSize(20);
// 反转一个list,并非物理反转,而是通过对传入index的处理实现的
var list = Lists.reverse(list)
// list拆分
var list = Lists.partition(list,3)

Maps

results matching " "

No results matching " "

results matching " "

No results matching " "