首页 / 面试 / 面试【JAVA基础】集合类
面试【JAVA基础】集合类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了面试【JAVA基础】集合类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2106字,纯文字阅读大概需要4分钟。
内容图文
![面试【JAVA基础】集合类](/upload/InfoBanner/zyjiaocheng/649/1e463481da0f4533b2a728d015b912d0.jpg)
1、ArrayList的扩容机制
- 每次扩容是原来容量的1.5倍,通过移位的方法实现。
- 使用copyOf的方式进行扩容。
扩容算法是首先获取到扩容前容器的大小。然后通过oldCapacity (oldCapacity >> 1) 来计算扩容后的容器大小newCapacity。这里用到了>> 右移运算,即容量增大原来的1.5倍。还要注意的是,这里扩充容量时,用的时Arrays.copyOf方法,其内部也是使用的System.arraycopy方法。
区别:
- arraycopy()需要目标数组,将原数组拷贝到你自己定义的数组里,而且可以选择拷贝的起点和长度以及放入新数组中的位置。
- copyOf()是系统自动在内部新建一个数组,并返回该数组。
2、数组和ArrayList的区别
- 数组可以包含基本类型,ArrayList成员只能是对象。
- 数组大小是固定的,ArrayList可以动态扩容。
3、ArrayList和LinkedList的区别
- 线程安全
ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; - 数据结构
LinkedList 是基于双向链表实现的,ArrayList 是基于数组实现的。 - 快速随机访问
ArrayList 支持随机访问,所以查询速度更快,LinkedList 添加、插入、删除元素速度更快。 - 内存空间占用
ArrayList的空间浪费主要体现在在list列表的结尾会预留一定的容量空间,LinkedList使用Node来存储数据每个Node中不仅存储元素的值,还存储了前一个 Node 的引用和后一个 Node 的引用,占用内存更多。 - 遍历方式选择
实现了RandomAccess接口的list,优先选择普通for循环 ,其次foreach,
未实现RandomAccess接口的list, 优先选择iterator遍历(foreach遍历底层也是通过iterator实现的),大size的数据,千万不要使用普通for循环。
4、如何创建同步的List
可以通过Collections.sychronizeList将list转换成同步list,或者直接使用CopyOnWriteArrayList。
5、CopyOnWriteArrayList
- 读时不加锁,写入时加锁,写入时创建一个新入组将老数组拷贝进入新数组,并将数据加入新数组。
- 只能保证最终一致性。
6、Vector
ArrayList线程安全的一个版本,底层通过synchronize加锁实现线程安全。
7、HashMap扩容机制
HashMap使用resize()方法来进行扩容,计算table数组的新容量和Node在新数组中的新位置,将旧数组中的值复制到新数组中,从而实现自动扩容。
- 当空的HashMap实例添加元素时,会以默认容量16为table数组的长度扩容,此时 threshold = 16 * 0.75 = 12。
- 当不为空的HashMap实例添加新元素数组容量不够时,会以旧容量的2倍进行扩容,当然扩容也是大小限制的,扩容后的新容量要小于等于规定的最大容量,使用新容量创建新table数组,然后就是数组元素Node的复制了,计算Node位置的方法是 index = (n-1)
内容总结
以上是互联网集市为您收集整理的面试【JAVA基础】集合类全部内容,希望文章能够帮你解决面试【JAVA基础】集合类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。