但这里s2并没有通过new关键字来创建一个新的String对象

时间:2021-09-17 07:59:04

equals要领和==的区别

     首先大家知道,String既可以作为一个东西类来使用,又可以作为一个根基类型来使用。这里指的作为一个根基类型来使用只是指使用要领上的,好比String s = "Hello",它的使用要领如同根基类型int一样,好比int i = 1;,而作为一个东西来使用,则是指通过new关键字来创建一个新东西,好比String s = new String("Hello")。但是它的内部行动其实还是创建了一个东西,这点稍后会说到。

        其次,对String东西的对照要领需要了解。C#里东西之间的对照有两种观点,这里拿String东西来说:一种是用"=="来对照,这种对照是针对两个String类型的变量的引用,也就是说如果两个String类型的变量,它们所引用同一个String东西(即指向同一块内存堆),则"=="对照的功效是true。另一种是用Object东西的equals()要领来对照,String东西担任自Object,并且对equals()要领进行了重写。两个String东西通过equals()要领来进行对照时,其实就是对String东西所封装的字符串内容进行对照,也就是说如果两个String东西所封装的字符串内容不异(包孕巨细写不异),则equals()要领将返回true。

 

此刻开始将对String东西的创建做具体的分析:

 

1、/////////////////////////////////////////////////////////////////////////

String s1 = new String("Hello");

String s2 = new String("Hello");

 

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");

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";

String s2 = "Hello";

 

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。

 

        到这里,,对String东西的根基观点应该都已经理解了。此刻我来小结一下:

 

针对String作为一个根基类型来使用:

 

1。如果String作为一个根基类型来使用,那么我们视此String东西是String缓冲池所拥有的。