Java集合面试一文搞定----源码层面解析

一、框架

二、迭代器

顶级接口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中的某个值为某个值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值