先看代码
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = "hello";
String s3 = "hello";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s2 == s3);
}
运行结果:
false
true
true
分析虚拟机器中内存如下图
2018-07-24(一张图看懂String类型比较)
字符串存储于方法区的常量区,S2和S3都直接指向常量区地址,但是S1因为是new,会在堆中申请内存,堆中存储的是常量区字符串地址,S1指向堆中内存地址。
再来看一段代码:
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = s1 + s2;
String s5 = "hello" + "world";
System.out.println(s3 == s4);
System.out.println(s3 == s5);
}
输出结果为:
false
true
2018-07-24(一张图看懂String类型比较)
使用new String("")方式创建字符串,会在堆中申请空间,而直接赋值的方式(String s="")创建字符串时,会直接去常量区找。
这里的s4因为是两个变量相加,所以会当成一个新字符串。而s5会在编译时被优化为s5="helloworld"
网友评论