java不可变列表实际上意味着不可调整大小吗?

java不可变列表实际上意味着不可调整大小吗?,java,collections,Java,Collections,令人惊讶的是,代码: List<Integer> list = Arrays.asList(1, 3, 2); list.sort(Comparator.comparingInt(Integer::intValue)); System.out.println(list); // prints [1, 2, 3] List-List=Arrays.asList(1,3,2); list.sort(Comparator.comparingInt(Integer::intValue));

令人惊讶的是,代码:

List<Integer> list = Arrays.asList(1, 3, 2);
list.sort(Comparator.comparingInt(Integer::intValue));
System.out.println(list); // prints [1, 2, 3]
List-List=Arrays.asList(1,3,2);
list.sort(Comparator.comparingInt(Integer::intValue));
System.out.println(列表);//印刷品[1,2,3]
不会在我的代码中抛出
UnsupportedOperationException
。但是列表被修改了

所以我的问题是:我是做错了什么还是
不可变的
可以修改?但它无法调整大小。(因此,这个不可调整大小的名称不是更好吗?)


编辑:不可变当然

在java中,
列表是可变的,因此它可以更改,这意味着我们可以通过直接作为赋值语句的一部分访问列表中的项目来更改它。
如果你想制作一个不可修改的列表,你应该选中公共静态列表不可修改列表(List
Arrays)。asList()
没有提到“不可修改”或“不可修改”。它只说明列表的大小是固定的。您仍然可以更改元素,但不能添加任何元素,因为必须调整列表的大小。@Typhon的回答提供了有关不变性的详细信息

package stackoverflow;

import java.util.Arrays;
import java.util.List;


public class FixedSize {
    public static void main(final String[] args) {

        final List<String> fsl = Arrays.asList("A", "B", "C");
        System.out.println("List before change: " + fsl.size());
        for (final String i : fsl) {
            System.out.println("\t" + i);
        }

        try { // this will fail
            fsl.add("1");
            System.out.println("Did not fail for some strange reason");
        } catch (final Exception e) {
            System.out.println("Fails as expoected");
        }


        fsl.set(1, "LOL");

        System.out.println("List after change: " + fsl.size());
        for (final String i : fsl) {
            System.out.println("\t" + i);
        }
    }
    
}
包堆栈溢出;
导入java.util.array;
导入java.util.List;
公共类固定大小{
公共静态void main(最终字符串[]args){
最终列表fsl=Arrays.asList(“A”、“B”、“C”);
System.out.println(“更改前列表:+fsl.size());
用于(最终字符串i:fsl){
System.out.println(“\t”+i);
}
尝试{//这将失败
fsl.添加(“1”);
System.out.println(“由于某种奇怪的原因没有失败”);
}捕获(最终异常e){
System.out.println(“按说明失败”);
}
fsl.set(1,“LOL”);
System.out.println(“更改后的列表:+fsl.size());
用于(最终字符串i:fsl){
System.out.println(“\t”+i);
}
}
}

问题是:你从哪里得到“不可修改”的?它不在你的源代码中。你是否与描述if
Arrays.asList();
有关?对不起,当然是不可变的。我的问题:你从哪里得到“不可变”的概念?它不在你的源代码中。你是否与描述if Arrays.asList()有关是的,我是从
Arrays.asList()
哪里出错了列表是可变的,它允许通过这种方式修改传递给
asList
的数组。很好的解释Jay(+1)
list2.add(3);// throws UnsupportedOperationException
package stackoverflow;

import java.util.Arrays;
import java.util.List;


public class FixedSize {
    public static void main(final String[] args) {

        final List<String> fsl = Arrays.asList("A", "B", "C");
        System.out.println("List before change: " + fsl.size());
        for (final String i : fsl) {
            System.out.println("\t" + i);
        }

        try { // this will fail
            fsl.add("1");
            System.out.println("Did not fail for some strange reason");
        } catch (final Exception e) {
            System.out.println("Fails as expoected");
        }


        fsl.set(1, "LOL");

        System.out.println("List after change: " + fsl.size());
        for (final String i : fsl) {
            System.out.println("\t" + i);
        }
    }
    
}