Java 更改数组大小

Java 更改数组大小,java,arrays,class,Java,Arrays,Class,我正在尝试这样做,以便您可以使用方法更改数组的大小 private String[] options; public static void initOptions(int num) { options = [4]; // this doesn't obviously work } 我可以创建一个新变量 private String[] options; public static void initOptions(int num) { String[] options =

我正在尝试这样做,以便您可以使用方法更改数组的大小

private String[] options;

public static void initOptions(int num)
{
    options = [4]; // this doesn't obviously work
}
我可以创建一个新变量

private String[] options;

public static void initOptions(int num)
{
    String[] options = new String[num];
}

但是,这样我就无法与类中的其他成员共享该数组。

首先,options字段的静态属性与initOptions函数之间存在不匹配。通常你希望它们是一样的。也就是说,你也想要

private String[] options;

public void initOptions(int num)
{
    options = new String[num];
}

第一种情况下,类的每个实例都有一个选项数组,第二种情况下,类的所有实例都共享一个选项数组

但是,这并不会真正改变数组的大小。 一旦设置了阵列大小,它就无法更改。它所做的是创建一个所需大小的新数组,并将其分配给字段

如果没有其他人在使用options的旧值,那么它将被垃圾收集,并且它的旧值都不会出现在newoptions实例中。如果要保留所有旧选项,则需要将它们复制到新阵列中。另外,保留在原始选项字段上的任何内容都不会看到更改,因为它们将保留旧数组,而不是新创建的版本

private String[] options;

public void initOptions(int num)
{
    String newOptions = new String[num];
    for(int i=0; i<Math.min(num, options.length); ++i ) {
      newOptions[i] = options[i];
    }
    options = newOptions;
}
有一些helper UTIL可以让您在core Arrays包中进行一些复制,但最好先了解发生了什么


如果希望“选项”字段的其他持有者看到更改,可以改为使用ArrayList来保存选项,因为它支持长度更改,而不需要新创建的对象

如果希望为字段选项指定方法返回的选项值,可以编写

public void initOptions(int num){
    String[] options=new String[num];
    this.options=options;
}

然后从main调用字段f.e将调用数组。

您使用的是实例变量options和静态方法,不可能将它们混合使用。您将以编译器错误结束。如果您对此没有实际限制,请选择使options变量为静态或将initOptions更改为非静态,因此,您的代码将非常简单:

private static String[] options;

public static void initOptions(int num) {
       options = new String[num];
}

因此,结合您的两个选择:选项=新字符串[num];去掉字符串[]options=将其更改为just options=…@Tristan,使用实例变量和静态方法是否重要?因为如果不是这样的话,它将非常重要easy@Tarik,可以不使用任何静态的东西吗?@Tristan为什么不?在我的回答中,你可以从两者中删除static关键字,这将非常有效,但真正的答案取决于你的需要,所以我不能告诉你是否真的需要在你的程序中使用static,因为我没有足够的关于i数组创建后的信息,你不能改变它的大小。我不知道是否有必要提到垃圾收集。这就引出了一些问题,比如如何确保这些值被垃圾收集?JVM会垃圾收集这些对象吗?我仍然有一个参考,因为询问者认为他们需要做一些特殊的事情来控制垃圾收集垃圾收集不是什么特殊的事情,但它是语言的一个重要部分。我想说的是被销毁而不是将被垃圾收集,但是如果你使用Java,你需要知道什么是垃圾收集,什么不是。我想说的是,你将无法通过选项访问旧阵列-是的,如果没有其他东西在使用它们,它们最终将被销毁,但这并不影响程序的正确性。影响您的程序的是选项现在引用了其他内容。@MichaelAnderson这甚至不会编译!如果在静态方法中使用实例变量,将出现编译器错误:无法对非静态字段进行静态引用options@Tarik,啊,你是对的,唯一需要的改变是要么使选项为静态的,要么使initOptions为非静态的。我已经对其进行了调整,并修复了示例代码。
private static String[] options;

public static void initOptions(int num) {
       options = new String[num];
}