为什么我们不能用java制作动态数组
我一直在尝试创建一个动态数组,但它不起作用,所以我在互联网上寻求帮助,但我总是看到一个答案,即基本上Java的数组总是固定的,即使你可以使它动态,你也需要做一些额外的努力。。。但是我想,为什么像这样的东西不能工作
static int objCount = 0;
static int arrayCount = 1;
static Array[] myObject = new Array[arrayCount];
public static void main(String[] args) {
addObject();
addbOject();
for(int i = 0; i < myObject.length; i++)
{
System.out.println(myObject[0].getSomething());
System.out.println(arrayCount);
}
}
public static addObject() {
// Variable instances of var A-C
myObject[objCount] = new Array(varA, varB, varC);
objCount = objCount++;
arrayCount = arrayCount++;
}
我的addObject()
方法无法记录新对象。。。这在逻辑上不可行吗。。。?像每次调用addObject()
一样,它应该增加objCount
和arrayCount
。。。我肯定我错过了什么,任何解释都将不胜感激
PS:我确实放弃了,改用了arraylist
# 1 楼答案
java中数组的大小是不可变的(一旦声明就不能更改)。如果您想使用动态数组,Java为此提供了Vector和ArrayList。阅读并使用它(更容易使用)
# 2 楼答案
Java中的数组是固定的。时期为了解决这个问题,人们发明了列表。有许多不同的实现可供选择,这取决于您的需要
ArrayList
由数组支持
专业人士
缺点
LinkedList
链表是通过保持对列表头部和尾部的引用来实现的。每个元素保留对下一个元素的引用
专业人士
缺点
更多信息请参见here
# 3 楼答案
系统中的数组是什么强>
在RAM中分配的固定块
想象一下它是这样的:
…|Y | A | A | A | Z | T | C |
如果A是您分配的块,那么其他字母是外来空间,管道是分隔符(用于清除)。这意味着您只有4个位置可以插入值。即使更改从中读取值或将值放置到其中的任何位置,也不会扩展数组,并且仍然限制在这4个位置
由于其他原因,外部值可能会直接存储在这之后,所以您没有机会将其变大。相反,您需要分配一个新数组,该数组比以前的数组大,以便有足够的空间容纳新值。并将所有值从旧值移动到新值
代码的问题:
仅实例化一次大小为1的数组。这只分配一个职位。时期无论您在代码中做什么,都不会改变这一点(正如前面指出的)
您的代码会发生以下情况:
addObject();
将数组元素添加到您仅有的一个插槽中。objCount = objCount++;
将objCount
的旧值添加到objCount
(换句话说:它什么都不做),然后将objCount
增加1。 要消除无用的冗余,请将objCount = objCount++;
替换为objCount++;
,直接将其应用于变量,无需重新分配。这是自动发生的李>addObject();
的第二次调用现在尝试在插槽1处放置新元素(注意:数组以索引0=插槽1开始)。这只会超过旧的李>解决方案:
很多人以前都有过这个问题。因此,开发了不同的数据结构,以便能够处理动态调整大小的数组,这些数组可以存储类似于状态的内容(例如,项目数)
在Java中,这些数据结构称为
Lists
。不过,您可以出于自己的目的使用ArrayList(基本上它已经满足了您的需要)。其他针对特定用例的列表已经指出# 4 楼答案
您必须执行ArrayList内部的操作: