卷妹带你回顾Java基础每日更新Day12
👩💻博客主页:京与旧铺的博客主页
✨欢迎关注🖱点赞🎀收藏⭐留言✒
🔮本文由京与旧铺原创,csdn首发!
😘系列专栏:java学习
👕参考网站:牛客网
💻首发时间:🎞2022年8月22日🎠
🎨你做三四月的事,八九月就会有答案,一起加油吧
🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦
🎧最后的话,作者是一个新人,在很多方面还做的不好,欢迎大佬指正,一起学习哦,冲冲冲
💬推荐一款模拟面试、刷题神器👉
🛒导航小助手🎪
多线程场景下如何使用 ArrayList**?**
ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的
synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样:
为什么 ArrayList 的 elementData 加上 transient 修饰? ArrayList 中的数组定
义如下:
再看一下 ArrayList 的定义:
可以看到 ArrayList 实现了 Serializable 接口,这意味着 ArrayList 支持序列
化。transient 的作用是说不希望 elementData 数组被序列化,重写了 writeObject 实现:
每次序列化时,先调用 defaultWriteObject() 方法序列化 ArrayList 中的非transient 元素,然后遍历
elementData,只序列化已存入的元素,这样既加快了序列化的速度,又减小了序列化之后的文件大
小。
List 和 Set 的区别
List , Set 都是继承自Collection 接口
List 特点:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null
元素,元素都有索引。
Set 特点:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null
元素,必须保证元素唯一性。Set 接口常用实现类是
HashSet、LinkedHashSet 以及 TreeSet。
另外 List 支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,
无法用下标来取得想要的值。
Set和List对比
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位
置改变
Set**接口**
说一下 HashSet 的实现原理?
HashSet 是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为
PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层
HashMap 的相关方法来完成,HashSet 不允许重复的值。
HashSet**如何检查重复?HashSet是如何保证数据不可重复的?**
向HashSet 中add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles 方法
比较。
HashSet 中的add ()方法会使用HashMap 的put()方法。
HashMap 的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为 HashMap 的key,并且
在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V。所以不会重复( HashMap
比较key是否相等是先比较 hashcode 再比较equals )。
- 点赞
- 收藏
- 关注作者
评论(0)