Set set = new HashSet<>();
set.add(new Student(“dmz”, 16));
set.add(new Student(“wyf”, 36));
set.add(new Student(“hpw”, 26));
set.add(new Student(“wyf”, 36));
for (Object o : set) {
System.out.println(o);
}
}
}
class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return “Student [name=” + name + “, age=” + age + “]”;
}
}
控制台输出为:
Student [name=dmz, age=16]
Student [name=wyf, age=36]
Student [name=hpw, age=26]
Student [name=wyf, age=36]
出现了相同的两条数据,说明并没有实现去重
重写hashCode方法,代码如下
public class Demo2 {
public static void main(String[] args) {
Set set = new HashSet<>();
set.add(new Students(“dmz”, 16));
set.add(new Students(“wyf”, 36));
set.add(new Students(“hpw”, 26));
set.add(new Students(“wyf”, 36));
for (Object o : set) {
System.out.println(o);
}
}
}
class Students {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Students(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return “Student [name=” + name + “, age=” + age + “]”;
}
@Override
public int hashCode() {
System.out.println(“hashCode方法被调用”);
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
System.out.println(“equals方法被调用”);
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Students other = (Students) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
控制台输出为:
hashCode方法被调用
hashCode方法被调用
hashCode方法被调用
hashCode方法被调用
equals方法被调用
Student [name=wyf, age=36]
Student [name=dmz, age=16]
Student [name=hpw, age=26]
hashCode方法被调用四次
因为每new一次students,就调用一次hashCode方法生成地址
equals方法被调用一次
因为当遇到相同地址时,调用equals方法比较内容是否相同
将hashcode方法返回0:
@Override
public int hashCode() {
System.out.println(“hashCode方法被调用”);
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return 0;
}
控制台输出为:
hashCode方法被调用 //生成第一条数据的地址
hashCode方法被调用 //生成第二条数据的地址
equals方法被调用 //将第二条数据的内容与第一条数据的内容比较
hashCode方法被调用 //生成第三条数据的地址
equals方法被调用 //将第三条数据的内容与第一条数据的内容比较
equals方法被调用 //将第三条数据的内容与第二条数据的内容比较
hashCode方法被调用 //生成第四条数据的地址
equals方法被调用 //将第四条数据的内容与第一条数据的内容比较
equals方法被调用 //将第四条数据的内容与第二条数据的内容比较,相同,故不再调 用第三次equals方法
Student [name=dmz, age=16]
Student [name=wyf, age=36]
Student [name=hpw, age=26]
我们可以这样理解:
set集合为商品展示柜台
一个物品放在一个专属展示柜进行展示
展示柜中不重复展示相同物品
4.set集合自然排序和比较器排序
==================================================================
Set集合自然排序
public class Demo3 {
public static void main(String[] args) {
Set set=new TreeSet<>();
set.add(new User(“zs”, 1800));
set.add(new User(“ls”, 800));
set.add(new User(“ww”, 900));
set.add(new User(“zl”, 1200));
for (User user : set) {
System.out.println(user);
}
}
}
class User{
private String name;
private int money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public User(String name, int money) {
super();
this.name = name;
this.money = money;
}
@Override
public String toString() {
return “User [name=” + name + “, money=” + money + “]”;
}
}
控制台输出会报错: com.ltf.User cannot be cast to java.lang.Comparable
类型转换异常,user需要实现Comparable接口
Comparable接口:对实现它的每个类的对象进行整体排序,即该类的自然排序
compareTo:该类的自然比较方法
同理: Object s=new Students(“zz”, 12);
User u=(User)s;//强转,编译不报错,运行报错
User implements Comparable
@Override
public int compareTo(Object o) {//自然比较方法
// TODO Auto-generated method stub
return 0;
}
将money由低到高排序和由高到低排序
public class Demo3 {
public static void main(String[] args) {
Set set=new TreeSet<>();
set.add(new User(“zs”, 1800));
set.add(new User(“ls”, 800));
set.add(new User(“ww”, 900));
set.add(new User(“zl”, 1200));
for (User user : set) {
System.out.println(user);
}
}
}
class User implements Comparable{//继承comparable接口
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+点击【学习资料】即可免费领取!
[外链图片转存中…(img-TLEdAJKr-1712204966788)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-ouQ9r7B2-1712204966788)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+点击【学习资料】即可免费领取!
[外链图片转存中…(img-TqlhgCsF-1712204966789)]
[外链图片转存中…(img-T9It4JAa-1712204966789)]