String、char值相等比较

       有时在写代码时会不小心在比较String与String值相等,char与char值相等时会没弄清楚”==”与equals()两种比较方法的区别就直接选一个用上了,最后在Debug时才发现以为是true的地方却是false,以为是false的地方却是true。写这篇文章只是为了记录平时写代码时可能会犯的一些小错误,如下先预先说明:

       String与String值相等比较用equals()方法,char与char值相等比较用”==”进行比较。

       先说一下String与char的区别:

  • java中的八大基本类型:字节型(byte),短整型(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度型(double),布尔型(boolean)
  • 在java里面除去基本数据类型的其它类型都是引用数据类型,所以String不是基本类型而是引用类型。
  • 也就是说,String是一个类,可以在IDE中查看到String的源码,String有很多API。而char只是一个基本数据类型,不是一个类。

       String是引用类型,用”==”进行比较是比较两个字符串是否引用同一地址,如果只是比较内容是否一致,是不是同一个对象(即是不是同一地址)不去比较,则只能用equals()方法进行比较。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class StringEqualsTest {
public static void main(String[] args) {
String s1 = "abcdef";
String s2 = "abcdef";
System.out.println(s1 == s2); // true,因为s1和s2是同一个字符串常量abcdef的引用,是同一个对象地址,所以相等。
System.out.println(s1.equals(s2)); //true,equals()方法只是比较两个字符串的值是否相等,地址不会进行比较,两个字符串的值都是abcdef,所以相等。

s1 = new String("abcdef");
s2 = new String("abcdef");
System.out.println(s1 == s2); // false,因为s1和s2是两个不同的对象,虽然字符串值都是abcdef,但是对象地址不同,用==比较的话不相等。
System.out.println(s1.equals(s2)); //true,equals()方法只是比较两个字符串的值是否相等,地址不会进行比较。
}
}

       char是一个基本数据类型,只能用”==”进行值相等比较,如果想用equals()方法进行比较,则要用char的封装对象Character。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CharEqualsTest {
public static void main(String[] args) {
//char是基本类型,没有equals()方法,只能用"=="来进行比较。
char c1 = 'a';
char c2 = 'a';
System.out.println(c1 == c2); //true,c1和c2是同一个字符常量'a'的引用,是同一个对象地址,所以相同。

//如想用equals()方法,则可以用char的封装对象Character。下面就与String是一模一样的了,如下:
Character c3 = 'a';
Character c4 = 'a';
System.out.println(c3 == c4); // true,c3和c4是同一个字符串常量'a'的引用,是同一个对象地址,所以相同。
System.out.println(c3.equals(c4)); //true,equals()方法只是比较两个字符串的值是否相等,地址不会进行比较,两个字符串的值都是a,所以相等。

c3 = new Character('a');
c4 = new Character('a');
System.out.println(c3 == c4); // false,c3和c4是两个不同的对象,虽然字符串值都是a,但是对象地址不同,用==比较的话不相同。
System.out.println(c3.equals(c4)); //true,equals()方法只是比较两个字符串的值是否相等,地址不会进行比较。
}
}