在JDK7中ArrayList有一个小的改动,使用延迟加载的思想,默认构造函数不再初始化生成一个大小为10的数组,而是将elementData先赋值为一个共享的空数组。

package java.util;

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable { private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; private transient Object[] elementData;
private int size; public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
} // snipped
}

数组加载的时间延迟到了实际添加元素的时候。实际添加的时候,会去统一调用一个内部方法ensureCapacityInternal,判断elementData是否还等于默认值,如果还等于默认值就计算一个扩容量,并进行扩容。

private void ensureCapacityInternal(int minCapacity) {
    if (elementData ==大专栏  从ArrayList的优化中想到的an> DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }     ensureExplicitCapacity(minCapacity);
}

这个改动对于我们自己常写的那些随便new一个列表的懒代码来说,提升了很多性能。要知道之前的ArrayList总是默认就new Object[10]。

这本身不是一件大事,算法思路也很简单,但是触发了我的一些思考。

心态的差距

延迟初始化这种东西谁都会,我自己也经常用。ArrayList默认构造一个空间为10的数组,很多人都知道,没人说不好。我看见过不少次,作为常识记下来了,从没思考过是否合理,是否能改进。但现在他们又做了如此简单清晰的改进。让我感触很深,比起技术上的差距,心态上差距更大。从没想过自己有可能,就没可能了。

对于细节的优化总是存在

ArrayList已经是经历万代的数据结构了,居然还能迎来优化的修改。对于一个已经达到需求标准的代码,我们是否也能这样扣到每一个细节呢。反观项目里的那些随随便便的new,拷贝,通用数据结构的滥用。对比人家微雕般的手艺,我们自己就像是在工地开拖拉机铲土。事实上,一段频繁使用的代码,即使一行的改进带来的收益都会是巨大的。

基础知识和趋于平庸

刚毕业的时候通过刷题找工作,工作了之后往往发现算法、数据结构并没有人在乎。多年往后,又会拿起书本。常用的容器用多了就会产生它是唯一选择的错觉。面试的时候都说得出链表和数组的区别,可实际使用的时候谁还关心呢,还不都顺手写上new ArrayList<>()。确实对于一个大项目来说,一个临时变量用什么类型的容器来存储并不影响什么。但是对于性能的敏感性和自我要求也会在这些妥协中慢慢消失。所有的数据结构归为ArrayList和HashMap,所有的算法都是遍历查找。

没事的时候刷刷leetcode,看看框架源码,多读书。

从ArrayList的优化中想到的的更多相关文章

  1. 转:浅谈CSS在前端优化中一些值得注意的关键点

    前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...

  2. ArrayList源码中EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别

    2018年7月22日09:54:17 JDK 1.8.0_162 ArrayList源码中EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别 ...

  3. django缓存优化中caches参数如何配置?

    在python开发中,如果运营django进行编写,为了提升效率,常常需要优化缓存,缓存优化中必须掌握的caches参数相关知识: CACHES 配置参数概述 - 格式 CACHES 字典配置格式如下 ...

  4. Cocos2d-x优化中纹理优化

    转自 http://blog.csdn.net/tonny_guan/article/details/41016241 Cocos2d-x优化中纹理优化 1.纹理像素格式纹理优化工作的另一重要的指标是 ...

  5. 网站SEO优化中内部链接的优化

    重要性:内链有效的优化能够间接的提高某页面的权重达到搜索排名靠前的效果.同时有效的带领搜索引擎蜘蛛对整站进行抓取. 网站头部导航: 这个导航称为'网站主导航',当用户来到网站需要给他们看到的内容.也就 ...

  6. 网站静态化处理—web前端优化—中(12)

    网站静态化处理—web前端优化—中(12) Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原 ...

  7. MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?

    本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的 ...

  8. 拓扑优化中SIMP方法与水平集方法有何优缺点,水平集法变换到高维,不是更复杂了

    作者:周平章链接:https://www.zhihu.com/question/52008623/answer/187927508来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  9. 使用Arraylist将数组中元素随机均等乱序分为N个子数组

    使用Arraylist将数组中元素随机均等乱序分为N个子数组 觉得有用的话,欢迎一起讨论相互学习~Follow Me 为了将数组中的元素 随机地 ,均等地, 不重复地 ,划分到N个子数组中 使用Arr ...

随机推荐

  1. C语言 指针在函数传参中的使用

    int add(int a, int b)   //函数传参的时候使用了int整型数据,本身是数值类型.实际调用该函数时,实参将自己拷贝一份,并将拷贝传递给形参进行运算.实参自己实际是不参与运算的.所 ...

  2. [YNOI2018]五彩斑斓的世界&CF896E(分块+并查集)

    由于晚上比赛二连(Atcoder&codeforces),外加复习学考,所以暂时没时间写了. 贴个O(n√n)的分块代码,洛谷和cf上都过了,但垃圾bzoj卡不过去,不改了. #include ...

  3. 关于UDP通信的参考目录

    1.IP头,TCP头,UDP头,MAC帧头定义 2.深入理解TCP/UDP通信原理 其内部有提到关于wireshark抓包分析工具的使用 3.udp通讯中的connect()和bind()函数 其中有 ...

  4. 模仿u-boot的makefile结构

    u-boot(2014.04)是通过顶层makefile调用各子目录中的makefile来实现整个工程的编译的,实际上子目录的makefile是include进来的.这里仿照这种结构写个模板测试一下. ...

  5. 40)类与类之间的关系(has use is)

    1)类与类之间的关系  一般就是三类: ①has--A ②use--A ③is-----A ①has--A  包含关系,用以描述一个类由多个“部件构成”.实现has--A关系用类成员表示,  即一个类 ...

  6. 使用xb文件恢复mysql数据

    1.安装工具Percona XtraBackup MySQL 5.6及之前的版本需要安装 Percona XtraBackup 2.3,安装指导请参见官方文档Percona XtraBackup 2. ...

  7. 【网络流+贪心】Homework

    题目描述 Taro is a student of Ibaraki College of Prominent Computing. In this semester, he takes two cou ...

  8. hibernate 持久化对象 save

    hibernate 持久化对象 save new出来的user对象是游离状态的对象,执行session.save()方法保存后,user对象就变为持久化了,持久化的对象跟数据库表双向绑定的意思, 对象 ...

  9. log4j中%5p的含义

    因为日志级别分别有error,warn,info,debug,fatal5种,有些是5个字母的,有些是4个字母的,如果直接写%p就会对不齐,%-5p的意思是日志级别输出左对齐,右边以空格填充,%5p的 ...

  10. mybatis分页插件PageHelper简单应用

    --添加依赖 <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --><depende ...