为什么字符串String是不可变字符串&&"".equals(str)与str.equals("")的区别

为什么字符串String是不可变字符串

实际上String类的实现是char类型的数组

虽然说源码中设置的是private final char[] value;

final关键词表示不可变动

但是只是不能直接在value这个数组的引用地址入手

还是可以在数组value中进行更改

像是value[2] = 1;

但是设计者巧妙地避开了这个坑

还把数组设为final

public static void main(String[] args) {
  final char[] value = {1,2,3,4};
  char[] v = new char[4];
  value = v;
}
public static void main(String[] args) {
    final char[] value = {1,2,3,4};
    value[2] = 6;
    System.out.println(value);
}

虽然字符串本身不能改

但是可以改字符串变量指向另一个字符串的地址

而且字符串是有一个共享的字符串常量池(这里等我读《深入Java虚拟机》之后再填坑)

所以如果复制一个字符串变量

原始字符串与复制的字符串共享相同的字符

其实也是因为java的特性之一------没有可以直接改变内存变量的指针

"".equals(str)与str.equals("")的区别

"".equals(str)这种写法可以规避系统报空指针异常错误

1 class Solution {
2   private static String a;
3   public static void main(String[] args) {
4     if("".equals(a))
5       System.out.println("''.equals(a)");
6     if(a.equals(""))
7       System.out.println("a.equals('')");
8   }
9 }

猜你喜欢

转载自www.cnblogs.com/NYfor2018/p/8907198.html