Java中==与equals的区别

表面看都是判断两个“值”是否相等,其实不然

1、==:用来判断两个变量的是否相等,即两个对象在内存中存储的值是否相等,内存中的值相等,那么内存的首地址就要相等,要比较两个基本类型的数据或两个引用变量是否  相等,只能用==操作符;

2、equals:用来判断两个独立对象的内容是否相等,即不管你在内存里是怎么存的,只要内容相同就相等,字符串的比较基本上都是使用equals方法。

 

1)、Object的equals源码分析:

从下面代码可以看出,Java基类中equals就等于==

public boolean equals(Object obj) {
        return (this == obj);
}

 

2)、Integer的equals源码分析:

从下面代码中可以看出,对于基本数据类型,如果一个对象是该基本数据类型,并且他们在内存中的值相等,则他们equals。

 

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
}

 

3)、String的equals源码分析:

从下面的代码中可以看出,对于一个独立对象,可以自己实现自己的equals方法,在Sting里,如果两个String在内存中的值不相等,但是只要他的字符的序列相等,那么他们相equals。

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = offset;
                int j = anotherString.offset;
                while (n-- != 0) {
                    if (v1[i++] != v2[j++])
                        return false;
                }
                return true;
            }
        }
        return false;
    }

 

4)、自定义的equals方法:

下面的内容,只要输入的内容有一个字符与zhangsan中的字符相同就相equals。

public class EqualsTest {
	String name = "zhangsan";
	public static void main(String[] args) {
		EqualsTest et = new EqualsTest();
		System.out.println(et.equals("白z白"));
	}

	@Override
	public boolean equals(Object obj) {
		if (this.name == obj) {
			return true;
		}
		if (obj instanceof String) {
			String objStr = (String) obj;
			for (int i = 0; i < this.name.length(); i++) {
				for (int j = 0; j < objStr.length(); j++) {
					if(this.name.charAt(i)==objStr.charAt(j)){
						return true;
					}
				}
			}

		}
		return false;
	}

}

 

3、例子分析:

public class EqualsTest {
	public static void main(String[] args) {
		System.out.println("1="+(aStr==bStr));
		System.out.println("2="+(aStr.equals(bStr)));
		String cStr ="foo";
		String dStr ="foo";
		System.out.println("3="+(aStr==cStr));
		
		System.out.println("4="+(cStr==dStr));
		System.out.println("5="+(cStr.equals(dStr)));	}

}

 

输出结果分析:

1=false:因为在内存中存在两个foo,所以肯定首地址不同;
2=true:因为他们内容是相同的;
3=false:因为aStr是new出来的,那么每次他所在内存和其他任何一个不同;
4=true:其实是指向同一内存地址,也就是只有cStr开辟内存空间,dStr其实是直接指向cStr;
5=true:内容当然相等。

总结:

要比较两个基本类型(如byte、short 、int 、long 、float、double、char、boolean)的数据或两个引用变量是否相等,只能用==操作符;

字符串的比较基本上都是使用equals方法,因为两个字符串只要字符序列相等,也是equals的。


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值