Java基础——List集合整理(脑图,源码,面试题)
常在知乎牛客网关注Java的一些面试,了解过校招社招常面哪些内容。Java集合不仅使用频率高而且在初面中也常常被问到,何止是常常,关于ArrayList的扩容,HashMap的一些底层等等都被问到烂了。因此,稍微深入学习下集合这部分迫在眉睫。以下为自己的一些知识点总结与网上搜刮来的面试题总结。
1.集合的引入
数组大小固定且只能够存储同一种类型的元素,集合容量可动态改变。
数组能存储基本数据类型和引用类型,集合只能存储引用类型(你存储的是int,会自动装箱成Integer)
2.掌握集合的体系结构
引用自CSDN:https://blog.csdn.net/haovip123/article/details/45423683

3.掌握以ArrayList为代表的增删改查和一些其他API的使用
ArrayList可以说是使用频率很高的集合,掌握以它为代表的常用API的使用,如add,addAll,remove,遍历等。
4.源码分析List集合之ArrayList与Vector的剖析
具体的细节不予多讲,前辈们都在源码的基础上剖析总结的非常细致,在他们的基础上学习即可。附连接
https://blog.csdn.net/panweiwei1994/article/details/76760238
https://blog.csdn.net/panweiwei1994/article/details/77110354
https://blog.csdn.net/zymx14/article/details/78324464
https://juejin.im/post/5ad40593f265da23750759ad
重点小结:
ArrayList集合与Vector集合的区别?
ArrayList与Vecto都实现了List接口,具有元素有序允许重复和为null的特点。底层都采用数组,具有数组增删慢,查询快的特点。主要区别是Vector集合(只做了简单了解)给所有的api都套上了synchronized修饰,所以Vector集合是同步的,在线程上安全的,但有得必有失,失去的是代码在实现同步时间花销大(有些操作你不需要进行同步操作它也给你进行了这是它最大的缺点)。其次在实现动态扩容时,ArrayList是原来的1.5倍而Vector是原来的2倍。
关于ArrayList的扩容是如何实现的原理是什么?
首先明确ArrayList的构造方法有三种,默认的initCapacity容量为10,如果初始化时一开始指定了容量,或者通过集合作为元素,则容量为指定的大小或参数集合的大小。每次扩容为原来的1.5倍,如果扩容后的容量小于所需的最小容量,则数组容量为所需的最小容量。如果扩容后的容量大于所需的最小容量,则数组容量为扩容后的容量。 每次扩容后都要调用arraycopy ,涉及到整个数组的复制和移动。所以要尽量减少扩容的次数提高效率,在数据量比较大的时候初始化时指定容量的大小。

LinkedList的底层与常用方法实现的了解
LinkedList也实现了List接口,有序且允许元素重复和为null值,底层是双向链表,具有链表增删效率高和查询效率慢的特点。虽然它在查询实现时采用了折半查找提高效率的思想,但在查询上还是比不过按索引查的ArrayList.做过单链表,双向链表练习的人应该再看LinkedList源代码感到很熟悉。
5.List集合面试题总结:
结合源代码与上面贴的博客链接认真看完,在回答下面的List集合的面试题就比较自信了。之前有整理过,这次在整理过一遍,答案见:
https://www.cnblogs.com/zengcongcong/p/10805799.html
1.请比较ArrayList集合与Vector的区别?
2.往ArrayList集合加入一万条数据,应该怎么提高效率?
3. ArrayList插入删除一定很慢吗?
4.ArrayList的遍历和LinkedList遍历性能比较如何?
5. ArrayList是如何扩容的\ArrayList是如何实现自动增加的?
6. 什么情况下你会使用ArrayList?什么时候你会选择LinkedList?
7. 如何复制某个ArrayList到另一个ArrayList中去?
8. 在索引中ArrayList的增加或者删除某个对象的运行过程?效率很低吗?解释一下为什么?
9. ArrayList list = new ArrayList(20);中的list扩充_____次。
10.下列代码判读扩容了几次?

每一次的add都要检查容量是否足够,这里使用for循环一个个增加元素,所以扩容过程为20->30->45->67,3次。
11.有如下代码,判断list最后容量的大小。

可知list初始化为5个容量,之后一次性增加15个容量,第一次扩容为10,之后发现15>10,所以15为数组的新容量。调用debug我们可以查看

Java基础——List集合整理(脑图,源码,面试题)的更多相关文章
- java基础,集合,HashMap,源码解析
最怕,你以为你懂咯,其实你还不懂: 见贤思齐,看看那些我们习以为常的集合,通过相关定义.源码,思考分析,加深对其的理解,提高编码能力,能做一个略懂的程序员: 做几个我们常用的集合类.开篇HashMap ...
- java基础,集合,Arraylist,源码解析(基础)
ArrayList 是什么,定义? 这是动态的数组,它提供了动态的增加和减少元素,实现了List接口(List实现Collection,所以也实现Collection接口)灵活的设置数组的大小等好处 ...
- Java基础知识➣集合整理(三)
概述 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个层次. 实现(类) ...
- 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!
前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...
- 第6节:Java基础 - 三大集合(上)
第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...
- Java集合系列[4]----LinkedHashMap源码分析
这篇文章我们开始分析LinkedHashMap的源码,LinkedHashMap继承了HashMap,也就是说LinkedHashMap是在HashMap的基础上扩展而来的,因此在看LinkedHas ...
- java基础-Map集合
java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...
- Java中的容器(集合)之HashMap源码解析
1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...
- 【Java基础】集合
集合 集合概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储.另一方面,使用 Array 存储对象方面具有一些弊端,而 Java 集合就像一种容器 ...
随机推荐
- js对象 事件
对象 创建 var myObject = {};/* 声明对象字面变量*/ 添加值myObject.name="Jener";myObject.age=25; 代码格式 ...
- react 高阶组件之小学版
高阶组件 多么高大上的概念,一般用来实现组件逻辑的抽象和复用,在很多三方库(redux)中都被使用到,但是开发普通有任务项目时,如果能合理使用高阶组件,也会显著的提高代码质量. 我们今天就用最简单的 ...
- js 盒子模型与盒子偏移量
js 盒子模型: 通过js中提供的一系列属性和方法获取页面中元素的样式信息值. 一.client系类—>只读属性不可设置 (当前元素的私有属性,和内容溢出没关系,如果给容器设置了高度,就采用设置 ...
- 关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )
PO 即Persistence Object VO 即Value Object PO 和VO 是Hibernate 中两个比较关键的概念. 首先,何谓VO,很简单,VO 就是一个简单的值对象. 如: ...
- JAVA判断一个对象生存还是死亡
JAVA中判断一个对象是否死亡的算法有两种: 引用计数算法 可达性分析算法 一.引用计数算法所谓引用计数算法就是,给一个对象定义一个引用计数器,每当该对象被引用一次引用计数器就加1,如果一个对象的引用 ...
- STL容器set用法以及codeforces 685B
以前没怎么用过set,然后挂训练赛的时候发现set的妙用,结合网上用法一边学一边写. 首先set是一种容器,可以跟其他STL容器一样用 set<int > s 来定义, 它包含在STL头文 ...
- Web中常见的绕过和技巧
SQL注入 十六进制绕过引号 slect table_name from information_schema.table where table_schema="sqli"; s ...
- Python - Virtualenv 创建虚拟环境
Virtualenv 回到顶部 为了解决各个项目的共同依赖同一个环境,造成版本冲突等,virtualenv创建一个干净的环境,在这个环境下,进行Python项目的开发等,就成为一个个独立的项目,从而避 ...
- POJ 2398 map /// 判断点与直线的位置关系
题目大意: poj2318改个输出 输出 a: b 即有a个玩具的格子有b个 可以先看下poj2318的报告 用map就很方便 #include <cstdio> #include < ...
- vue 图片懒加载v-lazy
搬运自:https://blog.csdn.net/twodogya/article/details/80223331 vue v-lazy官方API:https://www.npmjs.com/pa ...