讨论/《Java 面试突击》 - 字符串/
《Java 面试突击》 - 字符串
共 7 个回复

这里的 a 是一个指向一个数组对象的引用,而 a[0] 是指向整数。final int[] a = new int[5],则 a 不能再指向其它对象了,但是 a[0] 可以。

final int[] a = new int[5];
a = new int[5]; // 错误,不能让 a 指向其它对象
a[0] = 2; // 正确,a[0] 可以指向其它对象
2

又创建一个新的数组,你看不到,

1

按你的说法,下面代码会编译不通过,但是实际上能通过,而且数组a中的值确实被改了。

public class A{
    static final a=new int[5];
    public static void main(String[] args){
        Systemy.out.println(Arrays.toString(a));
        a[0]=1;
        Systemy.out.println(Arrays.toString(a));
    }
} 
1

我觉得文中说的“数组使用关键词 final 修饰,因此数组内容不可变”,这句话并不对,final修饰的char数组value的内容应该是能改的,只是value不能指向其他的数组对象而已,并且因为该数组为private,也没有对外提供修改的方法,所以字符串对象才无法修改。

1

StringBuffer 对方法加了同步锁,因此其效率略低于 StringBuilder,但是在多线程的环境下,StringBuilder 不能保证线程安全,因此 StringBuffer 是更优的选择。

你说得对,我错误地理解了final修饰引用类型时的作用,这里的a不能指向别的int[],但是这个数组的内容是可以改变的。

final修饰的内容是不可改变的吧,这里不讨论反射