set 集合框架,java 消息中间件面试
//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
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;
评论