当前位置: 首页 > 知识库问答 >
问题:

函数中更改的final static数组列表[重复]

梁池暝
2023-03-14

我定义了静态最终ArrayList,然后我将其发送到其他类进行更改。但它应该只在第二个类中本地更改,因为他是最终的,就像我示例中的int一样。为什么它也在Main类中更改?

小代码示例:

public class Main {

    private static final ArrayList<String> myList = new ArrayList<>(Arrays.asList("One", "Two"));
    private static final int num = 5;

    public static void main(String[] args) {

        SecondClass second = new SecondClass(myList,num);
        System.out.println("List in Main: "+myList.get(0));
        System.out.println("Num in Main: "+num);
    }
}

public class SecondClass {

    public SecondClass(ArrayList<String> list, int num)
    {
       list.set(0,"Three");
       num = 10;

        System.out.println("List in second: "+list.get(0));
       System.out.println("Num in Second: "+num);
    }
}

我的输出:

List in second: Three
Num in Second: 10
List in Main: Three
Num in Main: 5

我所期望的是:

List in second: Three
Num in Second: 10
List in Main: One
Num in Main: 5

共有2个答案

干弘深
2023-03-14

final关键字阻止为myList变量分配另一个值,但它不阻止对列表实例本身的更改。

您需要的是一个无法修改的列表。所以您可以使用不可修改的列表:

private static final ArrayList<String> myList =     
        Collections.unmodifiableList(Arrays.asList("One", "Two"));
李经国
2023-03-14

myList是不可变的;它指向的对象不是。使用集合。如果您希望列表的内容不可变,则可以使用unmodifiableList()(或类似番石榴的不可变列表)。

(在方法签名中使用数组列表是一种不好的形式。如果你有很好的理由需要这种行为,只需使用列表或随机访问列表即可。)

 类似资料:
  • 正如上面的注释的改装文档中所述: 传递列表或数组将为每个非空项生成一个查询参数。 到目前为止,我的呼叫看起来如下所示: 这是可行的,但会导致相当长的URL和相当快的URL。 例如。对于,请求URL已经是。 是否有一种简单的方法来交换这种导致数组格式化为或类似内容的行为? 我想到的是: 使用JsonArray作为参数,但在调用之前,我需要转换每个数组/列表 截取每个请求并压缩重复密钥 重写内置的修饰

  • 问题内容: 我有一个像这样的NumPy数组: 我知道我可以使用例如花式索引来替换位于位置的值: 但是,如何替换不在的位置的值?像下面这样吗? 问题答案: 我不知道这样做的干净方法: 当然,如果您更喜欢使用numpy数据类型,则可以使用-输出不会有任何差异。确实,这只是一个偏好问题。

  • 我对变量的作用域有问题。 我希望输出为,但结果是。为什么我在方法中改变了数组中的值,而原来的数组却改变了?

  • 我有一个arraylist的arraylist,每个arraylist都有相同的点,例如,当您打印时,这是输出 在打印之前,我要删除其x值不等于数组列表索引的所有点 所以输出应该是 我尝试使用remove方法和for循环以及其他方法,但都不起作用。 有人能帮忙吗?

  • 问题内容: 这似乎是一个愚蠢的问题,但是此函数是否会实际影响变量(我将如何使用此变量的上下文更大,但这基本上是我不确定的问题)?(我专门问有关java) 问题答案: 考虑一个稍微不同的示例: 运行该程序的输出为: 该变量将更改为true,但是一旦方法返回,该参数变量就会消失(这就是人们所说的“超出范围”的意思)。但是,传递给方法的变量保持不变。