【问题标题】:Can the Length of String array be changed in JAVA ?JAVA中可以更改字符串数组的长度吗?
【发布时间】:2017-04-19 11:52:20
【问题描述】:

我认为一旦我们定义了大小,字符串数组的长度就不能改变。 但我不确定为什么它允许我在这里更改它(对于一段代码)?

public class Test1 {

    public static void main(String[] args) {

        //size =3
        String[] roleNameArray = { "a", "b", "c" }; 

        // I also tried with 
          //String[] roleNameArray = new String[3];
          //roleNameArray[0]="a";
          //roleNameArray[1]="b";
          //roleNameArray[2]="c";

        System.out.println(roleNameArray.length);

        roleNameArray = addMoreValues();

        // size changed to 4
        System.out.println(roleNameArray.length);
    }

    public static String[] addMoreValues() {
        final String[] roleNameArra = new String[4];
        roleNameArra[0] = "a";
        roleNameArra[1] = "b";
        roleNameArra[2] = "c";
        roleNameArra[3] = "d";
        return roleNameArra;
    }

}

输出:- 3 4

这里我们初始化数组“roleNameArray”时的size=3 然后大小变为 4,因为“roleNameArra”等同于“roleNameArray”。

问题:-

  • 这种情况下String数组的大小变了吗?

  • 如果不是,在这种 JAVA 情况下,内存中会发生什么? (爪哇 使用的版本 1.8)

【问题讨论】:

  • 您创建一个数组并重新分配它
  • 不,大小没有改变,您只是在同一个变量中存储了一个全新且不相关的数组。
  • 如果你不知道大小,使用类似 ArrayList (docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)
  • 好的,谢谢你的回答。但是在这种情况下,旧数组会发生什么,它会成为“垃圾收集器”的一部分吗?
  • 老实说,你自称是“高级 Java 开发工程师”,却问这么基本的问题?

标签: java arrays string memory-management


【解决方案1】:

addMoreValues 方法中,您正在创建一个新数组,它与旧数组无关。仅因为您使用对新数组的引用填充了名为 roleNameArray 的变量,您才会看到更新后的长度。如果你只是调用addMoreValues而不更新局部变量(所以没有roleNameArray =),将使用旧的和未更改的数组。

【讨论】:

  • 好的,谢谢你的回答。但是在这种情况下,旧数组会发生什么,它会成为“垃圾收集器”的一部分吗?
  • 旧数组仍然存在,如果它仍然存储在某个变量(或其他任何地方)中,GC 将不会收集它。但是,在您的情况下,没有任何东西可以访问旧数组实例,因此 GC 会将其从内存中删除(稍后)。
  • 真的,垃圾收集器很可能不会收集旧数组:在程序终止之前它没有机会。不过,旧数组有资格进行收集。在一个更大、更长时间运行的程序中,它是否被收集主要取决于其他东西是否需要空间。
  • 非常感谢您的帮助。
【解决方案2】:

那是因为您创建了新数组实例

final String[] roleNameArra = new String[4];

然后您将旧数组的引用更改为新数组的引用(从函数返回)。

【讨论】:

  • 好的,谢谢你的回答。但是在这种情况下,旧数组会发生什么,它会成为“垃圾收集器”的一部分吗?
【解决方案3】:

也许是这个?

final String[] roleNameArra = new String[4];

您并没有改变它的大小,而是将它分配给一个新的。

我建议您阅读有关 java 集合的更多信息。

【讨论】:

  • 好的,谢谢你的回答。但是在这种情况下,旧数组会发生什么,它会成为“垃圾收集器”的一部分吗?
  • 没有你的旧数组指向另一个数组(在内存级别)。对你来说简单点:它是同一个灵魂,但你给了它一个不同的身体。我希望这是有道理的。
【解决方案4】:

您没有更改 roleNameArray 的长度。在您的方法中,您创建了大小为 4 的新数组,然后返回了对它的引用。

所以现在在 roleNameArray 中,你的方法是数组,而不是 main。

【讨论】:

  • 好的,谢谢你的回答。但是在这种情况下,旧数组会发生什么,它会成为“垃圾收集器”的一部分吗?
  • @GoravAgarwal 完全正确。无法再次访问该引用。除非您创建完全相同的数组,否则它可能会在内存中占据完全不同的位置
猜你喜欢
  • 2021-11-02
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多