String s2=new String("123");
//编译时先去字符串常量池检查,是否存"123",如果不存在,则在常量池中开辟内存空间存放"123";如果存在,则不用重新开辟空间。然后在堆中开辟空间存放new出来的String实例,在栈中开辟空间命名s1,存放堆中String的内存地址,这个过程中将引用s2指向new出来的String实例
String s1="123";
//先去字符串常量池检查,是否存在“123”,如果不存在,在常量池开辟内存空间存放“123”,如果存在,在栈中开辟空间,命名s1,存放常量池中的“123”内存地址
代码如下:
package com.tjove.main;
public class StringDemo {
public static void main(String[] args) {
StringDemo demo=new StringDemo();
demo.practice();
}
void practice(){
String s1="123";
String s2="123";//s1,s2指向常量池中的同一个地址
String s3=new String("123");//s3指向堆内存中地址
String s4=new String("123");//s4指向堆内存中另一个地址,常量池中自始至终只有一个"123"
System.out.println("s1==s2:"+(s1==s2));
System.out.println("s1==s3:"+(s1==s3));
System.out.println("s1==s4:"+(s1==s4));
System.out.println("s3==s4:"+(s3==s4));
}
}
结果如下: