`

java集合技巧(一)----请为集合指定初始容量

阅读更多

集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许)。当这个海、容器的量变得非常大的时候,它的初始容量就会显得很重要了,因为挖海、扩容是需要消耗大量的人力物力财力的。同样的道理,Collection的初始容量也显得异常重要。所以:对于已知的情景,请为集合指定初始容量。

[java] view plain copy
 
  1. public static void main(String[] args) {  
  2.         StudentVO student = null;  
  3.         long begin1 = System.currentTimeMillis();  
  4.         List<StudentVO> list1 = new ArrayList<>();  
  5.         for(int i = 0 ; i < 1000000; i++){  
  6.             student = new StudentVO(i,"chenssy_"+i,i);  
  7.             list1.add(student);  
  8.         }  
  9.         long end1 = System.currentTimeMillis();  
  10.         System.out.println("list1 time:" + (end1 - begin1));  
  11.           
  12.         long begin2 = System.currentTimeMillis();  
  13.         List<StudentVO> list2 = new ArrayList<>(1000000);  
  14.         for(int i = 0 ; i < 1000000; i++){  
  15.             student = new StudentVO(i,"chenssy_"+i,i);  
  16.             list2.add(student);  
  17.         }  
  18.         long end2 = System.currentTimeMillis();  
  19.         System.out.println("list2 time:" + (end2 - begin2));  
  20.     }  

 

        上面代码两个list都是插入1000000条数据,只不过list1没有没有申请初始化容量,而list2初始化容量1000000。那运行结果如下:

 

[java] view plain copy
 
  1. list1 time:1638  
  2. list2 time:921  

 

        从上面的运行结果我们可以看出list2的速度是list1的两倍左右。在前面LZ就提过,ArrayList的扩容机制是比较消耗资源的。我们先看ArrayList的add方法:

 

[java] view plain copy
 
  1. public boolean add(E e) {    
  2.         ensureCapacity(size + 1);     
  3.         elementData[size++] = e;    
  4.         return true;    
  5.     }    
  6.       
  7.     public void ensureCapacity(int minCapacity) {    
  8.         modCount++;         //修改计数器  
  9.         int oldCapacity = elementData.length;      
  10.         //当前需要的长度超过了数组长度,进行扩容处理  
  11.         if (minCapacity > oldCapacity) {    
  12.             Object oldData[] = elementData;    
  13.             //新的容量 = 旧容量 * 1.5 + 1  
  14.             int newCapacity = (oldCapacity * 3)/2 + 1;    
  15.                 if (newCapacity < minCapacity)    
  16.                     newCapacity = minCapacity;    
  17.           //数组拷贝,生成新的数组   
  18.           elementData = Arrays.copyOf(elementData, newCapacity);    
  19.         }    
  20.     }  

 

 

        ArrayList每次新增一个元素,就会检测ArrayList的当前容量是否已经到达临界点,如果到达临界点则会扩容1.5倍。然而ArrayList的扩容以及数组的拷贝生成新的数组是相当耗资源的。所以若我们事先已知集合的使用场景,知道集合的大概范围,我们最好是指定初始化容量,这样对资源的利用会更加好,尤其是大数据量的前提下,效率的提升和资源的利用会显得更加具有优势。

1
0
分享到:
评论

相关推荐

    Java-Java集合体系-List-Set

    Java集合体系是Java编程中非常核心的部分,涵盖了用于存储和操作数据的各种数据结构。在Java中,集合主要分为三大接口:List、Set和Map。这些接口各有特点,适用于不同的应用场景。 一、List接口 List接口是单列...

    Java集合类性能分析

    - 容量初始为10,每次自动增长50%。 综上所述,Java集合框架提供了丰富的集合类型,每种类型都有其特定的应用场景。选择合适的集合类型对于提高程序的性能至关重要。在实际开发过程中,根据具体的需求选择最适合的...

    java集合类

    集合类使用初始容量和加载因子调整自己的大小。集合类全部支持泛型,是一种数据安全的用法。 Java集合框架定义了几个接口。这些集合接口决定了集合实现类的基本特性。对于不同的集合实现类提供了这些标准接口的不同...

    java集合课程3.docx

    Java集合框架是Java编程语言中一...以上内容只是Java集合框架的一部分,实际上还有更多高级特性和使用技巧,如迭代器(Iterator)、并发集合(Concurrent Collections)、流(Stream)等,需要在实践中不断学习和掌握。

    java 集合

    Java集合框架是Java编程语言中的一个核心组成部分,它为存储、管理和操作对象提供了一组统一的接口和类。集合的概念是面向对象编程中用来组织数据的重要工具,它允许我们存储一组对象,根据需要进行添加、删除、修改...

    Java 集合框架(2-9)-Collection - ArrayList 源码解析.pdf

    在创建ArrayList时,如果没有指定初始容量,将默认创建一个空的ArrayList,其elementData指向一个长度为0的特殊数组`EMPTY_ELEMENTDATA`;如果指定了初始容量,并且容量大于0,那么会初始化一个相应大小的数组。 ...

    java集合与映射(牛)

    #### 一、Java集合框架概览 在Java编程语言中,集合框架(Collection Framework)是一组接口和实现这些接口的类的集合,它提供了存储和操作一组对象的方式。Java集合框架主要包括两种类型的容器:集合(Collection...

    java集合常见面试题.rar

    Java集合框架是Java编程语言中的一个核心特性,它为数据存储和操作提供了丰富的类库。在面试中,Java集合框架的深入理解往往被视为衡量开发者能力的重要标准。本压缩包文件"java集合常见面试题.rar"包含了针对这个...

    java集合对象

    - `ArrayList`同样是`List`的一个实现类,默认初始容量同样为10。 - 当存储的数据数量超过当前容量时,`ArrayList`会根据底层算法高效地增加容量。 - 与`Vector`不同,`ArrayList`是非线程安全的,因此在单线程...

    java集合的介绍很全

    `Hashtable`的初始容量和加载因子可以在创建时指定,以优化内存使用和性能。 #### HashMap `HashMap`是非线程安全的`Map`实现,它允许使用`null`键和值,但每个键只能映射一个值。`HashMap`在大多数情况下比`...

    java基本集合类,java基本集合类

    Java集合框架是Java编程语言中的一个重要组成部分,它提供了多种数据结构,如列表、队列、集、映射等,方便程序员存储和管理对象。本篇文章将详细讲解Java中的基本集合类ArrayList、LinkedList和Vector,以及HashSet...

    20-集合框架020-HashMap-1080P 高清-AVC20

    在这个主题中,我们将深入探讨HashMap类,它是Java集合框架中的一个关键组件,特别是在标题“20-集合框架020-HashMap-1080P 高清-AVC20”和描述中所提到的内容。 HashMap是Java.util包中的一个类,它实现了Map接口...

    java - 实用技巧

    在初始化 `Vector` 时,默认初始容量为10,当需要添加更多元素时,`Vector` 会自动扩容。扩容时通常会将当前容量翻倍。 示例代码: ```java Object obj = new Object(); Vector v = new Vector(100000); for (int i...

    【IT十八掌徐培成】Java基础第10天-03.List-集合框架-ArrayList.zip

    - `ArrayList()`: 创建一个空的ArrayList,初始容量为10。 - `ArrayList(int initialCapacity)`: 创建一个指定初始容量的ArrayList,避免了不必要的扩容操作。 2. **ArrayList的主要方法**: - `add(E element)`...

    java软件技术文档-深入java8的集合5:Hashtable的实现原理.pdf

    2. 通过指定初始容量创建实例,负载因子默认为0.75。 3. 默认构造函数,容量设为11,负载因子仍为0.75。 默认的初始容量不同于HashMap(HashMap默认为16),这暗示了两者在哈希函数上可能存在差异,因为它们可能...

    java集合深度学习

    在哈希表的初始化和扩容策略上,HashTable的初始容量是11,扩容时通过old*2+1的方式。而HashMap的默认容量是16,并且总是2的幂次方。这种设计使得HashMap在计算索引时可以通过位运算提高效率,而不是使用模运算。 ...

    JAVA集合介绍

    2. **指定初始容量的构造函数**:创建一个具有指定初始容量的空列表。 ```java public ArrayList(int initialCapacity) { if (initialCapacity ) throw new IllegalArgumentException("Illegal Capacity: " + ...

Global site tag (gtag.js) - Google Analytics