java八股文笔记-集合

147 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情

集合

image.png

image.png

Collection

//添加
boolean add(Object obj);
boolean addAll(Collection c);
//delete
void clear();
boolean remove(Object obj);
boolean removeAll(Collection c);
//justice
boolean contains(Object obj);
boolean containsAll(Collection c);
boolean isEmpty();
//iterator
Iterator<E> iterator();
//length
int size();
boolean retainAll(Collection c);

List

存取有序,有索引,元素可重复

ArrayList(增删慢,改查快)

  • 底层是数组

  • 默认参数化容量是10,每次扩容为原先容量的1.5倍

  • 增删时,用数组拷贝复制

  • 删除元素时不会减少容量,若希望减少容量则调用trimToSize()

Linkedlist(改查慢,增删快)

底层是双向链表【双向列表便于实现往前遍历】

Vector

底层是数组,基本被ArrayList代替,原因如下:

  1. 所有方法都是同步的,有性能损失。

  2. 初始长度是10,超过后以100%增长,相比ArrayList更消耗内存

对比

ArrayList的增删慢并不是绝对的

  1. 如果增加的一直是add()增加到末尾的话

  2. 一直删除末尾的元素

  3. 如果删除中间位置的元素,还是ArrayList快

但是一般来说:增删多还是用LinkedList

Set

存取无序,元素不可重复,set也是Collection的子接口

  • 可以使用迭代器

  • 可以使用增强for

  • 不能使用索引

HashSet(数组+链表+红黑树)

原则参考HashMap

  1. 实现了Set接口

  2. 实际上是HashMap

  3. 可以存放一个null

  4. 不能重复,存取无序

LinkedHashSet

LinkedHashSet继承了HashSet,底层是一个LinkedHashMap,底层维护了一个双向链表。每一个节点都有before和after属性,添加元素的原则和hashset一样

Map

  1. map和collection并列,用于保存有映射关系的数据:ket-value

  2. key和value可以是任何引用类型的数据,会被封装到HashMap$Node对象中

  3. key值不可以重复,value可以重复

  4. key值只能有一个null,value可以有多个null

  5. 常用String类作为Map的key

  6. 添加相同的key,相当于修改value

Map的遍历

1.通过set取出所有的key,然后通过for进行遍历

Set keyset = map.Keyset();
for(Object key : keyset){
  System.out.println(key + " - "+ map.get(key));
}

2.迭代器

Iterator iterator = keyset.iterator();
while(iterator.hasNext()) {
  Object key = iterator.next();
  System.out.println(key + " - "+ map.get(key));
}

3.4.同1、2取出value

5.通过EntrySet

Set entryset = map.entrySet();
for(Object entry:entrySet) {
  Map.Entry m = (Map.Entry) entry;
  System.out.println(m.getKey() + "-" + m.getValue());
}

HashMap(数组+链表+红黑树)

数组用来存储元素数据,链表解决冲突,红黑树提高查询效率。

  1. 如果链表长度>8&数组大小≥64,链表转为红黑树

  2. 红黑树节点数<6,转为链表

put的过程: (引用的图片)

哈希值为32位int类型,计算的新哈希值是16高位和16低位异或,然后对数组长度(初始16)取模,取模的方法是和15进行&操作,直接保留后几位二进制数。

如果传入的不是2 的整数次方时,则向上找到2的整数次方大小,比如传入17是应该找到32。

哈希函数的构造方法:除留取余法、直接定址法、数字分析法、平方取中法、折叠法

扩容要rehash,十分耗时,为什么扩容因子取0.75?如果取得比较大,元素很多空位很少才扩容,那么发生哈希冲突的概率就增大了,查找的时间成本增加。如果设置比较小,查找时间成本降低,但是需要更多的空间,空间成本增加了。

HashTable

hashtable和hashmap的使用方法基本一样,他是线程安全的,但键和值都不能为null

线程安全效率运行null键null值
HashMap不安全可以
Hashtable安全较低不可以

Properties

使用特点和Hashtable类似,properties还可以用于从xxx.properties文件中加载数据到properties对象进行读取和修改,xxx.properties文件通常作为配置文件

总结

1.先判断存储的类型(单列或双列)

2.单列:collection接口

允许重复:List

  1. 增删多:LinkedList

  2. 改查多:ArrayList

不允许重复:Set

  1. 无序:hashset

  2. 排序:TreeSet

  3. 插入和取出顺序一致:LinkedHashSet

3.双列:Map

  1. 键无序:HashMap

  2. 键排序:TreeMap

  3. 键插入和取出顺序一致:LinkedHashMap

  4. 读取文件Properties