有时在写代码时会不小心在比较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()方法进行比较。代码如下:

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。代码如下:

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()方法只是比较两个字符串的值是否相等,地址不会进行比较。
    }
}
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐