写点什么

set 集合框架,java 消息中间件面试

用户头像
极客good
关注
发布于: 刚刚

//1:fore 循环


for (String string : s) {


System.out.println(string);


}


//2:迭代器


Iterator<String> it=s.iterator();


while(it.hasNext()) {


System.out.println(it.next());


}


}


}


三:HashSet 哈希表储存.重复元素储存底层探究?




?set 集合去重复分不同情况



上面第一个是对 string 类型的值进行了去重复调用的是 equals()方法



还有是调用分别调用 hashcode()和 equals()


public class dome2 {


public static void main(String[] args) {


Set<Object> s=new HashSet<Object>();


s.add(new student("xxx", 18));


s.add(new student("yyy", 18));


s.add(new student("zzz", 18));


s.add(new student("xxx", 18));


for (Object object : s) {


System.out.println(object);


}


}


}


//新建一个学生类


public 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;


}


public student() {


// TODO Auto-generated constructor stub


}


@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;


student other = (student) 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;


}


@Override


public String toString() {


return "student [name=" + name + ", age=" + age + "]";


}


}


如图所示 set 集合每次增加数据都是 new student("zzz", 18);就是新建一个 student 不管他们的值是否相同但是他们地址不同就不是同一个对象



但如果重写了 equals()那么就会判断值是否有相同的



例:假设有两个长的一模一样的人,名字相同,相貌相同,年龄相同什么都相同但他们始终不是同一个人


![](https://img-blog.csdnimg.cn/2021072319061793.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shado


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


w_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0EyODk1OTIyMzIw,size_16,color_FFFFFF,t_70)




当把 hashcode()返回的地址不同时 输出的结果前四个显示 hashcode()方法被调用说明是先进行 hashcode()方法的判断判断是否有形同的地址



????????set.add(new student("xxx", 18));


?? ??? ?set.add(new student("yyy", 18));


?? ??? ?set.add(new student("zzz", 18));


?? ??? ?set.add(new student("xxx", 18));



因为重写了 equals()方法所以第四个值相同所以输出就只有



student [name=xxx, age=18]


student [name=zzz, age=18]


student [name=yyy, age=18]



?



? ? ? ? 输入的值为?



? ? ? ? set.add(new student("xxx", 18));


?? ??? ?set.add(new student("yyy", 18));


?? ??? ?set.add(new student("zzz", 18));


?? ??? ?set.add(new student("xxx", 18));?



当 hashcode()方法地址相同时



输出的第一个结果为 hashcode()方法被调用---因为 set 集合里面没值这是第一个地址



输出的第二个结果为 hashcode()方法被调用---因为是新建了个地址但地址相同则



输出的第三个结果就为 equals()方法被调用? ? ?调用 equals()是对前面那个值进行判断看值是否相同


输出的第四个结果为 hashcode()方法被调用---因为是新建了个地址但地址相同则



输出的第五,六个结果就为 equals()方法被调用? ? ?调用 equals()是对前面那个值进行判断看值是否相同



输出的第七个结果为 hashcode()方法被调用---因为是新建了个地址但地址相同则



输出的第八个结果就为 equals()方法被调用? ? ?调用 equals()是对前面那个值进行判断看值是否相同? 因为只有一个相同的值则判断一次后就结束了并删除了这个重复的值



student [name=xxx, age=18]


student [name=zzz, age=18]


student [name=yyy, age=18]


三:TreeSet(自然排序,比较器排序)



1:自然排序(自然排序是每一个模块都是按照那个排序进行)

//测试类


public class dome3 {


public static void main(String[] args) {


Set<user> set=new TreeSet<>();


set.add(new user("xxx", 20000));


set.add(new user("yyy", 10000));


set.add(new user("zzz", 25000));


for (user user : set) {


System.out.println(user);


}


}


}


//实体类


public 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;


}


@Override


public String toString() {


return "user [name=" + name + ", money=" + money + "]";


}


public user(String name, int money) {


super();


this.name = name;


this.money = money;


}


public user() {


// TODO Auto-generated constructor stub


}


@Override


public int hashCode() {


final int prime = 31;


int result = 1;


result = prime * result + money;


result = prime * result + ((name == null) ? 0 : name.hashCode());


return result;


}


@Override


public boolean equals(Object obj) {


if (this == obj)


return true;


if (obj == null)


return false;


if (getClass() != obj.getClass())


return false;


user other = (user) obj;


if (money != other.money)


return false;


if (name == null) {


if (other.name != null)


return false;


} else if (!name.equals(other.name))


return false;


return true;

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
set集合框架,java消息中间件面试