java集合之Collection集合

文章详细介绍了Java集合类中的List、Set和Map接口的主要实现类,如ArrayList和LinkedList的底层结构及扩容策略,HashSet和LinkedHashSet的区别,以及HashMap、TreeMap的数据结构变化。针对不同场景,给出了使用建议。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

java面试中,集合类是面试高频、重灾区,有很多面试者都倒在这一关,导致没有面上或者没有达到自己的待遇。所以集合类的底层尤为重要。


一、JAVA集合类有哪些?

Java集合类有两大接口体系:Collection和Map,今天主要先了解下Collection集合。

二、集合介绍

1.List

特点:
1.底层是数组
2.可重复
3.有序
4.由Object[]构成
源码分析之ArrayList:
jdk7:初始化容量为10数组。扩容:size>长度时:
扩原容量1.5倍,原数组拷贝给新数组
结论:建议开发中使用带参的构造器。
jdk8:初始化数组为{},首次add时,创建容量为10的数组。 后续扩容和 1.7一致。
结论:jdk8更加节约内存资源。大部分场景下使用ArrayList
源码分析之LinkedList:
底层是链表: 前驱+后继+数据。 增删方式比较方便
不涉及扩容
结论:增删较多场景下使用。

2.Set

特点:
1.无序
2.不可重复
3.有HashMap<Object,Value> 构成。Value为固定值。

源码分析之HashSet
初始化长度为16
add时。计算出数据对应数组的位置后插入。首先计算数据的hashcode,如果相同,调用equals方法判断,如果再次一致,则视为同一对象,不添加。
在同一角标位置,遇到不同的元素,在进行添加时。jdk1.7将原有位置让给新元素,执行旧元素。jdk1.8原位置元素指向新元素。

LinkedHashSet:和HashSet基本一致,不过遍历顺序和添加顺序一致。因为底层多出了两个指针引用,因为是链表结构。所以会有顺序。但是存储顺序依旧随机,也是不能重复的。

TreeSet自带比较器,有两种方式实现。第一种使得比较元素自带比较方式。第二种构建比较器,通过参数的方式给TreeSet。

3.Map

HashMap、LinkedHashMap、Hashtable、TreeMap
底层是 Entry[] 一个k,v键值对就是一个Entry结构。
jdk1.7下数据结构是 Entry[]+链表
jdk1.8下数据结构是 Entry[]+链表+红黑树
jdk1.7下
当执行put(k,v)时,会计算k的hashcode值,然后根据算法得出相应角标位置。
1、当前位置没有元素。直接添加
2、当前位置有元素(1个或多个),拿着k和所有该位置元素进行比较。如果k的hashcode和所有元素的都不相同,添加成功
3、当出现某个元素的hashcode值相同时
equals为false,添加成功
equals为true时,将v替换为相同key对应的value。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

感恩的心_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值