怎么建立一个网站域名,石家庄站布局图,比较好的海报设计网站,大流量网站开发前言
List、Set、HashMap作为Java中常用的集合#xff0c;需要深入认识其原理和特性。
本篇博客介绍常见的关于Java中List集合的面试问题#xff0c;结合源码分析题目背后的知识点。
关于的Set的博客文章如下#xff1a;
Java进阶#xff08;Set#xff09;——面试时…
前言
List、Set、HashMap作为Java中常用的集合需要深入认识其原理和特性。
本篇博客介绍常见的关于Java中List集合的面试问题结合源码分析题目背后的知识点。
关于的Set的博客文章如下
Java进阶Set——面试时Set常见问题解读 结合源码分析
关于HaseMap的博客文章如下
Java进阶HashMap——面试时HashMap常见问题解读 结合源码分析Java进阶ConcurrentHashMap——面试时ConcurrentHashMap常见问题解读 结合源码分析 多线程CAS比较并交换 初识
其他相关的List的文章合集如下 手动实现ArrayList 源码的初步理解分析 数组插入数据和删除数据的问题 Java学数据结构1——抽象数据类型ADT 表List、栈Stack和队列Qeue 目录 前言引出ArrayList 如何扩容的/ArrayList的大小是如何自动增加的1.add添加第一个元素2.添加第11个元素时 如何复制某个ArrayList到另一个Arraylist中去厘清概念深浅拷贝复制的方法 在索引中ArrayList的增加或者删除某个对象的运行过程效率很低吗解释一下为什么效率确实低源码arraycopy方法 现在我有一个很大的数组需要拷贝原数组大小是 5k请问如何快速拷贝如何获得一个线程安全的ArrayList集合Collections.synchronizedList源码分析 LinkedList 和 ArrayList 该如何选择选择原则LinkedList源码node节点 Vector 集合总结 引出 1.ArrayList如何扩容1.5倍 2.ArrayList如何拷贝深拷贝浅拷贝 3.ArrayList的增加或者删除效率低arraycopy方法 4.指定长度创建ArrayList对象避免频繁扩容 5.线程安全的ArrayList集合Collections.synchronizedList 6.LinkedList 和 ArrayList 该如何选择ArrayList增删效率低查询效率高LinkedList 查询效率低增删效率高 7.Vector 集合和 ArrayList 区别Vector扩容机制为原始的2倍线程安全
ArrayList 如何扩容的/ArrayList的大小是如何自动增加的
ArrayList初始化的时候若没有给定长度则默认调用无参构造 此处elelmentData为ArrayList底层数组后面DEFAULTCAPACITY_EMPTY_ELEMENTDATA 为常量数组初值为空即长度为0 1.add添加第一个元素
当执行add方法添加第一个元素时执行下面的代码 此处涉及到两条代码
ensureCapacityInternal方法内会调用calculateCapacity方法此处才是赋予数组长度为10 ensureCapacityInternal 方法 calculateCapacity方法 private static int calculateCapacity(Object[] elementData, int minCapacity) {//如果数组是空的if (elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//返回数组的容量DEFAULT_CAPACITY10return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}此时集合可以添加默认的10个元素
2.添加第11个元素时
当添加第11个元素时ensureExplicitCapacity方法中minCapacity为11而原数组长度为10所以if结构进入grow方法-扩容核心方法 ensureExplicitCapacity方法 grow方法-扩容核心方法 private void grow(int minCapacity) {// overflow-conscious code//把旧的长度赋值给oldCapacityint oldCapacity elementData.length;//新的长度就旧的长度*1.5int 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);}oldCapacity赋值为原数组长度为10 newCapacity赋值为原长度1.5倍即15 调用复制数组方法将之前的数组复制到新的数组中并将需要添加的元素加到数组最后一位完成扩容
如何复制某个ArrayList到另一个Arraylist中去
重写clone方法ArrayList克隆 厘清概念深浅拷贝
Java进阶4——结合类加载JVM的过程理解创建对象的几种方式new反射Class克隆clone拷贝序列化反序列化 浅拷贝虽然返回一个元素一样的ArrayList复制的是元素的引用即其中一个改变了元素另一个也会跟着改变
两个集合中间存储了同一份元素的引用
例如
深拷贝重写clone方法利用迭代器iterator或遍历集合重新创建引用对象逐个添加
例如 复制的方法 list.clone() clone.addALl(list); Collections.copy(clone,list); 在索引中ArrayList的增加或者删除某个对象的运行过程效率很低吗解释一下为什么
效率确实低
效率是很低的因为ArrayList无论是增加或者删除某个对象我们都要通过对数组中的元素进行移位来实现。
增加元素时我们要把要增加位置及以后的所有元素都往后移一位先腾出一个空间然后再进行添加。删除某个元素时我们也要把删除位置以后的元素全部元素往前挪一位通过覆盖的方式来删除。
而这种移位就需要不断的arraycopy是很耗时间的所以效率自然也很低。
源码arraycopy方法 增加元素时 删除元素时 现在我有一个很大的数组需要拷贝原数组大小是 5k请问如何快速拷贝
指定长度创建ArrayList对象避免频繁扩容
如何获得一个线程安全的ArrayList集合
Collections.synchronizedList
ListObject datas Collections.synchronizedList(new ArrayList());源码分析 从源码可以看到集合操作都加了synchronized 关键字保证了在同一时刻数组和链表只会被一个线程所修改。
LinkedList 和 ArrayList 该如何选择
选择原则
ArrayList 底层为数组在增加和删除元素时会频繁的调用arraycopy所以查询效率高增删效率低LinkedList 底层为链表故查询效率低但增删效率高。
LinkedList源码node节点 item 为当前元素next指向下一个元素若为最后一个则为nullprev指向上一个元素若为第一个则为null Vector 集合
vector 和 ArrayList 基本一样区别在于 vector扩容机制为原始的2倍ArrayList为之前的1.5倍vector 是线程安全的ArrayList是非线程安全的 总结
1.ArrayList如何扩容1.5倍 2.ArrayList如何拷贝深拷贝浅拷贝 3.ArrayList的增加或者删除效率低arraycopy方法 4.指定长度创建ArrayList对象避免频繁扩容 5.线程安全的ArrayList集合Collections.synchronizedList 6.LinkedList 和 ArrayList 该如何选择ArrayList增删效率低查询效率高LinkedList 查询效率低增删效率高 7.Vector 集合和 ArrayList 区别Vector扩容机制为原始的2倍线程安全