GVKun编程网logo

.toArray(new MyClass[0]) 还是 .toArray(new MyClass[myList.size()])?(toarray java)

9

这篇文章主要围绕.toArray(newMyClass[0])还是.toArray(newMyClass[myList.size()])?和toarrayjava展开,旨在为您提供一份详细的参考资料。

这篇文章主要围绕.toArray(new MyClass[0]) 还是 .toArray(new MyClass[myList.size()])?toarray java展开,旨在为您提供一份详细的参考资料。我们将全面介绍.toArray(new MyClass[0]) 还是 .toArray(new MyClass[myList.size()])?的优缺点,解答toarray java的相关问题,同时也会为您带来ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?、ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象、ArrayList 类方法toArray的一点疑惑、ArrayList.clear、=null、new Arraylist 之间的对比区别的实用方法。

本文目录一览:

.toArray(new MyClass[0]) 还是 .toArray(new MyClass[myList.size()])?(toarray java)

.toArray(new MyClass[0]) 还是 .toArray(new MyClass[myList.size()])?(toarray java)

假设我有一个 ArrayList

ArrayList<MyClass> myList;

我想调用toArray,是否有性能原因使用

MyClass[] arr = myList.toArray(new MyClass[myList.size()]);

超过

MyClass[] arr = myList.toArray(new MyClass[0]);

?

我更喜欢第二种风格,因为它不那么冗长,而且我假设编译器会确保不会真正创建空数组,但我一直想知道这是不是真的。

当然,在 99% 的情况下,它不会以某种方式产生影响,但我想在我的正常代码和优化的内部循环之间保持一致的风格......

答案1

小编典典

与直觉相反,Hotspot 8 上最快的版本是:

MyClass[] arr = myList.toArray(new MyClass[0]);

我已经使用 jmh 运行了一个微基准测试,结果和代码如下,表明具有空数组的版本始终优于具有预定义数组的版本。请注意,如果您可以重用正确大小的现有数组,结果可能会有所不同。

基准测试结果(分数以微秒为单位,更小 = 更好):

Benchmark                      (n)  Mode  Samples    Score   Error  Unitsc.a.p.SO29378922.preSize         1  avgt       30    0.025 ▒ 0.001  us/opc.a.p.SO29378922.preSize       100  avgt       30    0.155 ▒ 0.004  us/opc.a.p.SO29378922.preSize      1000  avgt       30    1.512 ▒ 0.031  us/opc.a.p.SO29378922.preSize      5000  avgt       30    6.884 ▒ 0.130  us/opc.a.p.SO29378922.preSize     10000  avgt       30   13.147 ▒ 0.199  us/opc.a.p.SO29378922.preSize    100000  avgt       30  159.977 ▒ 5.292  us/opc.a.p.SO29378922.resize          1  avgt       30    0.019 ▒ 0.000  us/opc.a.p.SO29378922.resize        100  avgt       30    0.133 ▒ 0.003  us/opc.a.p.SO29378922.resize       1000  avgt       30    1.075 ▒ 0.022  us/opc.a.p.SO29378922.resize       5000  avgt       30    5.318 ▒ 0.121  us/opc.a.p.SO29378922.resize      10000  avgt       30   10.652 ▒ 0.227  us/opc.a.p.SO29378922.resize     100000  avgt       30  139.692 ▒ 8.957  us/op

供参考,代码:

@State(Scope.Thread)@BenchmarkMode(Mode.AverageTime)public class SO29378922 {  @Param({"1", "100", "1000", "5000", "10000", "100000"}) int n;  private final List<Integer> list = new ArrayList<>();  @Setup public void populateList() {    for (int i = 0; i < n; i++) list.add(0);  }  @Benchmark public Integer[] preSize() {    return list.toArray(new Integer[n]);  }  @Benchmark public Integer[] resize() {    return list.toArray(new Integer[0]);  }}

总结一下:JVM 和 JIT 编译器包含几个优化,使其能够廉价地创建和初始化一个新的大小正确的数组,如果您自己创建数组,则无法使用这些优化。

ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?

ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?

ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?

ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象

ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象

java面试要点---ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。

ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象。 
1.刚刚看到的时候,也是很纳闷后来仔细看了下,java的反射机制;
2.这个可以通过java的反射机制来实现;
3.下面是一个例子:
 package com.credream.refelect;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class TestFile {
public static void main(String[] args) throws Exception {
List<Integer> list = new ArrayList<Integer>(); //定义Integer泛型
String str = "abc"; 
Method[] method=list.getClass().getMethods();//取得list的所有方法
System.out.println(method.length);
for(int i=0;i<method.length;i++){
System.out.println(method[i]);//遍历打印list的方法
}
method[0].invoke(list, str);//通过 反射来执行 list的第一个方法,第一个是list对象,代表该对象的方法,第二个是方法参数:  就是list.add(str);
System.out.println(list.size());
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
 ------------------------------------------------------------------------------------------------------------------
运行结果:
 35
public boolean java.util.ArrayList.add(java.lang.Object)
public void java.util.ArrayList.add(int,java.lang.Object)
public java.lang.Object java.util.ArrayList.get(int)
public java.lang.Object java.util.ArrayList.clone()
public int java.util.ArrayList.indexOf(java.lang.Object)
public void java.util.ArrayList.clear()
public boolean java.util.ArrayList.contains(java.lang.Object)
public boolean java.util.ArrayList.isEmpty()
public int java.util.ArrayList.lastIndexOf(java.lang.Object)
public boolean java.util.ArrayList.addAll(int,java.util.Collection)
public boolean java.util.ArrayList.addAll(java.util.Collection)
public int java.util.ArrayList.size()
public java.lang.Object[] java.util.ArrayList.toArray(java.lang.Object[])
public java.lang.Object[] java.util.ArrayList.toArray()
public boolean java.util.ArrayList.remove(java.lang.Object)
public java.lang.Object java.util.ArrayList.remove(int)
public java.lang.Object java.util.ArrayList.set(int,java.lang.Object)
public void java.util.ArrayList.ensureCapacity(int)
public void java.util.ArrayList.trimToSize()
public int java.util.AbstractList.hashCode()
public boolean java.util.AbstractList.equals(java.lang.Object)
public java.util.Iterator java.util.AbstractList.iterator()
public java.util.List java.util.AbstractList.subList(int,int)
public java.util.ListIterator java.util.AbstractList.listIterator(int)
public java.util.ListIterator java.util.AbstractList.listIterator()
public java.lang.String java.util.AbstractCollection.toString()
public boolean java.util.AbstractCollection.containsAll(java.util.Collection)
public boolean java.util.AbstractCollection.removeAll(java.util.Collection)
public boolean java.util.AbstractCollection.retainAll(java.util.Collection)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
1
abc

ArrayList 类方法toArray的一点疑惑

ArrayList 类方法toArray的一点疑惑

 

 

 

ArrayList.clear、=null、new Arraylist 之间的对比区别

ArrayList.clear、=null、new Arraylist 之间的对比区别

参考博文

1. 使用 ArrayList 的对象方法 clear ()

1 List list = new ArrayList();
2 List list1 = list;
3 list.add(1);
4 list.add(2);
5 list.add(3);
6 list.clear();

 ArrayList 对象内部维护一个对象数组 elementData, 当执行 clear () 方法时, 会执行循环将 elementData 中每一个坐标都设置为为 null, 并设置数组的 size 为 0;我们还可以使用该 list 进行操作

clear 源码如下

public void clear() {
        modCount++;

        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;

        size = 0;
}

2. 使用 = null

ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("1");
list.add("2");
list = null;

直接将变量 list 指向 null,通常当我们不需要再使用 ArrayList 对象时,可以将变量值设为 null,以便 GC 可以运作并回收这部分内存空间。

需要注意的是当仍有其他变量指向该对象时,即使讲变量 list 置为 null 垃圾回收器也无法回收该内存空间。如下:

ArrayList<String> list = new ArrayList<String>();
ArrayList<String> arraylist = list;
list.add("0");
list.add("1");
list.add("2");
list = null; // 此时list变量指向null,而arraylist变量仍然指向原内存空间,原内存空间得不到释放

3. 使用 = new ArrayList ()

方法 3 有点类似于方法 1,都是得到一个空的 ArrayList 对象。不过 new ArrayList () 会得到一个初始化内部数组 elementData 容量为 10 的 ArrayList 对象,而方法 1 得到的对象的容量与原对象一致。值得注意的是使用方法 3 需要进行如在内存中重新开辟内存空间等操作,开销较大,如果只是单纯的想要使用空的 ArrayList 对象,建议使用方法 1,相对来说可尽量避免堆内存溢出问题。

 

今天的关于.toArray(new MyClass[0]) 还是 .toArray(new MyClass[myList.size()])?toarray java的分享已经结束,谢谢您的关注,如果想了解更多关于ArrayList al = new ArrayList();有什么区别?和ArrayList al = new ArrayList(0)?、ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象、ArrayList 类方法toArray的一点疑惑、ArrayList.clear、=null、new Arraylist 之间的对比区别的相关知识,请在本站进行查询。

本文标签: