题目:
设计一个User类,保护三个基本私有属性 : String id; String name;String gender;以及三个属性的setter与getter方法,重新类的toStrng方法,toString方法输出对象的属性。
使用for循环创建 50个User对象,创建用户对象时,使用 "emp"+r.nextInt(100) 产生用户的id,gender和name随意,分别把用户存入到 ArrayList ,HashSet,以及map中,要求id作为用户的唯一性标识存入到集合中(即同一个集合和map中不能存在相同id的用户)
分别使用 迭代器 和for循环机增强for循环,输出集合中用户的属性信息。
(注:r 时一个 Random类的实例)
难点:id需作为用户的唯一性标识,而Set只能确保User不重复,不能确保id不重复。
解决方法:重载equals方法和hashCode方法,使得Set以id来判断是否重复。
为何要重载equals和hashCode:https://blog.csdn.net/violet_echo_0908/article/details/50152915
个人解释:
重载equals():用id来判断两个对象是否相等;
重载hashCode():因为两个对象相等,哈希值也会相等。一个哈希值能对应多个对象,一个对象只能有一个哈希值,所以重载hashCode方法,使id作为哈希值,这样就可以确保id唯一性。
代码:
package lesson6;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
public class MySet {
public class User{
private String id;
private String name;
private String gender;
public void setId(String Id) {
id=Id;
}
public String getId() {
return id;
}public void setName(String Name) {
name=Name;
}
public String getName() {
return name;
}public void setGender(String Gender) {
gender=Gender;
}
public String getGender() {
return gender;
}
public String toString() {
return id+" "+name+" "+gender;
}
public boolean equals(Object obj) {
User user1 = (User)obj;
String id1 = user1.getId();
String id2 = this.getId();
return id1.equals(id2);
}
public int hashCode() {
return Integer.parseInt(this.getId().substring(3));
}
}
public String newGender() {
int x=r.nextInt(2);
if(x==0) {
return "men";
}
return "women";
}
public String newName() {
String str1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String str2="abcdefghijklmnopqrstuvwxyz";
Random random=new Random();
StringBuffer sb=new StringBuffer();
int number=random.nextInt(26);
sb.append(str1.charAt(number));
for(int i=0;i<5;i++){
number=random.nextInt(26);
sb.append(str2.charAt(number));
}
return sb.toString();
}
public static Random r=new Random();
public static void main(String[] args) {
// TODO 自动生成的方法存根
MySet ms = new MySet();
List<User> list = new ArrayList<>();
Set<User> set = new HashSet<>();
Map<String,User> map = new HashMap<>();
for(int i=0;i<50;i++) {
User user = ms.new User();
user.setId("emp"+r.nextInt(100));
user.setGender(ms.newGender());
user.setName(ms.newName());
if(i<20) {
list.add(user);
}
else if(i>40) {
map.put(user.getId(),user);
}
else {
set.add(user);
}
}
Iterator<User> it1 = list.iterator();
while(it1.hasNext()) {
System.out.println(it1.next().toString());
}
Iterator<User> it2 = set.iterator();
while(it2.hasNext()) {
System.out.println(it2.next().toString());
}
Collection<User> coll = map.values();
Iterator<User>it3 = coll.iterator();
while(it3.hasNext()) {
System.out.println(it3.next().toString());
}
}
}