`
LanderRooter
  • 浏览: 11791 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

Collection的<T> T[] toArray(T[] a) 性能优化

 
阅读更多

最近在使用PMD进行代码缺陷扫描时,有一类问题PMD称为"call to Collection.toArray() may be optimizable"

下面一行为问题代码:

 

result = (IResearch[]) list.toArray(new IResearch[0]);

 

PMD对这类问题给出的解决方案如下:

 

class Foo {
 void bar(Collection x) {
   // A bit inefficient
   x.toArray(new Foo[0]);
   // Much better; this one sizes the destination array, avoiding
   // a reflection call in some Collection implementations
   x.toArray(new Foo[x.size()]);
 }
}

 

再看下ArrayList的<T> T[] toArray(T[] a) 源码:

public <T> T[] toArray(T[] a) {
        if (a.length < size)
            a = (T[])java.lang.reflect.Array.
		newInstance(a.getClass().getComponentType(), size);
	System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

 

你就发现如果采用大家常用的把a的length设为0,就需要反射API来创建一个大小为size的数组,而这对性能有一定的影响.

 

所以最好的方式就是直接把a的length设为Collection的size从而避免调用反射API来达到一定的性能优化.

 

import java.util.ArrayList;

public class ToArrayTest {   

    public static void main(String[] args) {   
        ArrayList al = new ArrayList();   
        for (int i = 0; i < 10; i++) {   
            al.add(String.valueOf(i));   
        }   
        String[] s1 = (String[]) al.toArray(new String[15]);   
        for (int i = 0; i < s1.length; i++) {   
            System.out.println(i+","+s1[i]);   
        }   
        String[] s2 = (String[]) al.toArray(new String[5]);   
        for (int i = 0; i < s2.length; i++) {   
            System.out.println(i+","+s2[i]);   
        } 
        System.out.println("OptimizableToArrayCall");
        String[] s3 = (String[]) al.toArray(new String[al.size()]);   
        for (int i = 0; i < s3.length; i++) {   
            System.out.println(i+","+s3[i]);   
        } 
    }   
  
}  

 

 

 

分享到:
评论

相关推荐

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

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

    js模拟list和map

    Map&lt;br&gt;js文件为 js/utils.js&lt;br&gt;IE6.0 测试通过&lt;br&gt;&lt;br&gt;List:&lt;br&gt;add(var obj) //添加一个元素&lt;br&gt;remove(var index) //删除一个元素&lt;br&gt;get(var index) //获取一个元素&lt;br&gt;removeAll() //删除所有元素&lt;br&gt;toArray...

    CSharp 4.0 .Net Framework V4.0 Stack-T类

    《C# 4.0 .Net Framework V4.0 中的 Stack&lt;T&gt; 类详解》 在C#编程语言中,Stack&lt;T&gt; 类是.NET Framework V4.0版本中的一种数据结构,它作为“后进先出”(LIFO)容器,广泛应用于需要处理元素顺序反转的场景。本文将...

    List转换成String数组

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

    c#之数组和list转换

    数组与List&lt;T&gt; 之间的转换通常在需要灵活地管理元素数量或者提高性能时进行。以下是一些转换的方法: 1. **数组转为List&lt;T&gt;**: - 可以通过构造函数实现,例如:`List&lt;int&gt; myList = new List&lt;int&gt;(myArray);` - ...

    C#中List和数组之间转换的方法

    当你有一个已填充数据的List&lt;T&gt;对象,想要将其转换为数组时,可以使用`ToArray()`方法。例如,如果你有一个List&lt;string&gt;,你可以这样转换: ```csharp List&lt;string&gt; listS = new List&lt;string&gt;(); listS.Add("str");...

    List-CSharp.zip_C# list 顺序_Linked list_c# list声明_c#list类函数_c#lis

    - `AddRange(IEnumerable&lt;T&gt; collection)`: 添加集合中的所有元素到列表末尾。 - `Insert(int index, T item)`: 在指定索引处插入一个元素。 - `RemoveAt(int index)`: 删除指定索引处的元素。 - `Remove(T item...

    C#查找列表中所有重复出现元素的方法

    如果我们想进一步优化性能,可以考虑使用`HashSet&lt;T&gt;`来存储已遇到的元素,而不是`List&lt;T&gt;`。这将减少内存开销,并且查找效率更高。 总之,C#中查找列表重复元素的方法多种多样,可以根据实际需求选择合适的方法。...

    asp 完全教程

    下面的代码从VBScript数组myVBArray创建JScript数组myJSArray: &lt;br&gt; var Temp = new VBArray(myVBArray)&lt;br&gt; var myJSArray&lt;br&gt; myJSArray = Temp.toArray()&lt;br&gt; 上述代码首先创建一个临时的VBArray对象,然后...

    C#源代码-List泛型集合的三个练习.zip

    - `ToArray()`: 将List&lt;T&gt;转换为数组。 - `ToList()`: 将其他类型的集合转换为List&lt;T&gt;(如数组或枚举器)。 10. **列表的容量和计数** - `Count`: 获取列表中元素的数量。 - `Capacity`: 获取或设置列表当前...

    【Java基础笔记】Java集合流Stream.docx

    * `toArray(IntFunction&lt;A[]&gt; generator)`: 收集流中的元素,转换为数组。 Optional类 Optional 类是一个包装器对象,内置了值,将值进行封装,可以有效避免判断对象是否为 null 的操作或出现空指针的异常。 常用...

    C#List泛型集合实例,源码

    - `ToArray()`:将`List&lt;T&gt;`转换为数组。 除了这些基本操作,`List&lt;T&gt;`还支持迭代,可以使用`foreach`循环遍历集合: ```csharp foreach (int number in numbers) { Console.WriteLine(number); } ``` 在实际...

    类的List与Json的互转.docx

    它包含两个方法:`MyClassListToJson&lt;T&gt;`用于将List&lt;T&gt;转换为Json字符串,`MyJsonToClassList&lt;T&gt;`则将Json字符串转换回List&lt;T&gt;: ```csharp public class ClassListTransString { public string MyClassListToJson...

    collection接口方法[归类].pdf

    15. `public &lt;T&gt; T[] toArray(T[] a)`:与toArray()类似,但允许指定目标数组类型,避免类型转换。 对于List接口,它继承自Collection接口,增加了一些特定于列表的方法: 1. `public void add(int index, E ...

    java常见类源码及注释.doc

    - `&lt;T&gt; T[] toArray(T[] a)`: 将集合转换为特定类型的数组。 **2. 添加和移除元素** - `boolean add(E e)`: 向集合中添加一个元素`e`,如果添加成功返回`true`。 - `boolean remove(Object o)`: 移除指定的对象`o`...

    c#可变数组 快来下

    除了基本的添加、删除和访问元素,`List&lt;T&gt;`还提供了一些额外的有用方法,如`Clear`清空列表,`Count`获取元素数量,`Sort`对列表进行排序,`BinarySearch`进行二分查找,`Contains`检查元素是否存在,以及`ToArray`...

    Jayrock(json字符串解析)

    public static string JsonSerializer&lt;T&gt;(T t) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(); ser.WriteObject(ms, t); string json...

    springboot结合jpa实现分页,动态多条件查询

    List&lt;Predicate&gt; predicates = new ArrayList&lt;&gt;(); if (StringUtils.isNotBlank(username)) { predicates.add(criteriaBuilder.like(root.get("username"), "%" + username + "%")); } if (StringUtils....

    introduction to Rx

    此外,Rx还支持将IObservable&lt;T&gt;转换为其他形式,例如ToEnumerable、ToArray和ToList等。 Rx编程模式鼓励使用声明式编程范式,并依赖于对数据流进行操作的函数。它允许开发者更加灵活地处理异步事件和数据流,使...

Global site tag (gtag.js) - Google Analytics