看到一个关于String的帖子
public class Test {
public static void main(String[] args) {
String s1 = "sss111";
String s2 = "sss111";
}
}在上面程序中存在2个相同的常量"sss111",对于n个值相同的String常量,在Constant Pool中
只会创建一个,所以在编译好的class文件中,我们只能找到一个对"sss111"的表示:
String s1 = "sss111"应该是一个局部变量才对,不是有final修饰符的才是常量吗?
public class Test {
public static void main(String[] args) {
String s1 = "sss111";
String s2 = "sss111";
}
}在上面程序中存在2个相同的常量"sss111",对于n个值相同的String常量,在Constant Pool中
只会创建一个,所以在编译好的class文件中,我们只能找到一个对"sss111"的表示:
String s1 = "sss111"应该是一个局部变量才对,不是有final修饰符的才是常量吗?
"sss111" 是一个固定的字符串,在java中创建好的字符串时不能被修改的,故为常量
sss111 在java栈中被共享。s1,s2都指向sss111
"sss111"这是字面常量先区分对象和引用再说。
字符串很特别,s1和s2都是常量
所有的字符串变量都是常量,它们的值不会发生改变,改变的只是引用
public class Test {
public static void main(String[] args) {
String s1 = "sss111";
String s2 = "sss111";
}
}
s1,s2都变量,在stack中,保存了常量"sss111"的引用,这里有别于final String s1 = "sss111"; s1保存的引用是一个常量,也就是说s1只能指向内存中的某个区域。
所以就只有一个sss111
String s1=new String("sss111");
String s2=new String("sss111");
与
String s1 = "sss111";
String s2 = "sss111";
比较一下“==”的结果这是java对字符串常量(String类型)的“存储优化”(同一个常量只申请一块内存空间,申请之后不再变化),不知道我这样理解对不对,呵呵。