网站首页 > java教程 正文
ArrayList部分一共五篇文章了,并且引入了时间复杂度来分析,强烈建议大家一定要按顺序阅读,相关文章分别是:
2、ArrayList底层数组扩容原理 - Java那些事儿
3、时间复杂度 - Java那些事儿
4、三顾ArrayList - Java那些事儿
5、ArrayList的时间复杂度 - Java那些事儿
再次强调,ArrayList是一个普通的类,如果我们开心,可以自己写一个
ArrayList初始化-Java那些事儿 一文发表后,有人私信问我
我们先回顾一下之前的所说过的数组,话不多说,上代码:
老规则,我们继续画一画,加深一下印象,上图:
这个图我们去掉了 ArrayList初始化-Java那些事儿 一文图里那些无用的细节(方法区,常量池等),方便大家看起来清晰,我们用eclipse的debug功能看一下,看是否与我们图上画的一致
再看一下执行结果,也在我们期望中
好,我们改一下代码,再往数组里加添加一个叫“周八”的person对象
执行一下
看到了传说的中数组下标越界异常。在Java中,数组一但在堆内存中创建,长度是固定的。
既然是固定的,那我们要往数组里加一个“周八”用户怎么办?没办法,只能重新new长一点的新的数组,把原来数组的元素复制过去,好吧,开始写代码吧,相信大家都会写
把老数组的元素循环一下,赋值给新的数组,很简单也很清晰。debug看一下
“周八”已经有了。以上代码虽然简单,但还不是最优雅的,老鸟一般会这么写,该段代码执行结果和上面那段代码一样
再画个图加深一下印象吧:
此图已用尽我洪荒之力,希望大家以后多想想对象在堆内存中的样子。不枉我一片苦心呀。
看到System.arraycopy()方法是不是似曾相识呢?我们在 ArrayList初始化-Java那些事儿 一文中提了一下,相信看到这里,大家都知道ArrayList里的底层数组扩容是怎么实现的了吧。在 ArrayList初始化-Java那些事儿 一文中,我们知道当ArrayList如果不指定构造个数的话,第一次往里面添加元素时底层数组会初始化一个长度为10的数组,我们再回顾一下昨天的源码,再来看一下ArrayList里的源码,当添加第11个元素时
再看grow()方法
这儿有一段代码:int newCapacity = oldCapacity + (oldCapacity >> 1),>>是移位运算符,相当于int newCapacity = oldCapacity + (oldCapacity/2),但性能会好一些
本文开始那个问题,到这儿就解决了,这就是数组的扩容,一般是oldCapacity + (oldCapacity >> 1),相当于扩容1.5倍
我们再看一下源码,好简单:
当我们在写代码过程中,如果我们大概知道元素的个数,比如一个班级大概有40-50人,我们优先考虑List<Person> list2 = new ArrayList<>(50)以指定个数的方式去构造,这样可以避免底层数组的多次拷贝,进而提高程序性能。
如果喜欢本系列文章,请为我点赞或顺手分享,您的支持是我继续下去的动力,您也可以在评论区留言想了解的内容,有机会本专栏会做讲解,最后别忘了关注一下我
猜你喜欢
- 2024-10-05 List的用法和实例详解——Java进阶知识讲义系列(四)
- 2024-10-05 从Collection到List:Java集合转换的艺术
- 2024-10-05 小心!"数组"转"集合"的这几个隐藏"bug"
- 2024-10-05 JAVA脱水学习-java数组解析及常用操作
- 2024-10-05 《极简Java新手编程之道》10.2 List集合
- 2024-10-05 字符串拆分数组(字符串拆成列表)
- 2024-10-05 Java中的ArrayList与LinkedList(java linklist和arraylist的区别)
- 2024-10-05 小白学JAVA之——List接口的实现类——ArrayList
- 2024-10-05 「漫步计算机系统」之数据结构与算法(5):Array、List和Map等
- 2024-10-05 每日分享- java 编程中 ArrayList 集合怎么扩容
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)