arraylist底层原理jdk11和1.8区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arraylist底层原理jdk11和1.8区别相关的知识,希望对你有一定的参考价值。
arraylist底层原理jdk11和1.8区别是jdk11表述有误,应为jdk1.7
【1】JDK1.7中的ArrayList底层
package zhai.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ArrayListDemo1
public static void main(String[] args)
// 多态实现 使用前两种方式进行创建集合的话
// 扩展性很高 (建议使用前两种方式进行创建,因为由于Collection接口中没有get方法)
// 使用集合中最大的父接口进行指向 ArrayList 实现类 Collection >>> ArrayList(爷-->孙级)
Collection c = new ArrayList();
// 使用父接口进行创建 List-->ArrayList(父子级)
List l = new ArrayList(); // 所以 使用父子级进行创建是最佳选择
// 直接使用 ArrayList 类进行创建实体对象 (不建议直接使用该类进行创建 扩展性低)
ArrayList list = new ArrayList();
注意:1.7中默认创建一个ArrayList集合的时候,默认长度为10,也就是size=10;
package zhai.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ArrayListDemo1
public static void main(String[] args)
// 多态实现 使用前两种方式进行创建集合的话
// 扩展性很高 (建议使用前两种方式进行创建,因为由于Collection接口中没有get方法)
// 使用集合中最大的父接口进行指向 ArrayList 实现类 Collection >>> ArrayList(爷-->孙级)
Collection c = new ArrayList();
// 使用父接口进行创建 List-->ArrayList(父子级)
List l = new ArrayList(); // 所以 使用父子级进行创建是最佳选择
// 直接使用 ArrayList 类进行创建实体对象 (不建议直接使用该类进行创建 扩展性低)
ArrayList list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
System.out.println(list);
输出:
[zhangsan, lisi] // 默认使用ArrayList中的toString方法进行输出
注意:调用add方法向底层数组中添加元素,最开始size为0,添加元素以后size+1操作,添加成功返回true.
当数组中的10个位置都满了的时候就开始进行数组的扩容,使用add方法中的ensureCapacityInternal约束中的grow()方法进行扩容,将老数组中的内容赋值给新数组返回新数组,长度为原数组的1.5倍(也就是15),15要是满了就以此类推可以有无限长度。
1.7中的ArrayList中最主要的就是new一个ArrayList时,长度默认初始化为10.
【2】DK1.8中的ArrayList底层
最主要的是:在JDK1.8中newArrayList时,会给出一个空的数组,当调用add方法时,这时候才会把数组的长度设置为10,要是满了,会自动扩容。
JDK1.7:只要newArrayList时,就会给数组默认值为10,这样其实没必要,浪费资源,影响性能。
JDK1.8:newArrayList时候会给出一个空的数组,但是当调用add方法时,这时才会给出长度为10的数组。 参考技术A arraylist底层原理jdk11和1.8区别是
jdk11表述有误,应为jdk1.7
【1】JDK1.7中的ArrayList底层
package zhai.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ArrayListDemo1
public static void main(String[] args)
// 多态实现 使用前两种方式进行创建集合的话
// 扩展性很高 (建议使用前两种方式进行创建,因为由于Collection接口中没有get方法)
// 使用集合中最大的父接口进行指向 ArrayList 实现类 Collection >>> ArrayList(爷-->孙级)
Collection c = new ArrayList();
// 使用父接口进行创建 List-->ArrayList(父子级)
List l = new ArrayList(); // 所以 使用父子级进行创建是最佳选择
// 直接使用 ArrayList 类进行创建实体对象 (不建议直接使用该类进行创建 扩展性低)
ArrayList list = new ArrayList();
注意:1.7中默认创建一个ArrayList集合的时候,默认长度为10,也就是size=10;
package zhai.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ArrayListDemo1
public static void main(String[] args)
// 多态实现 使用前两种方式进行创建集合的话
// 扩展性很高 (建议使用前两种方式进行创建,因为由于Collection接口中没有get方法)
// 使用集合中最大的父接口进行指向 ArrayList 实现类 Collection >>> ArrayList(爷-->孙级)
Collection c = new ArrayList();
// 使用父接口进行创建 List-->ArrayList(父子级)
List l = new ArrayList(); // 所以 使用父子级进行创建是最佳选择
// 直接使用 ArrayList 类进行创建实体对象 (不建议直接使用该类进行创建 扩展性低)
ArrayList list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
System.out.println(list);
输出:
[zhangsan, lisi] // 默认使用ArrayList中的toString方法进行输出
注意:调用add方法向底层数组中添加元素,最开始size为0,添加元素以后size+1操作,添加成功返回true.
当数组中的10个位置都满了的时候就开始进行数组的扩容,使用add方法中的ensureCapacityInternal约束中的grow()方法进行扩容,将老数组中的内容赋值给新数组返回新数组,长度为原数组的1.5倍(也就是15),15要是满了就以此类推可以有无限长度。
1.7中的ArrayList中最主要的就是new一个ArrayList时,长度默认初始化为10.
【2】DK1.8中的ArrayList底层
最主要的是:在JDK1.8中newArrayList时,会给出一个空的数组,当调用add方法时,这时候才会把数组的长度设置为10,要是满了,会自动扩容。
JDK1.7:只要newArrayList时,就会给数组默认值为10,这样其实没必要,浪费资源,影响性能。
JDK1.8:newArrayList时候会给出一个空的数组,但是当调用add方法时,这时才会给出长度为10的数组。
以上是关于arraylist底层原理jdk11和1.8区别的主要内容,如果未能解决你的问题,请参考以下文章
jdk 1.8下 java ArrayList 添加元素解析
Java ArrayList底层实现原理源码详细分析Jdk8
Java多线程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)