Java的字符串变量使用“==”运算的规则

Java的字符串变量使用“==”运算的规则

在上一篇博文,我们讨论了比较运算符“== ”,即:当两个变量的值相等时(无论是基本类型变量还是引用类型变量),“== ”比较运算的结果会返回true。
下面,我们看一个字符串变量进行“==”运算的简单例子

public class StringTest  
{
	public static void main(String[] args) 
	{
		//定义三个字符串变量
		String s1 = "Hello World";  //③
		String s2 = "Hello World";  //④
		String s3 = new String("Hello World");  //⑤
		//打印 Hello World== Hello World :true
		System.out.println(s1 + "== " + s2 +" :" + (s1== s2));  //①
		//打印 Hello World== Hello World :false
		System.out.println(s1 + "== " + s3 +" :" + (s1== s3));  //②
	}
}

程序定义了三个字符串变量s1、s2、s3,它们的值都是 “Hello World”,打印“== ”的结果,第10行程序打印true,第12行程序打印了“Hello World== Hello World :false”。s2和s3的值均为"Hello World",值相等,但是“==”运算的结果确是false!是不是跟我们上篇博文总结的规律不同呢?
我们先来了解一下JVM如何管理字符串:
1、当直接使用字符串直接量时,如”Hello World",JVM将会使用常量池来管理字符串,这些字符串被保存在已经编译的.class文件中。
2、当使用new String(”Hello World")时,JVM先使用常量池管理直接量,再调用String类的构造器来创建一个新的String对象(保存在堆内存中),此时会生成两个String对象。

下面我们接着分析上面的程序:
1、第6行程序在常量池生成一个”Hello World"字符串,s1在内存中的值保存了一个地址,这个地址指向常量池中的”Hello World"。
2、第7行程序在常量池中找到”Hello World"字符串,s2在内存中的值保存了一个地址,这个地址同样指向常量池中的”Hello World"。
3、第8行程序在堆内存中新建一个String对象,s3在内存中的值保存了一个地址,这个地址指向刚刚新建的String对象。
4、因为s1、s2中保存的值(一个地址)相同,都指向常量池中的”Hello World",所以第10行程序输出true。
5、因为变量s3在内存中保存的值(一个地址)指向一个新的String对象,与s1在内存中保存的值不同,所以第12行输出false.

对于字符串的“==”运算,还有一个容易混淆的概念:字符串变量在内存中的值、字符串的值。
字符串变量在内存中的值,是指保存在字符串变量中的值(一个地址指针);
字符串的值,是指字符串变量中保存的指针–>指向堆内存中的String对象的字符串序列。

发布了4 篇原创文章 · 获赞 0 · 访问量 357

猜你喜欢

转载自blog.csdn.net/weixin_37460579/article/details/104083555