大家好,我是IT修真院郑州分院第8期学员,一枚正直善良的java程序员。今天给大家分享一下,修真院官网 java任务中可能会使用到的知识点:


ArrayList浅析


width="640" height="498" src="https://v.qq.com/iframe/player.html?vid=b0770ww5e8a&tiny=0&auto=0" allowfullscreen="">

【修真院java小课堂】ArrayList浅析20180829

1.背景介绍

  • ArrayList就是动态数组,用MSDN中的说法,就是Array的复杂版本
  • ArrayList提供了动态的增加和减少元素,实现了Collection和List接口,可以灵活的设置数组的大小。
  • 要注意的是ArrayList并不是线程安全的,因此一般建议在单线程中使用ArrayList。

2.知识剖析

2.1 ArrayList重要的方法和特性

  • 构造器

    • ArrayList():构造一个初始容量为10的空列表。这个10在源码中没找到,但是在jdk官网找到了
    • https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList()
    • ArrayList(Collection c):按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。
    • ArrayList(int initialCapacity):构造具有指定初始容量的空列表。

2.2 ArrayList线程不安全

  • 如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则 必须在外部进行同步。

2.3 其他方法

  • add()、set()、clear()
  • 对于代码中的资源其实无外乎也是 创建、销毁、增删改查
  • 其实就目前来说,基本上我们对数据库(持久化资源)以及代码中的某个对象所作的操作都是上边说的
  • 个人感觉:所有的操作其实都是在对资源进行操作,创建–>增删改查–>销毁

3.常见问题

3.1 ArrayList的使用建议

  • ArrayList是基于数组实现的,而LinkedList是基于链表实现的;
  • 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素
  • 链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。搜索不易
  • 如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组,也就是ArrayList;
  • 如果应用需要经常插入和删除元素你就需要用链表数据结构了,也就是LinkedList。

* 3.2 关于面试中的几个问题*

  • ArrayList的大小是如何自动增加的?你能分享一下你的代码吗?

    • 这是最有技巧性的的一个问题,大多数人都无法回答。事实上,当有人试图在arraylist中增加一个对象的时候,Java会去检查arraylist,以确保已存在的数组中有足够的容量来存储这个新的对象。如果没有足够容量的话,那么就会新建一个长度更长的数组,旧的数组就会使用Arrays.copyOf方法被复制到新的数组中去,现有的数组引用指向了新的数组。可以看源码
  • 如何复制某个ArrayList到另一个ArrayList中去?写出你的代码?

    • 1.使用clone()方法,比如ArrayList newArray = oldArray.clone();
    • 2.使用ArrayList构造方法,比如:ArrayList myObject = new ArrayList(myTempObject);
    • 3.使用Collection的copy方法。

4.编码实战

  • 简单看下源码以及使用
  • 具体见视频

5.扩展思考

5.1 ArrayList扩容

  • ArrayList是动态的,那么就允许增长自身的长度,这种情况下必须有扩容机制存在
  • 按照当前容量的1.5倍扩容,直接看源码(见视频)

6.参考文献

https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
http://www.cnblogs.com/rickie/articles/67978.html
https://blog.csdn.net/xiaodaiye/article/details/50818966
https://www.cnblogs.com/kuoAT/p/6771653.html


7.更多讨论

Q:ArrayList是线程不安全的,那么想保证线程安全应该用什么?
A:Vector类的所有方法都是同步的,可以由多线程安全的访问一个Vector对象

Q:ArrayList删除的速度较慢,为什么?
A:因为ArrayList在删除的时候,需要将该元素之后的所有元素全部往前移,也就是说除了删除这个元素之外,还需要做很多额外的操作,所以耗时较久

Q:ArrayList的容量必须满足1.5倍扩容么?
A:是的,因为源码中已经写死了相关机制。

    //以下为源码private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;//分析这一步,就可以得出新容量值是旧容量值的1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);}

PPT在这里

感谢大家观看!

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

技能树.IT修真院

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。

快来与我一起学习吧~http://www.jnshu.com/login/1/22140638

【修真院java小课堂】ArrayList浅析相关推荐

  1. 【修真院Java小课堂】Annotation注解

    标题: [修真院Java小课堂]Annotation注解 开场语: 大家好,我是IT修真院西安分院第三期学员,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务七,深度思考中 ...

  2. 【修真院JAVA小课堂】redis缓存集群简单介绍

    大家好,我是IT修真院郑州分院第11期的JAVA学员,一枚正直纯洁善良的java程序员. 今天给大家分享一下,redis缓存集群简单介绍. 1.背景介绍 redis是一个key-value存储系统.和 ...

  3. 【修真院java小课堂】clean,install,package,deploy分别代表什么含义?

    大家好,我是IT修真院成都分院第12期学员,一枚正直善良的java程序员. 今天给大家分享一下,修真院官网java任务一中可能会使用到的知识点: clean,install,package,deplo ...

  4. 【修真院JAVA小课堂】什么是压测,为什么要进行压力测试?JMETER工具的使用

    大家好,我是IT修真院郑州分院第11期的JAVA学员,一枚正直纯洁善良的java程序员. 今天给大家分享一下,什么是压测,为什么要进行压力测试?JMETER工具的使用. 1.背景介绍 压测,即压力测试 ...

  5. 【修真院Java小课堂】Tiles框架简单介绍

    大家好,我是IT修真院上海分院第6期的学员,一枚正直纯洁善良的程序员 今天给大家分享一下,Tiles框架简单介绍 Tiles框架简单介绍 背景介绍 什么是Tiles Tiles 是一种JSP布局框架, ...

  6. 【修真院WEB小课堂】定时器有哪些用法?

    这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [定时器有哪些用 ...

  7. 【修真院pm小课堂】详谈用户体验五要素

    [修真院pm小课堂]详谈用户体验五要素 用户体验五要素在产品的工作中经常听到,那么他究竟是什么呢?怎样去使用呢? 一.战略层 明确商业目标和用户目标,解决两者之间的冲突,找到平衡点,确定产品原则和定位 ...

  8. 【修真院web小课堂】请描述 BFC(Block Formatting Context) 及其如何工作

    请描述 BFC(Block Formatting Context) 及其如何工作 小课堂[北京-WEB-A组] 分享人:要来点本子吗 大家好,我是IT修真院北京分院第35期的学员,一枚正直.纯洁.善良 ...

  9. 【修真院web小课堂】angular js常用指令 ng-blur、ng-change、ng-focus、ng-disabled是如何运用到表单验证中的?

    大家好,我是IT修真院武汉分院web第16期的学员孟晨,一枚正直纯洁善良的web程序员 今天给大家分享一下,修真院官网js(职业)任务八,深度思考中的知识点--angular js常用指令 ng-bl ...

最新文章

  1. java解析页面table表格内容导出为excel
  2. js碎片知识的学习与补充(parseint与ChildNodes属性)
  3. WSS中的SPSite和SPWeb为什么需要释放内存,如何快速发现代码中的未释放内存
  4. python用format保留三位小数_关于Python 保留小数使用format、%、round()、Decimal函数及format和%只能保留到六位问题...
  5. RouterModule.forRoot() called twice
  6. node --- 模块化连接MongoDB数据库的参数设置方案之一
  7. SpringCloud的GateWay网关中怎么debug得到真实的路由地址
  8. 补偏救弊 | 关于一致性读与语句性能关系的一大误区
  9. AndroidStudio安卓原生开发_UI高级_DrawerLayout_侧滑菜单控件---Android原生开发工作笔记120
  10. Leetcode 410.分割数组的最大值(最优解是二分法)
  11. [MVC学习笔记]4.使用Log4Net来进行错误日志的记录
  12. 责任分配矩阵和raci的区别_数字音频处理器和调音台的区别是什么
  13. mysql的索引是什么数据结构_mysql索引的数据结构是什么
  14. 如何理解邮件中的“CC、PS、FYI”等英文缩写?
  15. H264视频传输、编解码----H264数据结构
  16. 上帝模式代码_生产代码中的上帝模式
  17. keil startup_stm32f10x_hd.s编译报错
  18. 一起学爬虫(Python) — 10
  19. 人机问答系统的前世今生
  20. ssm学生请假管理小程序

热门文章

  1. 科技版“传音入密”:音频聚光灯现在怎么样了?
  2. 着色器实例 代码+注释 更新中【描边、卡通渲染、法线颜色、贴图动画等等】
  3. 空客设立多个零碳研究机构 致力设计制造氢动力飞机
  4. charles ios设备 https代理配置
  5. 计算机内存清理原理,五步就能“彻底清理”你的电脑内存!
  6. 计算机专用英语词汇1500词打印,计算机专用英语词汇1500词(4)
  7. 鸿蒙智能家居市场,荣耀智慧屏杀入彩电市场 重在智能家居 不把红海做成血海...
  8. 互联网日报 | iPhone 12系列手机正式发布;盒马入局火锅市场;东风汽车A股IPO申请获受理...
  9. 我们该给世界留下些什么?——兼谈文艺复兴
  10. 用 Nginx 禁止国外 IP 访问我的网站...