这是为什么?String s1 = Hello;String s2 = Hello;String s3 = Hel + lo;String s4 = Hel + new Stringlo;String s5 = new StringHello;String s7 = H;String s8 = ello;String s9 = s7 + s8;Systemoutprintlns1 == s2;
这是因为Java中的字符串是通过字符串常量池来管理的。
在Java中,字符串常量池是一个位于堆中的特殊存储区域,用于存储字符串常量。当我们创建一个字符串时,如果字符串常量池中已经存在相同内容的字符串常量,那么就会直接返回该字符串常量的引用,而不会创建新的字符串对象。
对于s1和s2,它们的值都是"Hello",由于字符串常量池中已经存在该字符串常量,所以s1和s2都指向同一个字符串对象,因此s1 == s2返回true。
对于s3,它的值是"Hel" + "lo",由于该字符串是通过字符串常量的拼接得到的,编译器在编译时会对其进行优化,将其直接替换成"Hello",所以s3也指向同一个字符串对象,因此s1 == s3返回true。
对于s4,它的值是"Hel" + new String("lo"),由于new String("lo")是通过new关键字创建的新的字符串对象,所以s4指向的是一个新的字符串对象,而不是字符串常量池中已存在的字符串对象,因此s1 == s4返回false。
对于s9,它的值是s7 + s8,s7和s8都是变量,编译器在编译时无法确定其值,所以s9指向的是一个新的字符串对象,而不是字符串常量池中已存在的字符串对象,因此s1 == s9返回false
原文地址: https://www.cveoy.top/t/topic/iY0J 著作权归作者所有。请勿转载和采集!