我又来了,不知道有没有人看我的博客,但是我是为了自己学的,我想做到的就是好好学习编程,以后进大厂工作,加油,活出自己的精彩!
言归正传,这些天又看见了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是不重复的,那么输出的时候应该是什么样子呢?
哎?不对呀,为什么还有两只杰尼龟?不是不重复的吗?
那么我们就有必要了解一下hashset储存对象的方式了:、
*
*
hashset的操作和概念就是在内存中开设一段空间,并且每个空间都会有自己的哈希码,这段空间叫做哈希桶,当储存对象的时候,首先调用对象的hashcode,得到对象的哈希码,并且尝试放入对应号码的哈希桶中
(1)当哈希桶中没对象的时候,直接放入
(2)当哈希桶中有对象的时候,调用对象的equals方法进行比较
1、当equals返回的值是true的时候,说明是重复对象,不收集这个对象
2、当equals返回的值是false的时候,说明对象不重复,收集对象
我在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;
}
好了,希望这篇博客能帮到大家,但是仅仅这样的话肯定是不够的,大家还要多多练习呀,我也会加油的,努力实现自己的目标。加油!灰灰了!