在Java中,我们总是可以使用一个数组来存储对象引用。 然后我们有一个ArrayList或Hashtable将自动扩展到存储对象。 但没有人知道有对象引用的自动扩展阵列的本地方法是什么?
编辑:我的意思是我想知道如果Java API有一些类存储引用对象的能力(而不是存储像XXXList或哈希表中的实际对象做)和自动扩展的能力。
在Java中,我们总是可以使用一个数组来存储对象引用。 然后我们有一个ArrayList或Hashtable将自动扩展到存储对象。 但没有人知道有对象引用的自动扩展阵列的本地方法是什么?
编辑:我的意思是我想知道如果Java API有一些类存储引用对象的能力(而不是存储像XXXList或哈希表中的实际对象做)和自动扩展的能力。
Java数组是由它们的定义,固定大小。 如果你需要自动增长,您使用XXXList类。
编辑 - 问题已经澄清了一下
当我第一次开始学习Java(从C和C ++背景的),这可能是中绊倒了我的第一件事情之一。 希望我能提供一些线索。
不像C ++,Java中的对象阵列不存储对象。 它们存储对象的引用。
在C ++中,如果你宣布类似的东西:
String myStrings[10];
你会得到10个String对象。 在这一点上,这将是完全合法的做类似的println(myStrings [5]。长度); - 你会得到“0” - 弦乐的默认构造函数创建一个空的字符串长度为0。
在Java中,当你创建一个新的数组,你可以容纳10只字符串引用一个空的容器。 因此呼叫:
String[] myStrings = new String[10];
println(myStringsp[5].length);
会抛出一个空指针异常,因为你并没有真正放在一个String引用到数组呢。
如果你是从C ++背景的,认为新的String [10]为等同于新(字符串*)[10]从C ++的。
因此,考虑到这一点,应该根据需要进行相当清楚为什么ArrayList的是自动扩展的对象数组的解决方案(事实上,ArrayList的实现使用简单数组,内置了一个增长的算法分配新的扩展阵列和副本从旧到新的内容)。
在实践中,有些情况下我们使用数组确实比较少的情况。 如果你在写一个容器(到ArrayList的一个类似于或B树),那么他们是有用的,或者如果你正在做大量的低水平字节操纵的 - 但大多数发展发生的水平,使用Collections类的一个是迄今为止的首选技术。
实现Collection中的所有类是可扩展的,并只存储引用:你不存储对象,在某些数据空间中创建它们,只操作引用他们,直到他们走出去的范围,而不对他们参考。
你可以把一个参考对象在两个或多个类别。 这就是你怎么能有排序的哈希表和这样的...
你说的“原生”的方式呢? 如果你想要一个可扩展的清单f对象,那么你可以使用ArrayList中。 随着名单的集合你的get(index)方法,使您可以访问列表的索引,让你类似的功能到一个数组对象。 内部ArrayList中与数组实现和ArrayList的自动处理扩展它。
直接从阵列Java教程上晒太阳网页:
- >数组是保存单个类型的值的固定数目的容器对象。
因为数组的大小在创建时声明,实际上是没有办法之后展开。 声明一个一定大小的阵列的整个目的是只分配尽可能多的内存来执行该程序时可能会被使用。 你可以做的就是声明第二个数组,它是在原有基础上的大小的功能,所有的原始元素复制到它,然后添加必要的新元素(虽然这不是很“自动” :)) 。 否则,你和其他几个人都提到,列表收藏是最有效的方式去。
在Java中,所有的对象变量引用。 所以
Foo myFoo = new Foo();
Foo anotherFoo = myFoo;
意味着两个变量都指的是同一个对象,而不是两个单独的副本。 同样,当你把一个对象的Collection
,你只保存到对象的引用。 因此,使用ArrayList
或相似是有一个自动扩展件存储的正确方法。
有没有一流的语言结构,做的是,我所知道的,如果这是你在找什么。
这不是很有效的,但如果你只是追加到一个数组,你可以使用Apache的百科全书ArrayUtils.add() 。 它返回原来的阵列,以在它的附加元素的副本。
如果你能在JavaScript编写代码,是的,你可以做到这一点。 JavaScript数组是稀疏数组。 这将扩大任何你想要的方式。
你可以写
一个[0] = 4;
一[1000] = 434;
一个[888] = “字符串”;