蒟蒻的JAVA的Collection-contains方法、remove方法底层实现

在这里插入图片描述

import java.util.*;
import java.util.Collection;
import java.util.Iterator;
public class interate {
    public static void main(String[] args) {
        Collection c = new ArrayList();
		String s1 = new String("asd");
		c.add(s1);
		String s2 = new String("dfg");
		c.add(s2);
		
		String x = new String("asd");
		System.out.println(c.contains(x));
		
		//此处会输出true
		/*
			实际上contains底层调用equals方法
			所以判断集合内到底包含不包含,实际上是调用了equals方法,又因为他们都是String类型的
			故虽然x和s1是两个不同的对象,但是二者的equals方法是true
			二者都是String,String的equals方法已经重写,所以String的equals方法比较的是
			内容,所以无论创建了几个对象,不管对象是否相同,只要内容是相同的
			最后结果就是true,所以这里会输出true.
		*/
    }
}

类中没有重写equals:

import java.util.*;
public class CollectionsTest{
    public static void main(String[] args){
        Collections c1 = new ArrayList();
        User u1 = new User("zhangsan");
        c1.add(u1);
        User u2 = new User("zhangsan");
        //判断集合中是否包含u2
        /*
        同样比较集合中元素是否存在时,底层调用equals方法,比较的是两个User对象
        而现在User没有重写equals方法,所以这里的equals方法一定会调用object中的
        equals方法,而在Object中的equals方法直接比较二者的内存地址,所以地址不同
        返回false.
        */
        System.out.println(c1.contains(u2)); // 返回false
    }
}
class User{
    private User();
   	private User(String name);
}

类中重写equals:

import java.util.*;
public class CollectionsTest{
	public static void main(String[] args){
        Collections c1 = new ArrayList();
        User u1 = new User("zhangsan");
        c1.add(u1);
        User u2 = new User("zhangsan");
        System.out.println(c1.contains(u2)); // 返回true
    }
}

class User{
    private User();
   	private User(String name);
    
    //以下代码重写equals:
    public boolean equals(Object o){
        if (o == null || !(o instanceof User)) return false;
        if (o == this) return true; //如果对象相同,直接返回true
        User u = (User)o; // 强制类型转换
        if (u.name.equals(this.name)) return true; // 直接比较名字
        return false;
    }
}

结论: 存放在集合中的类型,要重写equals方法。

Integer类、String类的equals方法重写了

remove深入研究

remove的底层实质上也调用了equals方法,在删除元素之前也是需要调用equals方法的,所以重写equals方法很有必要。

如果不重写,同样会先调用Object中的equals方法,导致仅仅比较内存地址来判断两个元素是否相同。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值