有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么我们不能用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()一样,它应该增加objCountarrayCount。。。我肯定我错过了什么,任何解释都将不胜感激

PS:我确实放弃了,改用了arraylist


共 (4) 个答案

  1. # 1 楼答案

    java中数组的大小是不可变的(一旦声明就不能更改)。如果您想使用动态数组,Java为此提供了Vector和ArrayList。阅读并使用它(更容易使用)

  2. # 2 楼答案

    Java中的数组是固定的。时期为了解决这个问题,人们发明了列表。有许多不同的实现可供选择,这取决于您的需要

    ArrayList

    由数组支持

    专业人士

    • 访问时间为O(1),因此,ArrayList适用于大多数情况,特别是迭代

    缺点

    • 虽然向列表中添加项在技术上也具有O(1)的复杂性,但如果备份数组不够大,则可能需要将其放大
    • 删除项的复杂性为O(n)

    LinkedList

    链表是通过保持对列表头部和尾部的引用来实现的。每个元素保留对下一个元素的引用

    专业人士

    • 链表使添加、删除或交换元素变得很容易(一切都是O(1))

    缺点

    • 访问链表中的元素具有O(n)的复杂性,因为必须从列表的开头读取所有元素,直到找到所需的元素。因此,链表更适合于具有频繁写入访问和少量读取的用例

    更多信息请参见here

  3. # 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. # 4 楼答案

    您必须执行ArrayList内部的操作:

    1. 分配一个具有所需大小的新阵列(通常为大小的1.5到2倍,以最大限度地减少这种情况频繁发生的可能性)
    2. 将内容从当前数组复制到新数组
    3. 将新数组分配给旧数组的变量