初探 Java Collections

以前學了很多 ArrayList, List, Set 啥的,他們的爹都是 Collection,Collection 是一個接口,裏面提供了很多方法,如 add, remove 等。

初始化

Collection<Integer> c = new LinkedHashSet();

List<Integer> list = new ArrayList<>(c);

等價於

List<Integer> list = new ArrayList<>();
list.addAll(c);

等價於

List<Integer> list = new ArrayList<>();
for (Integer i : c) {
  list.add(i);
}

List

  • 本質就是一個數組
  • 每當放不下的時候,會增大空間,變成 1.5 倍容量
    oldCapacity + oldCapacity / 2
int newCapacity = oldCapacity + (oldCapacity >> 1);

ArrayList

List<Integer> list = new ArrayList<>(初始容量);

list.add(1);

list.size();

list.retainAll(list2); // 做交集

Set

  • 不能有重複元素,使用 equals 方法去判斷
  • 無序的,可以使用 LinkedHashSet 保證順序

hashCode

  • 同一個對象必須返回相同的 hashCode
  • equals true,hashCode 必須 true
  • equals false,hashCode 有可能 true

Map

  • 注意修改下面的,原 Map 也會被修改
    keys() -> Set
    values() -> Collection
    entry() -> Map<K, V>

  • 也會自增(和 ArrayList 差不多,也是增 1.5 倍),多線程的時候有可能出現環,導致死循環,即線程不安全。

if (++size > threshold) {
  newHashMap 擴容,和 ArrayList 差不多
}
  • 多線程下應該使用 ConcurrentHashMap
  • Java 7 後使用紅黑樹,因爲 hashCode 都相同,則會變成長 List

TreeSet / TreeMap

HashSet 順序的隨機的
TreeSet 使用 Comparable 可以變成有順的

TreeSet set = new TreeSet(list);

TreeMap 的 Key 就是 TreeSet,也是有順序的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章