String a = "hello6";
String b = "hello"+6;
String c = "hello"+a.length();
System.out.println("a==b:"+(a==b));
System.out.println("b==c:"+(b==c));
System.out.println("a==c:"+(a==c));
-----------------------------------
输出结果为:
a==b:true
b==c:false
a==c:false*******************************************
关键是这个:a==b:true
为什么呢?
String b = "hello"+6;
String c = "hello"+a.length();
System.out.println("a==b:"+(a==b));
System.out.println("b==c:"+(b==c));
System.out.println("a==c:"+(a==c));
-----------------------------------
输出结果为:
a==b:true
b==c:false
a==c:false*******************************************
关键是这个:a==b:true
为什么呢?
由于和"hello"是String 类型的,+号会把6也转成String;和b = "hello"+"6";其实就是一个意思了.
也就是和b也是和hello6的引用;而以a="hello6"这种方式,hello6会存在虚拟机开辟的一块常量池中.由字符串片断连接而成的也是属于这种方式.而在常量池中相同的字符串只会有一片存储空间,所有引用都会指向它.
String a = "hello6";
String b = "hello6";
如果是这种情况的话,因为String 池(pool)中已经存在对象"hello6",在创建对象b的时候,先到池中检索,因为对象"hello6"已经存在,所以b直接引用"hello6"这个对象,这时候a和b引用同一个对象,所以会显示true.不好意思,只知道这么多了……
String b = "hello"+6 相当于String b = "hello"+'6'; 因为一个字符串或者字符加上一个数字时,这个数字会往比它高级的类型转,强转成字符或者字符串类型所以b的结果为:b="hello6"
在System.out.println("a==b:"+(a==b)); 中表达式(a==b)是一个boolean类型所以输出的结果为 a==b:true
字符串常量放在data segment,编译器会首先检查数据区有没有这个,如果有的话
就会把那个引用指向那个,而不会重新new一个
跟heap不一样的!
字符串常量放在data segment,编译器会首先检查数据区有没有这个,如果有的话
就会把那个引用指向那个,而不会重新new一个
跟heap不一样的!
public static void main(String[] args) {
String s1="abc";//创建1个对象
String s2="abc";//创建0 个对象,累计1 个对象;
String s3=new String("ab");//创建了2个对象,一个在堆区,一个在String常量池中!累计3 个对象;
String s4=new String("ab");//创建 1 个对象,在堆区并且个对象指针指向String常量池中的“ab“;累计4个对象;
System.out.println(s1==s2);//t s1和s2指向相同的地址;
System.out.println(s1.equals(s2));//t s1和s2的内容相同;
System.out.println(s3==s4);//f s3和s4的地址不同,指向堆区的不同地址;
System.out.println(s3.equals(s4));//t s3和s4的值相同;
String s5=s1+"d";//s1 是一个变量;创建2 个对象,一个是“d”在String常量池中,一个是(s1+"d")的和“abcd“当然是在堆区;累计6 个对象;
String s6="abc"+"d";//创建1 个对象,在String常量池中 "abcd" 累计7个对象;
String s7="abcd";//创建 0 个对象 累计 7个对象;
System.out.println(s5==s6);//f s5指向堆区,s6指向String常量池
System.out.println(s6==s7);//t s6和s7都指向String常量池的相同的地址;
System.out.println(s5==s7);//f s5指向堆区,s7指向String常量池
}}这个可以帮帮你!!!