Java中判断字符串相等
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 }
参考链接:https://blog.csdn.net/qq_44750696/article/details/124538073