String使用equals方法和==的区分

学习java时,经常在考试的时候遇到关于String的equals方法和“==”的使用问题,这是很基础的知识,但也是常常容易混淆的问题,就此在学习和查阅资料之后总结成此篇博客。

java是一种面向对象的语言。对于String对象的比较,简单来说就是:一种是用"=="来比较,另一种是equals()方法来比较。"=="用来判断String字符串的引用是否相同,而equals方法则只判断字符串的内容是否相同。

具体来说:用"=="来比较,这种比较是针对两个String类型的变量的引用,也就是说如果两个String类型的变量,它们所引用同一个String对象(即指向同一块内存堆),则"=="比较的结果是true;两个String对象通过equals()方法来进行比较时,其实就是对String对象所封装的字符串内容进行比较,也就是说如果两个String对象所封装的字符串内容相同(包括大小写相同),则equals()方法将返回true。

现在开始将对String对象的创建做具体的分析:

1、**************************************************************************************************************
String s1 = new String("Hello java");
String s2 = new String("Hello java");

System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

以上代码段的打印结果是:

false
true

        两个String类型的变量s1和s2都通过new关键字分别创建了一个新的String对象,这个new关键字为创建的每个对象分配一块新的、独立的内存堆。因此当通过"=="来比较它们所引用的是否是同一个对象时,将返回false。而通过equals()方法来比较时,则返回true,因为这两个对象所封装的字符串内容是完全相同的。

2、***************************************************************************************************************
String s1 = new String("Hello java");
String s2 = s1;

System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

以上代码段的打印结果是:

true
true

        变量s1还是通过new关键字来创建了一个新的String对象,但这里s2并没有通过new关键字来创建一个新的String对象,而是直接把s1赋值给了s2,即把s1的引用赋值给了s2,所以s2所引用的对象其实就是s1所引用的对象。所以通过"=="来比较时,返回true。既然它们引用的都是同一个对象,那么通过equals()方法来比较时,肯定也返回true,这里equals()方法其实在对同一个对象进行比较,自己肯定等于自己啦。

3、***************************************************************************************************************
String s1 = "Hello java";
String s2 = "Hello java";

System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

以上代码段的打印结果是:

true
true

        首先这两个String对象都不是通过new关键字来创建的,因此虚拟机不会为这两个String对象分配新的内存堆,而是到String缓冲池中来寻找。

        为s1寻找String缓冲池内是否有与"Hello"相同值的String对象存在,此时String缓冲池内是空的,没有相同值的String对象存在,所以虚拟机会在String缓冲池内创建此String对象,其动作就是new String("Hello");。然后把此String对象的引用赋值给s1。

        接着为s2寻找String缓冲池内是否有与"Hello"相同值的String对象存在,此时虚拟机找到了一个与其相同值的String对象,这个String对象其实就是为s1所创建的String对象。既然找到了一个相同值的对象,那么虚拟机就不在为此创建一个新的String对象,而是直接把存在的String对象的引用赋值给s2。所以 s1和s2所引用的是同一个String对象,即自己等于自己,所以以上两种比较方法都返回ture。

猜你喜欢

转载自blog.csdn.net/LeeAbby/article/details/79273571
今日推荐