Java学习笔记-----collection收集机制 不重复的Set

我又来了,不知道有没有人看我的博客,但是我是为了自己学的,我想做到的就是好好学习编程,以后进大厂工作,加油,活出自己的精彩!
言归正传,这些天又看见了collection收集机制,里面有一种不重复的set,今天来谈一谈感想

首先看一看set能达到什么目的,看下面的这段代码:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class CutWords {
	public static void main(String [] args) {
		Scanner in = new Scanner(System.in);
		Set s = token(in.nextLine());//收集输入的字符,在函数中进行剪切
		System.out.printf("字符串有%d个不同的单词  分别是%s\n",s.size(),s);
	}
	static Set token(String line) {
		String [] word = line.split(" ");//按照空格剪切字符串
		return new HashSet(Arrays.asList(word));
		//将剪切的字符数组转换成hashset类型的
	}
}

看看输出的是什么:
在这里插入图片描述这个程序直接将输入的字符串转换成不重复的一列单词

既然能收集不重复的对象,那么我们修改一下试一试。

大家都知道神奇宝贝游戏,有很多人也很喜欢玩儿,那么我们拿这个举个例子:

首先是宠物类,私有的数据是宠物的等级,血量和名字:

public class Pet {
	private int level;
	private int blood;
	private String name;
	public Pet(int level,int blood,String name) {
		this.level = level;
		this.blood = blood;
		this.name = name;
	}
	public String toString() {
		return String.format("等级:%d 血量:%d 宠物名字:%s\n"
				, this.level, this.blood, this.name);
	}
}

对了,为了输出的时候看起来美观,重写了一下toString方法

之后设计怎么将数据输入到set里面,看看我的main函数:

import java.util.HashSet;
import java.util.Set;

public class SetDemo {
	public static void main(String [] args) {
		Set <Pet> set = new HashSet<>();
		Pet [] p = {
				new Pet(26,100,"皮卡丘"),
				new Pet(40,150,"杰尼龟"),
				new Pet(27,110,"暴鲤龙"),
				new Pet(30,125,"喵喵"),
				new Pet(40,150,"杰尼龟")
		};
		for(int i = 0;i < p.length;i++) {
			set.add(p[i]);
		}
		Pet pet;
		System.out.println(set);
	}
}

我们发现有两只杰尼龟,我们知道set是不重复的,那么输出的时候应该是什么样子呢?
Java学习笔记-----collection收集机制 不重复的Set_第1张图片
哎?不对呀,为什么还有两只杰尼龟?不是不重复的吗?

那么我们就有必要了解一下hashset储存对象的方式了:、
*
*

hashset的操作和概念就是在内存中开设一段空间,并且每个空间都会有自己的哈希码,这段空间叫做哈希桶,当储存对象的时候,首先调用对象的hashcode,得到对象的哈希码,并且尝试放入对应号码的哈希桶中
(1)当哈希桶中没对象的时候,直接放入
(2)当哈希桶中有对象的时候,调用对象的equals方法进行比较
1、当equals返回的值是true的时候,说明是重复对象,不收集这个对象
2、当equals返回的值是false的时候,说明对象不重复,收集对象

所以,上面发生的是正常现象,因为你没告诉set我们自己建立的对象怎么才算是相同的对象。当使用hashset创建set对象的时候,会调用equals和hashcode两个方法,那么为了顺利的达到目的,我们就重写这两个方法。

我在pet类里面重新写了equals和hashcode,也就相当于告诉了set,我的对象在什么样的情况下是一样的。

@Override
	public boolean equals(Object o) {
		if(o == null)  return false;
		if(o.getClass() != this.getClass()) return false;
		final Pet pet = (Pet) o;
		if(!this.name.equals(pet.name)) return false;
		if(!(this.level == pet.level))  return false;
		if(!(this.blood == pet.blood))  return false;
		return true;
	}

	@Override
	public int hashCode() {
		int hash = 7;
		hash = hash*47 + Objects.hash(this.name);
		hash = hash*47 + Objects.hash(this.level);
		hash = hash*47 + Objects.hash(this.blood);
		return hash;
	}

那么输出结果就是没有重复的了:
Java学习笔记-----collection收集机制 不重复的Set_第2张图片

好了,希望这篇博客能帮到大家,但是仅仅这样的话肯定是不够的,大家还要多多练习呀,我也会加油的,努力实现自己的目标。加油!灰灰了!

你可能感兴趣的:(Java学习笔记-----collection收集机制 不重复的Set)