在Java中,我们总是可以使用数组来存储对象引用。然后我们有一个ArrayList或HashTable,它可以自动扩展为存储对象。但有没有人知道一种自动扩展的对象引用数组的本地方式?
编辑:我的意思是我想知道Java API是否有一些类能够存储对象的引用(但不存储实际对象,如XXXList或HashTable)和自动扩展的能力。 / p>
答案 0 :(得分:5)
编辑 - 问题已经澄清了一点
当我第一次开始学习Java(来自C和C ++背景)时,这可能是让我绊倒的第一件事。希望我能说清楚。
与C ++不同,Java中的对象数组不存储对象。它们存储对象引用。
在C ++中,如果你宣称类似于:
String myStrings[10];
你会得到10个String对象。在这一点上,做一些像println(myStrings [5] .length)这样的事情是完全合法的。 - 你得到'0' - String的默认构造函数创建一个长度为0的空字符串。
在Java中,当您构造一个新数组时,您将获得一个可容纳10个String引用的空容器。所以电话:
String[] myStrings = new String[10];
println(myStringsp[5].length);
会抛出一个空指针异常,因为你还没有将String引用放入数组中。
如果您来自C ++背景,请将新的String [10]视为等同于C ++中的new(String *)[10]。
因此,考虑到这一点,应该相当清楚为什么ArrayList 是自动扩展对象数组的解决方案(事实上,ArrayList是使用简单数组实现的,具有增长算法内置的,根据需要分配新的扩展数组,并将内容从旧的复制到新的。)
实际上,我们使用数组的情况实际上相对较少。如果您正在编写容器(类似于ArrayList或BTree),那么它们很有用,或者如果您正在进行大量低级字节操作 - 但是在大多数开发发生的级别上,使用其中一个Collections类是迄今为止首选的技术。
答案 1 :(得分:4)
实现Collection的所有类都是可扩展的并且只存储引用:你不存储对象,你在一些数据空间中创建对象,只操纵对它们的引用,直到它们超出范围而不引用它们。
您可以在两个或多个集合中引用对象。这就是你如何排序哈希表等等......
答案 2 :(得分:1)
你的“本土”方式是什么意思?如果需要可扩展列表f对象,则可以使用ArrayList。使用List集合,您可以使用get(index)方法,该方法允许您通过索引访问列表中的对象,从而为您提供与数组类似的功能。在内部,ArrayList是用数组实现的,ArrayList会自动为你扩展它。
答案 3 :(得分:1)
直接来自太阳网页上的Array Java Tutorials:
- >数组是一个容器对象,它包含单个类型的 固定 数量的值。
因为数组的大小是在创建时声明的,所以实际上没有办法在之后扩展它。声明一定大小的数组的唯一目的是仅分配在执行程序时可能使用的内存。你可以做的是声明第二个数组,它是一个基于原始大小的函数,将所有原始元素复制到其中,然后添加必要的新元素(尽管这不是非常'自动':))。否则,正如您和其他一些人所提到的那样,列表集合是最有效的方法。
答案 4 :(得分:1)
在Java中,所有对象变量都是引用。所以
Foo myFoo = new Foo();
Foo anotherFoo = myFoo;
表示两个变量都指向同一个对象,而不是两个单独的副本。同样,当您将对象放在Collection
中时,您只存储对该对象的引用。因此,使用ArrayList
或类似方法是获得自动扩展存储的正确方法。
答案 5 :(得分:0)
没有一流的语言构造可以做到我所知道的,如果那就是你正在寻找的东西。
答案 6 :(得分:0)
效率不高,但如果您只是附加到数组,则可以使用Apache Commons ArrayUtils.add()。它返回原始数组的副本,其中包含其他元素。
答案 7 :(得分:-5)
如果你可以用javascript编写代码,是的,你可以这样做。 javascript数组是稀疏数组。它会以你想要的方式扩展。
你可以写
a [0] = 4;
a [1000] = 434;
a [888] =“一个字符串”;