`

数组操作 和 list到数组

    博客分类:
  • Java
阅读更多

常在看代码的时候,看到这样的数组的操作:

Integer[] arr1 = new Integer[0];
for (int i=0; i < 100000; i++) {
	Integer[] arr2 = new Integer[arr1.length + 1];
	System.arraycopy(arr1, 0, arr2, 0, arr1.length);
	arr2[arr1.length] = i;
	arr1 = arr2;
}

  实现的就是,向数组中加元素,这个数组是不定常的,所以里面会新new一个数组,然后又copy,又赋值的。感觉就是头大,效率不高,代码写的太朴实无华了。

 

比较List的实现:

public class Tst {
	public static void main(String[] args) {
		long startTime = System.currentTimeMillis();
		List<Integer> list = new ArrayList<Integer>();
		for (int i=0; i < 10000000; i++)
			list.add(i);
		list.toArray(new Integer[list.size()]);
		System.out.println("Runned time : " + (System.currentTimeMillis()-startTime));

		startTime = System.currentTimeMillis();
		Integer[] arr1 = new Integer[0];
		for (int i=0; i < 100000; i++) {
			Integer[] arr2 = new Integer[arr1.length + 1];
			System.arraycopy(arr1, 0, arr2, 0, arr1.length);
			arr2[arr1.length] = i;
			arr1 = arr2;
		}
		System.out.println("Runned time : " + (System.currentTimeMillis()-startTime));
	}
}

 

结果:

写道
Runned time : 3422
Runned time : 21407

 

list加入了10000000个元素在变换成数组,数组方式是100000数量,比list小两个数量级,居然还慢这么多。

好,果然慢。猜想是多的,数组那种方式效率是不高,原因呢?list在调用add的时候,先看它已经有的数组能不能放,如果不够的话,它是这样扩大的

/**
 * Increases the capacity of this <tt>ArrayList</tt> instance, if
 * necessary, to ensure that it can hold at least the number of elements
 * specified by the minimum capacity argument.
 *
 * @param   minCapacity   the desired minimum capacity
 */
public void ensureCapacity(int minCapacity) {
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
    Object oldData[] = elementData;
    int newCapacity = (oldCapacity * 3)/2 + 1;
	    if (newCapacity < minCapacity)
	newCapacity = minCapacity;
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
}
}

  

也就 newCapacity = (oldCapacity * 3)/2 + 1;

并不是数组那种总是加1的方式。 

分享到:
评论

相关推荐

    java 数组转list list转数组 list数组互转

    java 数组转list list转数组 list数组互转 java8 代码示例

    dotnet-使用Linq筛选满足数组条件的List集合

    总的来说,`Linq_List_Contrast_Baseon_Array`的主题涉及到使用Linq对List集合进行高效的查询和筛选,根据数组条件过滤数据。掌握这些技巧能帮助.NET开发者编写更加高效和可读的代码,处理复杂的数据操作。通过理解...

    List转换成String数组

    - `list.toArray(new String[list.size()])`将`List&lt;String&gt;`中的所有元素复制到新创建的字符串数组中。 **方法二:简化版toArray()方法** ```java List&lt;String&gt; list = new ArrayList(); list.add("a1"); list....

    数组和list相互转换

    Java提供了强大的标准库支持,可以方便地完成数组到列表的转换。具体实现方式如下: ```java import java.util.Arrays; import java.util.List; public class ArrayToList { public static void main(String[] ...

    Python使用numpy模块创建数组操作示例

    本文实例讲述了Python使用numpy模块创建数组操作。分享给大家供大家参考,具体如下: 创建数组 创建ndarray 创建数组最简单的方法就是使用array函数。它接收一切序列型的对象(包括其他数组),然后产生一个新的含有...

    C#数组中List, Dictionary的相互转换问题

    将数组转换为List 将List转换为数组 将数组转换为Dictionary 将Dictionary 转换为数组 将List转换为Dictionary 将Dictionary转换为List 首先这里定义了一个“Student”的类,它有三个自动实现属性。 class ...

    list转换成string数组

    在Java编程语言中,经常需要将`List&lt;String&gt;`类型的数据转换为`String[]`数组类型,以便于进行某些特定的操作或适应某些方法的要求。本文将详细探讨这一转换过程,并通过几个具体的示例来帮助理解。 #### 一、基础...

    C# 一维数组操作

    在C#编程语言中,一维数组是一种...以上就是关于C#一维数组操作的详细说明,包括创建、填充、统计计算、排序以及插入和删除元素。这些基础知识是C#编程中的重要组成部分,理解并熟练掌握它们将有助于提升你的编程技能。

    C语言中动态数组操作实践

    总之,C语言中的动态数组操作涉及内存管理,需要理解`malloc()`、`calloc()`、`realloc()`和`free()`的用法,以及如何安全地处理动态数组。通过封装成类似ArrayList的数据结构,可以进一步提高代码的可读性和可维护...

    Java 数组转list.docx

    而使用循环将数组元素一个个添加到列表中可以生成可变的 List,但是需要更多的代码和时间。 在实践中,我们可以根据具体情况选择合适的方法。如果需要快速地将数组转换为 List 并且不需要修改 List,可以使用 ...

    c#之数组和list转换

    在C#编程中,数组和List&lt;T&gt; 是两种常见的数据结构,它们各有特点,适用于不同的场景。本篇文章将深入探讨数组和List之间的转换,以及它们在实际编程中的使用方法。 首先,数组是C#中预定义的一种数据类型,它提供了...

    2.1.1 C++和C#数据传递 -常用类型数组和List类型传递

    本节将深入探讨C++和C#中数据传递的常见方法,特别是涉及数组和List类型的传递。 首先,让我们从C++开始。在C++中,数据传递主要通过值传递和引用传递。数组在C++中被视为对象,因此当作为参数传递时,实际上是传递...

    ajax传递list对象数组

    本篇将详细介绍如何通过AJAX来传递一个List对象数组,并解析其中涉及到的关键技术点。 #### 二、知识点概览 1. **前端JavaScript处理List对象数组** 2. **使用jQuery的$.ajax方法发送POST请求** 3. **后端接收List...

    List<Long>转一维数组 Long[](csdn)————程序.pdf

    在标题和描述中提到的"List转一维数组 Long[]",就是将一个包含Long类型的列表转换为对应的Long数组。这里我们将详细探讨如何进行这种转换,并了解相关的编程概念。 首先,让我们看下给定的代码片段: ```java /*...

    数组,List 重复元素统计数量,找出唯一的元素

    int[] arr = { 1, 2, 2, 3, 3, 4, 4, 4, 1, 5, 6, 6, 6 }...数组和list 可以使用相同的方法,自己测试可以 控制台输出 1出现的次数:2 2出现的次数:2 3出现的次数:2 4出现的次数:3 5出现的次数:1 数组中唯一的元素是:5

    数组和集合

    例如,ArrayList底层基于数组实现,适合随机访问,但在大量数据的中间插入和删除操作性能较差;而LinkedList基于双向链表实现,在列表中间插入和删除操作性能较好,但随机访问性能差。在多线程环境下使用集合时,...

    java 数组转list.docx

    在 Java 中,将数组转换为 List 是一个常见的操作。下面将详细介绍四种常用的方法,以便更好地理解和应用。 方法 1:使用 Arrays 类的 asList() 方法 使用 Arrays 类的 asList() 方法可以将数组转换为 List。该...

    asp.net中后台c#数组与前台js数组交互

    在这里,我们定义了两个数组,分别存放经度和纬度的值。 ```csharp public string[] lat = null; public string[] lng = null; ``` 给CS数组赋值 CS数组的值一般都是从数据库中取到的。在这里,我们使用...

    java XML转成LIST可以转成指定的类数组

    本篇文章将深入探讨如何将XML转换为指定类型的List数组,并涉及多层数据结构的处理。 1. **Java XML解析库** 在Java中,有多种库可用于解析XML文件,如DOM(Document Object Model)、SAX(Simple API for XML)和...

    JS数组中对象去重操作示例

    - 如果`id`也没有出现过,创建一个新的对象,复制当前对象的`id`和`magicId`到新对象,并将新对象添加到`result`数组中。 - 将当前对象的`magicId`和`id`标记为已出现,即`full[aaa] = true`和`full[bbb] = true`...

Global site tag (gtag.js) - Google Analytics