一、框架
二、迭代器
顶级接口Iterator中有返回一个迭代器的实例
所以它下面的继承和实现都拥有迭代器
hasNext() //是否有下一个元素
next() //下移,然后返回这个元素
remove() //移除元素
三、ArrayList
底层是数据实现,是一个叫elementData的数组,Object类型
使用transient修饰,不会被序列化
创建对象时若使用无参构造,大小为0,首次扩容到10,第二次开始1.5倍
若指定了大小,则扩容为1.5倍
list.add(100); // 执行添加
步骤:
1、add源码中
先进行扩容的判断
获取最小容量(无指定数组大小的为10)
最小容量 - 实际大小 > 0
若小于0则扩容
2、给elementData[size++]赋值然后下标++
3、返回true
扩容的详细机制:
1、记录旧的大小old
2、新的大小new = old + old>>2 //old+old/2,相当于1.5倍
3、比较new和old的大小,够不够用,还不够的话直接用old的大小
4、调用Array.copyOf()扩容到新大小
copyOf(数组,大小):拷贝数组,超过原数组长度的部分填null,扩容的时候能保留原先数组的数据
注意:每次add都要判断需不需要扩容
四、Vector
底层是数组实现,是一个叫elementData的数组,Object类型,protected修饰
操作方法带有synchronized,线程安全
扩容算法稍微变动:
若没有指定大小,初始值为10,按2倍扩容(old+old)
若指定了大小,则 新大小 = old+new
五、LinkedList
底层是链表实现,双向链表
add方法内,三个变量,first,last,节点L
remove()方法有三个,参数不同
删除的实现利用了GC垃圾回收
六、HashSet
数组+链表+红黑树 实现(垂直立体式停车场)
特点:不重复,无序(存和取得顺序不同)
底层是HashMap
步骤:
1、new HashMap,初始化因子(0.75),创建一个为null的数组
2、执行add()方法
调用的是map.put(你的值,固定占位new Object)
3、执行put()方法
①计算哈希值,使用hashcode右移>>16来计算出来的;
4、执行putVal()方法
①如果数组为空,第一次扩容,大小为16,没人的坑位补null
②开始塞数据进数组,根据刚刚根据key计算出来的哈希值判断,该坑位有没有人
③若没人,直接new(参数包括key,hash,下一个节点等),塞进去
④若有人,判断是不是指向同一个坑位 || 判断里面值是否相同(使用equals方法,可被重写),不能加入
⑤若有人,再判断一下是不是红黑树
⑥都不是的话 就是链表了,使用for循坏检查是否相同,有相同的就走,没有相同的就追加链表屁股后面
⑦追加之后,立即判断链表长度
⑧返回null即为成功;返回一个查询结果说明这坑有人了,失败
此方法运用了模板方法设计模式,内有一个空方法,字类可以重写该方法以达到自定义链表(可以弄成有序)
扩容机制:2倍
若链表超过八个,但数组没到64,则扩容数组;若两个都超了,就树化。
这里有一个预扩容的计机制,不是说满了才扩容,而是到一定量(75%)的时候会进行再一次扩容
注意:每次添加节点(无论链表还是数组)都会size++,应该拿这个size去和75%比较
七、LinkHashSet
数组+双向链表 实现
是HashSet和Set的部下
底层是LinkHashMap
可以保证存和取的数据顺序一致(通过节点before和after控制顺序)
主要变量:before、after、key、value、hash、next
①before、after负责双向的实现
②next负责同一个哈希值下同一个链表
与HashSet相似的机制
不同点:数组中存的数据的类型不同,因为要双向链表,多一些变量
八、Map
特点:
①key不能重复
②相同key会覆盖value
③k-v的形式存储
④value可重复
⑤key和value都可以为null,但只能由一个key为null
k-v装在node中,为了方便遍历,会将node转成大哥EntrySet类型,然后在EntrySet中存放k-v,key用Set集合存,v用Collection存,浅复制
假设有一个map,通过entrySet来获取k-v
Set entrySet = map.entrySet();
Map.Entry m = (Map.Entry) entry;
m.getKey;
m.getValue();
九、HashMap
看HashSet,几乎一样
不一样的是,添加重复的会覆盖之前的
十、TreeSet
底层十TreeMap
与HashSet最大的特点,支持排序
当使用无参构造器创建TreeSet,自然排序(无排序)
可以使用有参的构造器,传入一个比较器来构建TreeSet
此比较器我们可以自己创建,然后重写compare方法自定义
compare()方法返回一个int。
代表权重,按权重排序
十一、Collections工具类
提供了多个方法对集合进行操作
reverse反转,sort排序(升降),swap(list,i,j)指定list中i和j位置互换
max()返回自然排序中最大的,想自定义可以传入一个比较器
min()
frequency()返回出现频率最高的
replaceAll()替换list中的某个值为某个值