开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第33天,点击查看活动详情
集合
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代替,原因如下:
-
所有方法都是同步的,有性能损失。
-
初始长度是10,超过后以100%增长,相比ArrayList更消耗内存
对比
ArrayList的增删慢并不是绝对的
-
如果增加的一直是add()增加到末尾的话
-
一直删除末尾的元素
-
如果删除中间位置的元素,还是ArrayList快
但是一般来说:增删多还是用LinkedList
Set
存取无序,元素不可重复,set也是Collection的子接口
-
可以使用迭代器
-
可以使用增强for
-
不能使用索引
HashSet(数组+链表+红黑树)
原则参考HashMap
-
实现了Set接口
-
实际上是HashMap
-
可以存放一个null
-
不能重复,存取无序
LinkedHashSet
LinkedHashSet继承了HashSet,底层是一个LinkedHashMap,底层维护了一个双向链表。每一个节点都有before和after属性,添加元素的原则和hashset一样
Map
-
map和collection并列,用于保存有映射关系的数据:ket-value
-
key和value可以是任何引用类型的数据,会被封装到HashMap$Node对象中
-
key值不可以重复,value可以重复
-
key值只能有一个null,value可以有多个null
-
常用String类作为Map的key
-
添加相同的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(数组+链表+红黑树)
数组用来存储元素数据,链表解决冲突,红黑树提高查询效率。
-
如果链表长度>8&数组大小≥64,链表转为红黑树
-
红黑树节点数<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
-
增删多:LinkedList
-
改查多:ArrayList
不允许重复:Set
-
无序:hashset
-
排序:TreeSet
-
插入和取出顺序一致:LinkedHashSet
3.双列:Map
-
键无序:HashMap
-
键排序:TreeMap
-
键插入和取出顺序一致:LinkedHashMap
-
读取文件Properties