栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中ArrayListJDK1.7和1.8的区别(底层)~ (2022.5.11)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中ArrayListJDK1.7和1.8的区别(底层)~ (2022.5.11)

【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,要是满了,会自动扩容。

课堂问答1: 在 JDK1.7和 JDK1.8中创建ArrayList的时候两个版本之间有何不同?

答:

  • JDK1.7:只要newArrayList时,就会给数组默认值为10,这样其实没必要,浪费资源,影响性能。
  • JDK1.8:newArrayList时候会给出一个空的数组,但是当调用add方法时,这时才会给出长度为10的数组。

课堂问答2:在集合中的ArrayList实现类和Vector实现类有什么区别?

答:

  • ArrayList:底层在扩容的时候是原数组的1.5倍;
  • Vector:底层在扩容的时候是元素组的2倍;
  • ArrayList:中的add方法线程不安全但是效率高;
  • Vector:中的add方法使用关键字synchronized进行修饰,线程安全效率低。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/880219.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号