深入理解java中的equals方法

相信各位都知道==和equals的区别,所以在此只讲equals方法。

                String str1 = new String("str");
		String str2 = new String("str");
		System.out.println(str1.equals(str2));//结果为true
		
		StringBuffer buf1 = new StringBuffer("buf");
		StringBuffer buf2 = new StringBuffer("buf");
		System.out.println("--------"+buf1.equals(buf2));//结果为false

懵逼,为什么String中的equals方法为true,而StringBuffer中的equals方法呢?接下来我们看看源码

String中的equals方法源码如下:

public boolean equals(Object anObject) {
        if (this == anObject) {//先进行地址比较
            return true;
        }

        if (anObject instanceof String) {//接着判断是否为string类,下面为字符比较
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
 }

StringBuffer中的方法如下,明显看出他并没有equals方法,同时他继承的AbstractStringBuilder类和实现的Serializable, CharSequence接口都没有equals方法,那么他的equals方法从哪里来的呢?xiongdi,别忘了,在java中所有的类都是Object的子类,所以他的equals代码如下:

  public boolean equals(Object obj) {
        return (this == obj);//只比较地址
    }

看到可以发现,string中的equals方法会先进行地址比较,然后判断是否都是string对象,接着进行字符比较,而StringBuffer只进行地址比较,所以就会出现上面的结果。那么我们在开发中如果只需要比较对象的值而不需要比较地址时,该如何写代码呢?哈哈,重写equals方法,下面给出一个列子:

新建User类,代码如下:

public class User {

	public String username;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}
	
}

测试:

             
                User user = new User();
		user.setUsername("user");

                User user2 = new User();
		user.setUsername("user");
		
		System.out.println(user.equals(user2));//false

然后修改User类

public class User {

	public String username;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}
	//重新equal方法
		@Override
		public boolean equals(Object obj) {
			
			if(null == obj) {
				return false;
			}
			User user = (User) obj;
			
			if(null == this.username && null == user.getUsername()) {
				return true;
			}else {
				//调用string中的equal方法先进行地址比较,然后进行字符比较
				return this.username.equals(user.getUsername());
			}
		}
}

在测试:

                User user = new User();
		user.setUsername("user");
		
		User user2 = new User();
		user.setUsername("user");
		
		System.out.println(user.equals(user2));//true

这是个人今天看源码发现的,不过,发现一点让我很懵逼的事情,不清楚value属性是怎样来的,欢迎各位大佬分享

  public String(String original) {
        this.value = original.value;//value怎么来的怎么来的??????????????
        this.hash = original.hash;
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值