Java中HashSet的基本使用

文章是记录的自己学习Hash Set的一个过程,对于某些方法可能说得有点杂,覆盖面可能有点大,但是还是蛮不错的

HashSet中只能存储不能重复的对象,如果重复了程序不会出错,但是后面的内容会覆盖前面的(其实也看不出来谁覆盖谁,但是再map中能明显体会到)

首先定义一个HashSet      HashSet<AnimalSet> set = new HashSet<AnimalSet>();说明一下,我这里的AnimalSet是一个定义的一个宠物的类(因为这样能更好的展现HashSet的基本用法)这里需要引入的包是import java.util.HashSet;

因为我的AnimalSet是一个类,所以我得先实例化一个对象AnimalSet one = new AnimalSet("AA",12,"AAA");

set.add(one);set.add(two);增加两个对象,分别是one   two

如果我在创建一个对象AnimalSet three = new AnimalSet("AA", 12, "AAA");我set.add(three);发现并没有像前面提过的一样是重复而覆盖的,这是因为,我new一个新的对象的时候,开辟了一个新的空间,我再add的时候,和之前的one是两个不同的空间,所以就直接add进去了,如果想通过内容一样去让add的对象实现覆盖的话,需要重写equals和hashCode,去一个个判断我传过去的内容是不是一样

根据我这个类来说的重写我就贴一下代码,具体的重写根据自己程序来看(用eclipse里面的那个source里面的一个快捷键快速生成,主要是些equals里面的部分代码,hashCode不需要改变)

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + age;
	result = prime * result + ((name == null) ? 0 : name.hashCode());
	result = prime * result + ((species == null) ? 0 : species.hashCode());
		return result;
}
@Override
public boolean equals(Object obj) {
//	判断对象是否相等,如果想等直接返回true
	if (this == obj)
		return true;
//	判断obj是否是AnimalSet对象,如果是则强制转换,然后判断里面的值知否相等
	if(obj.getClass() == AnimalSet.class) {
		AnimalSet cat = (AnimalSet)obj;
		return cat.getName().equals(name)&&(cat.getAge() == age)&&cat.getSpecies().equals(species);
	}
	return false;
}

删除一个元素使用到的是set.remove(one);

删除多个元素使用到的是set.removeAll(set);(也可以用来删除子集)或者是clear();两者的不同时,前者会返回一个boolean值,代表是否清空成功,后者无返回值

但是当删除一个元素的时候可能存在一些问题,(因为长度时动态变化的,所以在删除一些元素之后可能会迭代器指向变化,因为HashSet的遍历只能使用iterator),解决方法也需要分情况讨论,如果只需要删除一个元素,那么删除之后直接break;即可,如果需要删除多个元素,那么首先把符合要求的元素放到另外一个tmp集合里面,然后再利用删除的API(set.removeAll(tmp))全部删除即可

查找某类的话,通常伴随者遍历,set的遍历方法需要用到    Iterator<AnimalSet> it = set.iterator();然后使用it.hasNext()去判断有没有下一个元素,it.next();代表着下一个元素,然后进行操作即可,PS:如果直接打印的话,对象默认是调用toString()方法,可以自己重写其方法打印对象

如果指向判断是否有否个元素,直接使用set.contains()即可,返回一个boolean值

  • 改    瞧把我能的,不能修改~,虽然没有提供相应的API但是我们可以通过修改AnimalSet里面的对象进行数据跟新啊~例如:one.setAge(5);然后重新打印会发现数据修改了

更多API学习可以查看https://docs.oracle.com/javase/8/docs/api/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值