常在看代码的时候,看到这样的数组的操作:
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数组互转 java8 代码示例
总的来说,`Linq_List_Contrast_Baseon_Array`的主题涉及到使用Linq对List集合进行高效的查询和筛选,根据数组条件过滤数据。掌握这些技巧能帮助.NET开发者编写更加高效和可读的代码,处理复杂的数据操作。通过理解...
- `list.toArray(new String[list.size()])`将`List<String>`中的所有元素复制到新创建的字符串数组中。 **方法二:简化版toArray()方法** ```java List<String> list = new ArrayList(); list.add("a1"); list....
Java提供了强大的标准库支持,可以方便地完成数组到列表的转换。具体实现方式如下: ```java import java.util.Arrays; import java.util.List; public class ArrayToList { public static void main(String[] ...
本文实例讲述了Python使用numpy模块创建数组操作。分享给大家供大家参考,具体如下: 创建数组 创建ndarray 创建数组最简单的方法就是使用array函数。它接收一切序列型的对象(包括其他数组),然后产生一个新的含有...
将数组转换为List 将List转换为数组 将数组转换为Dictionary 将Dictionary 转换为数组 将List转换为Dictionary 将Dictionary转换为List 首先这里定义了一个“Student”的类,它有三个自动实现属性。 class ...
在Java编程语言中,经常需要将`List<String>`类型的数据转换为`String[]`数组类型,以便于进行某些特定的操作或适应某些方法的要求。本文将详细探讨这一转换过程,并通过几个具体的示例来帮助理解。 #### 一、基础...
在C#编程语言中,一维数组是一种...以上就是关于C#一维数组操作的详细说明,包括创建、填充、统计计算、排序以及插入和删除元素。这些基础知识是C#编程中的重要组成部分,理解并熟练掌握它们将有助于提升你的编程技能。
总之,C语言中的动态数组操作涉及内存管理,需要理解`malloc()`、`calloc()`、`realloc()`和`free()`的用法,以及如何安全地处理动态数组。通过封装成类似ArrayList的数据结构,可以进一步提高代码的可读性和可维护...
而使用循环将数组元素一个个添加到列表中可以生成可变的 List,但是需要更多的代码和时间。 在实践中,我们可以根据具体情况选择合适的方法。如果需要快速地将数组转换为 List 并且不需要修改 List,可以使用 ...
在C#编程中,数组和List<T> 是两种常见的数据结构,它们各有特点,适用于不同的场景。本篇文章将深入探讨数组和List之间的转换,以及它们在实际编程中的使用方法。 首先,数组是C#中预定义的一种数据类型,它提供了...
本节将深入探讨C++和C#中数据传递的常见方法,特别是涉及数组和List类型的传递。 首先,让我们从C++开始。在C++中,数据传递主要通过值传递和引用传递。数组在C++中被视为对象,因此当作为参数传递时,实际上是传递...
本篇将详细介绍如何通过AJAX来传递一个List对象数组,并解析其中涉及到的关键技术点。 #### 二、知识点概览 1. **前端JavaScript处理List对象数组** 2. **使用jQuery的$.ajax方法发送POST请求** 3. **后端接收List...
在标题和描述中提到的"List转一维数组 Long[]",就是将一个包含Long类型的列表转换为对应的Long数组。这里我们将详细探讨如何进行这种转换,并了解相关的编程概念。 首先,让我们看下给定的代码片段: ```java /*...
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 是一个常见的操作。下面将详细介绍四种常用的方法,以便更好地理解和应用。 方法 1:使用 Arrays 类的 asList() 方法 使用 Arrays 类的 asList() 方法可以将数组转换为 List。该...
在这里,我们定义了两个数组,分别存放经度和纬度的值。 ```csharp public string[] lat = null; public string[] lng = null; ``` 给CS数组赋值 CS数组的值一般都是从数据库中取到的。在这里,我们使用...
本篇文章将深入探讨如何将XML转换为指定类型的List数组,并涉及多层数据结构的处理。 1. **Java XML解析库** 在Java中,有多种库可用于解析XML文件,如DOM(Document Object Model)、SAX(Simple API for XML)和...
- 如果`id`也没有出现过,创建一个新的对象,复制当前对象的`id`和`magicId`到新对象,并将新对象添加到`result`数组中。 - 将当前对象的`magicId`和`id`标记为已出现,即`full[aaa] = true`和`full[bbb] = true`...