Java 学习笔记1

TreeSet 的排序是用 红黑树 完成的。 TreeSet的添加速度比HashSet要慢,但是检查数组的次数会更好,只要LogN次。所以总体感觉上添加元素花费时间也不是很长。
那为啥不都用TreeSet呢,因为TreeSet必须要在创建时提供一个Compartor,但是有的对象是不好比较的,比如存了一堆 矩形对象 在里面。

如果要定义自己的类放在 HashSet里面,就要自己实现hashCode 方法,并且要与equals相兼容。 Which means a.equals(b) = true, 他们的hashCode也要一样

用LinkedList 是为了尽可能的减少在列表中间插入或删除元素的开销。如果只有少量元素,完全可以使用ArrayList.

LinkedList的get方法非常蠢,如果需要按整数index访问时,尽量用ArrayLIst。

在并发状态下,如果集合有几个Iterator, 那么Iterator 会在每个method的开始处,检查自己的更改操作数是否等于整个集合的更改操作数。更改操作数是指,增加和删除元素,但是set方法不被计数。

队列实现一般有两种方法,一种是循环数组(ArrayDque),一种是链表(LinkedList)。效率上循环数组确实好一点,但是循环数组是一个有界集合,如果对象数量不确定或者没有上限,还是要用链表。

接口继承关系图Java 学习笔记1

Queue 队列,不用add 和 remove, 用 offer和poll 是因为如果队列满了或者空的时候,前者会抛异常,后者会返回false。

Map
putIfAbsent
getOrDefault