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 

posted @ 2023-03-30 09:10  欢乐豆123  阅读(447)  评论(0编辑  收藏  举报