equals方法的一些问题
String比较相等的问题探索
工作上,有个同事犯了个低级错误,把字符串的计较用了==。由于代码已经交付客户,上了生产环境,给公司带了了损失。于是看了他的代码,自己根据以前学的知识,写了几个小demo,加深自己对字符串比较的认识。例1:
!java
public static void main(String[] args) {
String string= "";
if (string=="") {
System.out.println("相等");
} else {
System.out.println("不等");
}
}
run:
相等例2:
#!java
public static void main(String[] args) {
String string= new String("");
if (string=="") {
System.out.println("相等");
} else {
System.out.println("不等");
}
}
run:不等
上面两例说明,String是对象,对象用==是比较的地址,例一之所以相等,是因为如果用赋值的方式来定义字符串,如果这个字符串已经定义过了,则字符串常量池中已经有此字符串了,就不会再重新生成一个。如果字符串常量池中没有此字符串,就会生成一个。例2的方式,是先在堆内存新建了个对象,对象里存有指向字符串常量池的地址(字符串在常量池的生成和上面原理一样)。也就是说例2中的对象地址不等于字符串的地址。
但是如果我们用String自带的equals方法,就不会出现这种情况。字符串的equals方法重写了Object的equals方法,比较的是内容。所以
我们在开发中,比较字符串都是用equals方法。
String类型的相等分为N多种。。(原来一直用“==”判断两个字符串相等,某天Debug时发现两个“值”相同的String死活不“==”,才发现String相等不止一种)
例子:
public class EqalTest {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
System.out.println(a == b);
System.out.println(a == c);
System.out.println(c == d);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
System.out.println(c.equals(d));
}
}
返回
true
false
false
true
true
true
首先要说一说String这个类型,String不是基本数据类型,new String() ,new String(“”)都创建了一个空字符串,不是null。
常量池(字符串池)的概念
自己理解为内存中专门用来存放字符串常量的一块地方,并且每个字符串常量的值跟其他的都不一样(具有唯一性,任何两个都不同)。定义String a = "abc"; String b = "abc";后,在编译时“abc”放入常量池,a,b对象均指向"abc"
关于new String()
String c = new String("abc"); new产生的对象c不指向常量池里的“abc”,他是在堆内存中重新存入一个“abc‘(堆内存用于存放由new创建的对象和数组,每次new都创建,不论字串是否相等)。
先来说“==”
”==“比较的是指向两边字符串的引用是否相同,即两边字符串存放地址是否相同,a,b都指向常量池同一”abc“,地址相同,所以a==b为true。c指向其在堆内存创建的"abc",与a指向的"abc"存放地址不同,所以a==c为false。d也是在堆中新创建一个"abc",与c地址不同,所以c==d为false。
再说说equals()
自己注:字符串里的equals重写了object里的equals
equals()就是比较字符串的内容,a、b、c、d均为abc,均返回true。

浙公网安备 33010602011771号