zoukankan      html  css  js  c++  java
  • java中Array和ArrayList区别

    1)精辟阐述:
    可以将 ArrayList想象成一种“会自动扩增容量的Array”。

    2)Array([]):最高效;但是其容量固定且无法动态改变;
         ArrayList:  容量可动态增长;但牺牲效率;

    3)建议:
    基于效率和类型检验,应尽可能使用Array无法确定数组大小时才使用ArrayList
    不过当你试着解决更一般化的问题时,Array的功能就可能过于受限。

    4)Java中一切皆对象,Array也是对象。不论你所使用得Array型别为何,

    Array名称本身实际上是个reference,指向heap之内得某个实际对象。

    这个对象可经由“Array初始化语法”被自动产生,也可以以new表达式手动产生。

    5)Array可做为函数返回值,因为它本身是对象的reference;

    6)对象数组与基本类型数组在运用上几乎一模一样,唯一差别在于,前者持有得是reference,后者直接持有基本型别之值;
    例如:
    string [] staff=new string[100];
    int [] num=new int[10];

    7)容器所持有的其实是一个个reference指向Object,进而才能存储任意型别。当然这不包括基本型别,因为基本型别并不继承自任何classes。

    8)面对Array,我们可以直接持有基本型别数值的Array(例如:int [] num;),也可以持有reference(指向对象)的Array;但是容器类仅能持有reference(指向对象),若要将基本型别置于容器内,需要使用wrapper类。但是wrapper类使用起来可能不很容易上手,此外,primitives Array的效率比起“容纳基本型别之外覆类(的reference)”的容器好太多了。

    当然,如果你的操作对象是基本型别,而且需要在空间不足时自动扩增容量,Array便不适合,此时就得使用外覆类的容器了。

    9)某些情况下,容器类即使没有转型至原来的型别,仍然可以运作无误。有一种情况尤其特别:编译器对String class提供了一些额外的支持,使它可以平滑运作。

    10)对数组的一些基本操作,像排序、搜索与比较等是很常见的。因此在Java中提供了Arrays类协助这几个操作:sort(),binarySearch(),equals(),fill(),asList().

    不过Arrays类没有提供删除方法,而ArrayList中有remove()方法,不知道是否是不需要在Array中做删除等操作的原因(因为此时应该使用链表)。

    11)ArrayList的使用也很简单:产生ArrayList,利用add()将对象置入,利用get(i)配合索引值将它们取出。这一切就和Array的使用方式完全相同,只不过少了[]而已。

    2.参考资料:
    1)效率:
    数组扩容是对ArrayList效率影响比较大的一个因素。
    每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。

    ArrayList是Array的复杂版本
    ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。

    2)类型识别:
    ArrayList存入对象时,抛弃类型信息,所有对象屏蔽为Object,编译时不检查类型,但是运行时会报错。
    ArrayList与数组的区别主要就是由于动态增容的效率问题了

    3)ArrayList可以存任何Object,如String等。

    转载自:http://blog.csdn.net/chenglansky/article/details/44567887

    附Array和ArrayList的相互转换

    public class Test {  
        public static void main(String[] args) {  
            List<String> list=new ArrayList<String>();  
            list.add("王利虎");  
            list.add("张三");  
            list.add("李四");  
            int size=list.size();  
            String[] array = (String[])list.toArray(new String[size]);  
            for(int i=0;i<array.length;i++){  
                System.out.println(array[i]);  
            }  
        }  
    }  
    package test.test1;  
      
    import java.util.Arrays;  
    import java.util.List;  
      
    public class Test {  
        public static void main(String[] args) {  
            String[] array=new String[3];  
            array[0]="王利虎";  
            array[1]="张三";  
            array[2]="李四";  
            List<String> list=Arrays.asList(array);  
            for(int i=0;i<list.size();i++){  
                System.out.println(list.get(i));  
            }            
        }  
    }  
  • 相关阅读:
    .NetCore Grpc 客服端 工厂模式配置授权
    DOCKER 拉取 dotnet 镜像太慢 docker pull mcr.microsoft.com too slow
    Introducing .NET 5
    VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
    Omnisharp VsCode Attaching to remote processes
    zookeeper3.5.5 centos7 完全分布式 搭建随记
    Hadoop2.7.7 centos7 完全分布式 配置与问题随记
    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
    SQL基础随记3 范式 键
    MySQL调优 优化需要考虑哪些方面
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/6524200.html
Copyright © 2011-2022 走看看