`

Arraylist

阅读更多

ArrayList<String> list = new ArrayList<String>();

    list.add("a");

    list.add("b");

    list.add("c");

    for (String string : list) {

System.out.println(string);

}

    System.out.println("======================================");

    Collections.reverse(list);

    for (String string : list) {

    System.out.println(string);

}

问题是这样产生的,网上一哥们发了一个面试题:

ListA 里面有  1   2    3 

ListB里面有  4    5   6 

让ListA变成  1  2  3  4  5  6  

我觉得很简单 ,就说用for循环遍历 添加就好了。结果面试官说

答案是使用addAll方法,因为这样效率高:

我表示很费解,于是查阅了资料。

得出以下结论:

在小数据量时,for循环效率高,大数据量时addAll方法效率高:

原因如下:

ArrayList的addAll的实现为: 

public  boolean addAll(Collection   c)   { 

Object[]   a   =   c.toArray(); 

int numNew   =   a.length; 

ensureCapacity(size   +   numNew);      //   Increments   modCount 

        System.arraycopy(a,   0,   elementData,   size,   numNew); 

        size += numNew; 

return   numNew   !=   0; 

很显然。。在拷贝数组时使用了


arraycopy 这个方法。这个方法是使用拷贝内存的做法 ,效率比遍历数组块很多。

首先找到数据源 然后将该段内存拷贝。

当然值得注意的是,这个函数中还使用了toArray方法,这个方法是 要遍历操作的

但是如果需要多次遍历,那么addAll还是在性能上会获取优势的. .

下面是网上的一个测试 在20组数据时 还是 for效率高,但是在大数据量的时候 arraycopy 方法就明显占优势了。

另外:

arraycopy的定义是这样的

public static native void arraycopy(Object src,  int  srcPos, Object dest, int destPos,int length);

native关键字的意思是 这个函数的源码在JDK中没有的。但是他调用的是本地计算机中的函数

这个函数是C,或者C++写完的,编译成DLL。 java调用。所以效率比for循环要块。

综上所述 :为什么在大数据量时使用addall方法效率快?

1.使用内存拷贝,移动数据。

2.本地函数,执行效率高。

那小数据量时呢?

以上2点都不明显,并且首先要调用toArray方法,在小数据量时,效果没有for来的好。

 

出处 :http://blog.csdn.net/sutaizi/article/details/6607123

 

分享到:
评论

相关推荐

    jni操作arraylist对象

    在这个主题中,我们将深入探讨如何在JNI中操作ArrayList对象并添加一个int类型的数据。 首先,我们需要理解ArrayList在Java中的本质。ArrayList是Java集合框架中的一个重要类,它实现了List接口,用于存储可变大小...

    C# Array和ArrayList,List区别

    ### C# 中 Array、ArrayList 和 List 的区别 在C#编程语言中,处理集合数据时,程序员经常需要根据实际需求选择合适的集合类型。本文将详细解释C#中Array、ArrayList和List之间的区别,并通过示例代码帮助理解这些...

    ArrayList转化为DataTable

    在.NET框架中,ArrayList和DataTable是两种常用的集合类,它们分别代表了两种不同的数据存储方式。ArrayList是一个基于对象数组的动态大小的列表,而DataTable则是一个内存中的表格数据结构,通常用于存储和操作关系...

    Android ArrayList关键字查询.rar

    在Android开发中,ArrayList是一个非常重要的数据结构,它属于Java集合框架的一部分,但在Android环境中被广泛使用。ArrayList关键字查询是Android应用中常见的功能,尤其在显示大量数据的ListView中,用户通常需要...

    使用数组列表ArrayList填充ListBox

    在.NET框架中,ArrayList是System.Collections命名空间下的一种动态数组,它可以存储任意类型的对象,而ListBox控件则是Windows Forms应用程序中常见的用户界面元素,用于显示一个可选项目的列表。本篇将详细介绍...

    ArrayList实现对产品CRUD

    在Java编程语言中,ArrayList是Java集合框架的重要组成部分,它属于List接口的一个具体实现,用于存储可变大小的有序对象列表。在这个“ArrayList实现对产品CRUD”的项目中,我们将探讨如何利用面向对象编程(OOP)...

    浅析ArrayList内部实现

    浅析ArrayList内部实现 ArrayList是Java集合框架中的一种常用数据结构,能够存储任意多个对象,并且可以自由扩展,弥补了数组的定长的缺陷。下面我们将深入探讨ArrayList的内部实现机理。 ArrayList的内部实现机理...

    使用对象ArrayList填充DataGrid,C#源代码ArrayList MyList = new ArrayList();

    首先,ArrayList是.NET Framework中的一个类,它继承自System.Collections.ArrayList,主要用于存储动态大小的可变数组。ArrayList可以存储任何类型的对象,非常灵活,但不提供类型安全。在C#中,我们通常更推荐使用...

    ArrayList

    ### ArrayList 类详解 #### 概述 `System.Collections.ArrayList` 是 .NET Framework 中的一个非常重要的非泛型集合类,它提供了动态数组的功能。与普通的数组相比,`ArrayList` 最大的特点是能够动态地调整其大小...

    Java学生成绩管理系统实例(ArrayList)

    import java.util.ArrayList; import java.util.Iterator; import java.util.Scanner; /** * @Author Ziph * @date 2020/2/19 * @Email mylifes1110@163.com */ public class TestDemo implemen

    ArrayList数据批量添加数据

    ### ArrayList数据批量添加数据 #### 知识点概述 在.NET框架中,`ArrayList`类是一种动态数组,用于存储不同类型的数据。本篇文章将详细介绍如何利用`ArrayList`进行数据的批量添加,并通过一个示例来展示如何在一...

    c版的arraylist

    在Java编程语言中,`ArrayList`是`java.util`包中的一个重要集合类,它提供了动态数组的功能。这个数据结构允许我们存储、访问和管理一组元素。而在C语言中,由于没有内置的类似集合的数据类型,程序员需要自定义...

    你必须知道的C# ArrayList

    C# ArrayList是一个重要的数据结构,它是.NET框架早期版本中用于动态数组存储的类。这个类在System.Collections命名空间中,提供了灵活的大小调整和数据管理功能。ArrayList在C#编程中扮演了重要的角色,尤其在处理...

    用C语言模拟ArrayList

    在C语言中,ArrayList是一种常见的数据结构,它模拟了Java或.NET等高级语言中的动态数组。ArrayList提供了在数组中添加、删除和查找元素的便利操作,而无需预先知道数组的大小。下面,我们将深入探讨如何用C语言实现...

    ArrayList类操作程序实例

    ArrayList类是Java编程语言中一个常用的集合类,它属于Java集合框架的一部分,位于`java.util`包中。ArrayList是一个基于数组实现的动态列表,可以存储任何类型的数据,并且支持动态扩容。在本实例中,我们将深入...

    ASP .NET - ArrayList对象

    ### ASP .NET - ArrayList对象 在ASP .NET中,`ArrayList`对象是一种非常有用的集合类,它可以存储任意类型的对象,并且大小是动态可变的。`ArrayList`对象提供了丰富的方法来帮助开发人员处理数据,例如添加、删除...

    C#数组与Arraylist

    在编程领域,尤其是在C#语言中,数组和ArrayList是两种常用的数据存储结构。它们各自有其特点和适用场景,理解并熟练运用它们是提升编程能力的关键。本文将深入探讨数组和ArrayList,帮助你掌握这两种数据结构的核心...

    ArrayList源码Jdk1.8

    ### ArrayList源码解析(JDK 1.8) #### 概述 `ArrayList`是Java集合框架中的一个核心组件,它提供了动态数组的功能。与固定大小的数组不同,`ArrayList`可以随着元素的增加而自动扩展其容量。在JDK 1.8中,`...

    JNI与C++数据类型传递示例(包括ArrayList对象、ArrayList嵌套返回)

    一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList&lt;ArrayList&lt;String&gt;&gt;等。

    ArrayList的实现原理

    ArrayList是Java集合框架中常用的动态数组,它是List接口的一个实现,允许存储包括null在内的所有元素。ArrayList的主要特点是通过数组来存储元素,提供了丰富的操作方法,包括添加、删除、修改和查询等。下面是...

Global site tag (gtag.js) - Google Analytics