1.ArrayList详解及扩容源码分析
2.arraylist线程安全吗(java中list线程为何不安全)
3.《面试1v1》List
4.Hadoop 的接口t接 Lists.newArrayList和正常的 new ArrayList()有什么区别?
ArrayList详解及扩容源码分析
在集合框架中,ArrayList作为普通类实现List接口,源码用方如下图所示。口常 它实现了RandomAccess接口,接口t接表明支持随机访问;Cloneable接口,源码用方表明可以实现克隆;Serializable接口,口常镜像 克隆 源码表明支持序列化。接口t接 与其他类不同,源码用方如Vector,口常ArrayList在单线程环境下的接口t接线程安全性较差,但适用于多线程环境下的源码用方Vector或CopyOnWriteArrayList。 ArrayList底层基于连续的口常空间实现,为动态可扩展的接口t接顺序表。一、源码用方构造方法解析
使用ArrayList(Collection c)构造方法时,口常传入类型必须为E或其子类。二、扩容分析
不带参数的海淀和通州源码构造方法初始容量为,此时底层数组为空,即`DEFAULT_CAPACITY_EMPTY_ELEMENTDATA`长度为0。 元素添加时,默认插入数组末尾,调用`ensureCapacityInternal(size + 1)`增加容量。 若当前容量无法满足增加需求,计算新的容量以达到所需规模,确保添加元素成功并避免频繁扩容。三、常用方法
通过List.subList(int fromIndex, int toIndex)方法获取子列表,修改原列表元素亦会改变此子列表。四、遍历方式
ArrayList提供for循环、foreach循环、迭代器三种遍历方法。五、缺陷与替代方案
ArrayList基于数组实现,林州网页制作源码插入或删除元素导致频繁元素移动,时间复杂度高。在需要任意位置频繁操作的场景下,性能不佳。 因此,在Java集合中引入了更适合频繁插入和删除操作的LinkedList类。 版权声明:本文内容基于阿里云实名注册用户的贡献,遵循相关协议规定,包括用户服务协议和知识产权保护指引。发现抄袭内容,可通过侵权投诉表单举报,确保社区内容健康、合规。arraylist线程安全吗(java中list线程为何不安全)
首先说一下什么是线程不安全:线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,内部构建核心源码其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
如图,List接口下面有两个实现,一个是ArrayList,另外一个是vector。 从源码的角度来看,因为Vector的方法前加了,synchronized 关键字,也就是同步的意思,sun公司希望Vector是线程安全的,而希望arraylist是高效的,缺点就是另外的优点。
说下原理(百度的网站域名源码交流,很好理解): 一个 ArrayList ,在添加一个元素的时候,它可能会有两步来完成:1。 在 Items[Size] 的位置存放此元素;2。 增大 Size 的值。在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。
但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。
然后线程A和线程B都继续运行,都增加 Size 的值。那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。示例程序:。
《面试1v1》List
面试官:小伙子,听说你对Java集合挺在行的?
候选人:谢谢夸奖,我对Java集合还在学习中,只能算入门水平。特别是List这个接口,其下的实现类功能非常丰富,我还未能全部掌握。
面试官:那么,简单介绍下List这个接口及常用实现类吧!这是Java集合的基础,也是日常开发中最常用的。
候选人:List接口表示一个有序集合,它的主要实现类有ArrayList、LinkedList、Vector等。它们都实现了List接口,有一些共同的方法,但底层数据结构不同,所以在不同场景有不同的使用优势。这取决于应用的需求。
面试官:那日常工作用的最多的是哪个实现类?它的源码能不能讲解一下?
候选人:我日常工作中最常用的List实现类就是ArrayList。它的源码如下:
ArrayList底层采用动态数组实现,通过ensureCapacityInternal()方法动态扩容,以达到在保证查询效率的同时,尽量减小扩容带来的性能消耗。这也是我在日常使用中最欣赏ArrayList的地方。当然,它的实现远不止这些,我还在不断学习与理解中。
面试官:不错,你对这些知识已经有一定理解。ArrayList的源码分析得也比较到位。看来你之前真的有认真研读与理解。不过List相关知识还有更广阔的空间,需要你继续努力!
候选人:非常感谢面试官的肯定与指导。您说得对,List及其相关知识还有很多值得我继续学习与探索的地方。我会持续加深理解,提高运用能力。
面试官:那么,你对List还有哪些不太理解的地方?或是想更深入学习的内容?
候选人:关于List,我还不太清楚或想进一步学习的内容如下:
这些都是我想进一步学习与理解的List相关内容与知识点。我会根据这份清单继续深入阅读源码、分析案例并实践使用,以便全面掌握List及其相关接口与实现类。这无疑需要一段长期的学习与总结过程,但这正是我成长为一名资深Java工程师所必须经历的阶段。
面试官:Wonderful!这份学习清单涵盖的内容非常全面且具有针对性。你能够准确定位自己尚未完全掌握的知识点,这展现出你的自我认知能力。只要你能够有计划和耐心地向这个清单上的每一项知识点进发,你在List及相关接口的理解上一定会有大的提高,这也为你成长为资深工程师奠定基础。我对你的学习态度和理解能力很为欣赏。
最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer。如果您对这个系列感兴趣,可以关注公众号JavaPub追更!
《面试1v1》系列文章涵盖了Java基础、锁、数据结构与算法、Mybatis、搜索LuceneElasticsearch、Spring、Spring Boot、中间件、zookeeper、RocketMQ、Prometheus、流程引擎、Redis、Docker、sql、设计模式、分布式、shell等主题。您可以在Gitee或GitHub上找到更多资源。如果您需要PDF版的干货,可以访问指定链接进行下载。希望这些资源能帮助您更好地准备面试,实现职业目标!
Hadoop 的 Lists.newArrayList和正常的 new ArrayList()有什么区别?
这个方法在google工具类中也有,源码内容如下public static <E> ArrayList<E> newArrayList() {return new ArrayList();
}
内容是差不多的,唯一的好处就是可以少写泛型的部分。
这个方法有着丰富的重载:
Lists.newArrayList(E... elements)Lists.newArrayList(Iterable<? extends E> elements)
Lists.newArrayList(Iterator<? extends E> elements)
还有很多前缀扩展方法:
List<T> exactly = Lists.newArrayListWithCapacity();List<T> approx = Lists.newArrayListWithExpectedSize();
使得函数名变得更有可读性,一眼就看出方法的作用。
但是查看源码发现官方的注解里头是这么写的:
Creates a mutable, empty ArrayList instance (for Java 6 and earlier).
创建一个可变的空ArrayList(适用于java 6及之前的版本)
Note for Java 7 and later: this method is now unnecessary and should
be treated as deprecated. Instead, use the ArrayList constructor
directly, taking advantage of the new "diamond" syntax.
针对java 7及之后版本,本方法已不再有必要,应视之为过时的方法。取而代之你可以直接使用ArrayList的构造器,充分利用钻石运算符<>(可自动推断类型)。
2024-12-28 12:53
2024-12-28 12:36
2024-12-28 12:27
2024-12-28 12:26
2024-12-28 12:00
2024-12-28 11:29