Java中判断字符串相等
在Java中,如果我们想要判断两个字符串值是否相等,会不会首先想到用“==”呢?那么用“==”是否可能会出现问题呢?
1、举个栗子
比如:判断下面s1和s2是否相等?
String s1="abc";
String s2= new String("abc");
1 public class Demo {
2
3 public static void main(String[] args) {
4 String str1 = "abc";
5 String str2 = "abc";
6 String str3 = str1;
7 String str4 = new String("abc");
8 String str5 = new String("abc");
9
10 if (str1 == str4) {
11 System.out.println("str1和str4比较引用地址结果为true");
12 } else {
13 System.out.println("str1和str4比较引用地址结果为false");
14 }
15
16 // str1=str1 true,相同引用
17 // str1=str2 true,str1和str2都在公共池中,引用相同
18 // str1=str3 true,str3和str1引用相同
19 // str1=str4 false,不同引用地址
20 // str4=str5 false,堆中不同引用地址
21
22 // 比较内容
23 if (str1.equals(str4)) {
24 System.out.println("str1和str4比较内容结果为true");
25 } else {
26 System.out.println("str1和str4比较内容结果为false");
27 }
28 }
29 }
2、 == 运算符
【1】如果比较的对象是基本数据类型,则比较数值是否相等;
【2】如果比较的是引用数据类型,则比较的是对象的内存地址是否相等。
因为Java只有值传递,所以对于==来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
3、equals
Java语言里面的equals()方法是交给开发者们自己去覆盖重写编写功能的,即让开发者去定义当满足什么条件时,两个Object是相等的。
equals方法是由Object提供的,允许子类进行重写。
equals()的原始代码实现如下:
1 // Object的equals方法
2
3 public boolean equals(Object obj) {
4
5 return (this == obj);
6
7 }
String类的equals()重写了Object对象的原始equals方法,重写之后,只会比较具体的内容。
源码分析如下:
1 public boolean equals(Object anObject) {
2 // 如果比较的两个对象的首地址是相同的,那指的肯定是同一个对象,直接返回true
3 if (this == anObject) {
4 return true;
5 }
6
7 // 如果指定对象和当前对象的内存地址不相等'
8 // 则判断指定对象是否是String类型,如果不是,则直接返回false
9 // 如果指定对象是String类型,则继续
10 if (anObject instanceof String) {
11 String anotherString = (String)anObject;
12
13 // 比较指定对象与当前对象的字符串长度,如果长度不一致,则直接返回false;
14 int n = value.length;
15
16 if (n == anotherString.value.length) {
17 // 如果指定对象与当前对象的字符串长度一致,
18 // 则遍历这两个字符串对象中的每一个char字符,
19 // 如果遍历过程中有一个char字符不一致,则直接返回false;
20 char v1[] = value;
21 char v2[] = anotherString.value;
22 int i = 0;
23 while (n-- != 0) {
24 if (v1[i] != v2[i])
25 return false;
26 i++;
27 }
28 return true;
29 }
30 }
31 return false;
32 }