String a="ab";
String c="abc";
String b=a+"c";
System.out.println((c==b));//false
问题:为啥a是一个对象,而“b”是一个字符串,为啥可以相加得b?为啥得false ?
在内存中是怎么变化的,怎样运算的,求大神解惑。
如果你能再加一个就更有趣了
String d = "ab" + "c";
c == d的判断结果为true
原因:
String b = a + "c"是 一个变量 + 一个已知的字符串
String d = "ab" + "c"是一个已知的字符串 + 另一个已知的字符串
在编译期间,String c的值为“abc”是已知的字面量,String d 的结果也是已知的字面量,所以c和d在jvm编译时都会把常量区的"abc"赋值给它们
而String b在编译期间是未知的,谁知道a在运行时到底是什么,所以jvm会给b开辟一个新的内存空间,因而b和c就不等了。
因为a是你赋予给他的,而你不能将对象赋给对象,所以进行操作的过程中其实进行了转换,就将b转换为了字符串。
a 是对象,b也是对象。它们都是字符串,相同类型,可以相加,a="ab",b="abc",所以是false
java里字符串常量也是对象,也就是说"c"也是一个String类型对象,也有自己的方法,可以输出下"c".length()试试。所以"c"的类型和a的类型是一样的,所以可以相加并且赋值给b,所以b的值是"abc",a的值是"ab",因为ab不相等,所以结果是false。因为a,b不是new出来的,所以存栈占内存中可以直接用==来比较,如果是new出来的对象,需要使用equals方法来比较
c是一个对象,b是另外一个对象。
对象的值存放在栈中,对象会有一个指向这个值的地址
==比的是对象的地址。
你如果用c.equals(b)的话就是true