JDK代码中关于ArrayList构造器中的一个问题。 本帖最后由 walang 于 2010-07-13 22:43:10 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 第一个问题可能出于效率考虑,未考证第二个问题,是为了没用的元素可以被GC垃圾回收,如果没有置null,数组引用了没用的对象,但该对象对用户来说确实是无用的,却得不到释放,长此以往,就outofmemory了 public <T> T[] toArray(T[] a) { int size = size(); if (a.length < size) a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); Iterator<E> it=iterator();Object[] result = a; for (int i=0; i<size; i++) result[i] = it.next(); if (a.length > size)a[size] = null; return a; }实在理解不了,哪位大虾解释下,明天继续揣摩 1:Arrays 中的 ArrayList 是内部类。而且私有。你如果想使用,只能通过其父类类型的变量对其引用。2:Arrays 中的 ArrayList 对 AbstractList 的实现与 java.util.ArrayList 不同,最大的区别是 Arrays 中的 ArrayList 类的大小是不可变的。也就是说,一旦创建了这个 ArrayList (这个你不能直接控制创建,因为它是 private 的),它的 size 将不能改变。即不能向 ArrayList 中添加和删除元素。这个不对,虽然看似是这个效果,但是概念上就错了。在 Java 中,如果两个存在两个同名的类,那么区分它们的唯一办法就是通过类的“完整限定名”(即:包名.类名)这也是 java 引入“包”的目的。这之所以在 Arrays 中 new ArrayList<T> 创建的不是 java.util.ArrayList 而是 Arrays 的内部类-ArrayList 是因为1:Arrays 中没有 import java.util.ArrayList;2:创建 ArrayList 的编码为: new ArrayList() 。 因为没有 import 其它包中的 ArrayList ,也没有在该类名前指定包名,所以 JVM 认为该 ArrayList 是当前包中的类(有点类似于“相对路径”,这只是个人感觉,不要影响你啊,呵呵。)。(如果是 new java.util.ArrayList() 则创建的肯定就是java.util.ArrayList() 类)这个在 API 文档中有说明,当然是参考 java.util.ArrayList 的说明,但作用和目的,我想是一致的。可见设置 null 的作用是为了标识原 ArrayList 的列表长度。但需要一定的条件,即:Arrays.ArrayList does not contain any null elements你的意思应该是正确的吧,呵呵。准确一些说应该是,将 Arrays.ArrayList 中的元素。拷贝到了 Java.util.ArrayList 中。 Swing做一个简单的Socket通信的程序,有个问题 JFrame置顶到cs1.5游戏画面之前,怎么办到? 关于Java中的线程池 基础吧!!!!!SWT.JAR问题 报错java.util.MissingResourceException,什么原因泥? 安装问题,不难?即答即结! jb7一个奇怪的问题?不知道高手们碰到没有。 WebLogic、Corba、M3IdlToJava,有知道的请赐教! 关于用delphi调用Tomcat Soap的问题 图片处理的问题!给很多分的! 我写的一个冒泡排序法(不用交换数值) struts1 单例的认识求教
第二个问题,是为了没用的元素可以被GC垃圾回收,如果没有置null,数组引用了没用的对象,但该对象对用户来说确实是无用的,却得不到释放,长此以往,就outofmemory了
int size = size();
if (a.length < size)
a = (T[])java.lang.reflect.Array
.newInstance(a.getClass().getComponentType(), size); Iterator<E> it=iterator();
Object[] result = a;
for (int i=0; i<size; i++)
result[i] = it.next();
if (a.length > size)
a[size] = null;
return a;
}
实在理解不了,哪位大虾解释下,明天继续揣摩
2:Arrays 中的 ArrayList 对 AbstractList 的实现与 java.util.ArrayList 不同,最大的区别是 Arrays 中的 ArrayList 类的大小是不可变的。也就是说,一旦创建了这个 ArrayList (这个你不能直接控制创建,因为它是 private 的),它的 size 将不能改变。即不能向 ArrayList 中添加和删除元素。这个不对,虽然看似是这个效果,但是概念上就错了。在 Java 中,如果两个存在两个同名的类,那么区分它们的唯一办法就是通过类的“完整限定名”(即:包名.类名)这也是 java 引入“包”的目的。这之所以在 Arrays 中 new ArrayList<T> 创建的不是 java.util.ArrayList 而是 Arrays 的内部类-ArrayList 是因为
1:Arrays 中没有 import java.util.ArrayList;
2:创建 ArrayList 的编码为: new ArrayList() 。 因为没有 import 其它包中的 ArrayList ,也没有在该类名前指定包名,所以 JVM 认为该 ArrayList 是当前包中的类(有点类似于“相对路径”,这只是个人感觉,不要影响你啊,呵呵。)。(如果是 new java.util.ArrayList() 则创建的肯定就是java.util.ArrayList() 类)这个在 API 文档中有说明,当然是参考 java.util.ArrayList 的说明,但作用和目的,我想是一致的。
可见设置 null 的作用是为了标识原 ArrayList 的列表长度。但需要一定的条件,即:Arrays.ArrayList does not contain any null elements你的意思应该是正确的吧,呵呵。准确一些说应该是,将 Arrays.ArrayList 中的元素。拷贝到了 Java.util.ArrayList 中。