Java 中字符串的比较

   在项目开发中遇到一个Java 字符 比较的问题,

      

      比较两个字符串不相等,开始使用的  “!=”,后来发现总是有问题,修改为使用equals 函数后,执行没问题了。

原因是:“==”,"!=" 比较的是两个对象是否相等。而equals 比较的是字符串内容是否相同。

参考了这个文章

http://blog.csdn.net/chtnj/article/details/7909720


判断字符串相等我们经常习惯性的写上if(str1==str2),这种写法在Java中可能会带来问题。

java中判断字符串是否相等有两种方法:

1、用“==”运算符,该运算符表示指向字符串的引用是否相同,比如: String a="abc";String b="abc",

那么a==b将返回true。这是因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存

一份,所以a和b指向的是同一个对象;再比如:String a=new String("abc"); String b=new String("abc");

那么a==b将返回false,因为a和b指向不同的对象。

2、用equals方法,该方法比较的是字符串的内容是否相同,比如:String a=new String("abc"); 

String b=new String("abc"); a.equals(b);将返回true。所以通常情况下,为了避免出现上述问题,判断

字符串是否相等使用equals方法。



http://blog.csdn.net/u013457382/article/details/50996533

Java中String类型具有一个equals的方法可以用于判断两种字符串是否相等,但是这种相等又与运算符==所判断的“相等”有所不同,接下来进行分析,结论由程序进行验证

String的equals函数只要两个字符串“看起来”相等,就可以返回true,“看起来”相等意思指的是,当两个字符串对象所存放的内容相同时,不需要存放的内存地址相同,但是==判断则只有当判断的两个变量所使用的内存地址为相同时才返回true。例如有两个长得一模一样的双胞胎A,B,若使用A==B来判断会返回false,使用A.equals(B)则会返回true。

我们可以看object中的equals函数的源码为

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public boolean equals(Object obj) {  
  2.         return (this == obj);  
  3.     }  

我们知道Java中所有的对象都默认继承自Object类,所以当我们没有重写equals的方法时,若使用equals来判断两个对象的是否相等时,只有这两个对象指向的是同一个内存地址时,才会返回true,否则即使内容完全相同但在内存中是两个不同的内存地址也是返回false,此时若用双胞胎A,B来对比,A==B与A.equals(B)返回的都是false,

既然如此,那String的equals与==为什么会不一样呢,这里我们要看一下String中重写equals的源码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public boolean equals(Object anObject) {  
  2.         if (this == anObject) {  
  3.             return true;  
  4.         }  
  5.         if (anObject instanceof String) {  
  6.             String anotherString = (String) anObject;  
  7.             int n = value.length;  
  8.             if (n == anotherString.value.length) {  
  9.                 char v1[] = value;  
  10.                 char v2[] = anotherString.value;  
  11.                 int i = 0;  
  12.                 while (n-- != 0) {  
  13.                     if (v1[i] != v2[i])  
  14.                             return false;  
  15.                     i++;  
  16.                 }  
  17.                 return true;  
  18.             }  
  19.         }  
  20.         return false;  
  21.     }  
可以看出String中的equals函数首先判断其内存地址是否为同一个:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. if (this == anObject) {  
  2.            return true;  
  3.        }  

然后再判断其内容是否相同:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. if (anObject instanceof String) {  
  2.             String anotherString = (String) anObject;  
  3.             int n = value.length;  
  4.             if (n == anotherString.value.length) {  
  5.                 char v1[] = value;  
  6.                 char v2[] = anotherString.value;  
  7.                 int i = 0;  
  8.                 while (n-- != 0) {  
  9.                     if (v1[i] != v2[i])  
  10.                             return false;  
  11.                     i++;  
  12.                 }  
  13.                 return true;  
  14.             }  
  15.         }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值