首页 / 操作系统 / Linux / Java中String判断相等equals与==的区别以及StringBuilder的equals
Java中String类型具有一个equals的方法可以用于判断两种字符串是否相等,但是这种相等又与运算符==所判断的“相等”有所不同,接下来进行分析,结论由程序进行验证String的equals函数只要两个字符串“看起来”相等,就可以返回true,“看起来”相等意思指的是,当两个字符串对象所存放的内容相同时,不需要存放的内存地址相同,但是==判断则只有当判断的两个变量所使用的内存地址为相同时才返回true。例如有两个长得一模一样的双胞胎A,B,若使用A==B来判断会返回false,使用A.equals(B)则会返回true。我们可以看object中的equals函数的源码为public boolean equals(Object obj) {return (this == obj);}
我们知道Java中所有的对象都默认继承自Object类,所以当我们没有重写equals的方法时,若使用equals来判断两个对象的是否相等时,只有这两个对象指向的是同一个内存地址时,才会返回true,否则即使内容完全相同但在内存中是两个不同的内存地址也是返回false,此时若用双胞胎A,B来对比,A==B与A.equals(B)返回的都是false,既然如此,那String的equals与==为什么会不一样呢,这里我们要看一下String中重写equals的源码:public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String) anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}可以看出String中的equals函数首先判断其内存地址是否为同一个: if (this == anObject) {return true;}
然后再判断其内容是否相同:if (anObject instanceof String) {String anotherString = (String) anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}
当我们使用字符串连接--连接方式一般为+或concat("substring")--的方式创建字符串时,都会构建一个新的String对象,即在内存中开辟一个新的地址来存放,所以这个时候即使内容相同,用==判断的话,也是返回false;当我们使用等号赋值时,若内存中有该字符串,则该变量指向此内存地址二不是重新创建一个,所以此时用==时会返回true,我们看一下例程:public class StringTest01 {public static void main(String[] args) {// TODO Auto-generated method stubString hello="hello";String hel1=hello;String hel2="hel";String hel3=hel2+"lo";String hel4=hel2.concat("lo");System.out.println(hello);System.out.println(hel1);System.out.println(hel3);System.out.println(hel4);//==等号测试System.out.println(hello==hel1);System.out.println(hello==hel3);System.out.println(hello==hel4);System.out.println(hel3==hel4);//equals函数测试System.out.println(hello.equals(hel1));System.out.println(hello.equals(hel3));System.out.println(hello.equals(hel4));System.out.println(hel3.equals(hel4));//StringBuilder测试StringBuilder helloBuilder = new StringBuilder("hel");System.out.println(helloBuilder.equals(hel2));}}
其输出结果为:最后一个StringBuilder的测试我们发现虽然使用equals来判断,但是返回的是false,这是为什么呢?首先,当我们使用StringBuilder创建对象时,肯定会在内存中开辟一个新的专属的地址用于存放对象内容,但是即使StringBuilder中存放的内容与其他字符串的内容相同,使用equals来判断也是返回false,这是因为StringBuilder并没有重写equals函数,即StringBuilder的equals为:public boolean equals(Object obj) {return (this == obj);}所以会返回false。本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-10/136282.htm