集合Collection
集合,数组-->对多个数据的存储,简称Java容器
大体分为:Collection接口,Map接口两大体系
1.Collection接口通用功能
add,size,addAll,isEmpty,contains,containsAll之流
hashcode,toArrays:集合-->数组,asList:数组-->集合==注意,new int[]这种会认为是一个元素-->写成new Interger
2.迭代器Iterator接口
用于遍历
next,previous理解:在元素之间,next()-->跨过前面这个元素,并返回该元素,previous同理
remove:
3.List接口-->“动态”数组
有序,可重复
3.1ArrayList
线程不安全,效率高,底层Object[]
-
源码分析
//用无参构造器创建
//创建了一个空的elementData
ArrayList arrayList = new ArrayList();
//执行add先ensureCapacityInternal确定是否要扩容
//可以的话给elementData
//minCapacity先确定一个最小容量,第一次为10;
//modCount++记录集合被修改的次数
//elementData容量不够的话,调用grow()方法
初始化
jdk8在创建时先不默认来10个,而是空,在add等操作时候再让其变成10-->懒汉式(线程不安全的原因)
那么我们也知道jdk7就是饿汉式,默认先来10个
扩容grow
提供一个之后期望的值minCapacity-->扩容成为原来1.5 or minCapacity 中间的最大值(新造数组,然后copy)
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
* @throws OutOfMemoryError if minCapacity is less than zero
*/
private Object[] grow(int minCapacity) {
int oldCapacity = elementData.length;
if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
int newCapacity = ArraysSupport.newLength(oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity >> 1 /* preferred growth */);
return elementData = Arrays.copyOf(elementData, newCapacity);
} else {
return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
}
}
private Object[] grow() {
return grow(size + 1);
}
3.2LinkedList
底层双向链表,对于频繁的插入,删除效率高
-
源码分析
底层放在一个个Node中,看一下add-->linkedlast==在最后加一个Node
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
3.Vector
古老,线程安全,效率低,底层Object[]
基本不用了,默认扩2倍,默认先来10个
3.4List常用方法
4.Set接口
无序,不可重复
以HashSet为例
无序:并非随机,根据数据的哈希值排序
不可重复:用equals判断
4.0对于实体类的hashcode重写
4.1HashSet
主要实现类,线程不安全,可以存储null值,底层是HashMap
-
添加元素过程
懒汉,16,保证无序,不可重复:hashcode()即可!equals重写比较的是hashcode()!
hashcode重写-->尽量一致,保证内容相同的对象hashcode相同
添加-->计算这玩意的hashcode-->看看这个位置有没有人,没有就添加进去-->同时保证无序+不可重复
4.2LikkedHahSet
遍历:可以按添加的顺序遍历,每个添加的附加了链表
4.3TreeSet
可以按照添加对象的指定属性进行排序,底层:树
1.添加的数据要由同一个类提供
2.自然排序:实现Comparable接口的,不然就去重写-->比较两个是否相同是通过compareTo方法
3.定制排序:实现Comparator接口的,compare方法
5.Map接口
key-value-->key相当于用set存储:无序,不可重复
5.1HashMap
线程不安全,效率高,可以存储null
※底层实现,源码分析
jdk7:
jdk8:-->懒汉式-->Node[]-->一个索引位置数据大于8,数组长度大于64,改为红黑树存储
源码:
无参构造器-->还没创建,只是定义加载因子0.75
put-->putVal-->第一次?resize-->这个时候16创建-->像上面那样的底层逻辑
5.2HashTable
古老,线程安全,效率低,不可以存储null
5.3TreeMap
可以按照添加的key-value排序(key),底层红黑树
类似-->自然排序+定制排序
6.Collections工具类
###