package map_;
import java.util.*;
public class Exercise {
public static void main(String[] args) {
HashMap<Integer, person> Person_ = new HashMap<>();
Person_.put(1, new person("AAA", 20, 10000));
Person_.put(2, new person("BBB", 22, 20000));
Person_.put(3, new person("CCC", 23, 30000));
Set<Integer> integers = Person_.keySet();
for (Object key : integers) {
Object Key = Person_.get(key);
person person1 = (person) Key;
if (person1.getSalary() > 18000) {
System.out.println("id = " + key + " Name = " + person1.getName() + " age = "
+ person1.getAge() + " salary = " + person1.getSalary());
}
}
System.out.println("========================");
Iterator<Integer> iterator = integers.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
if (Person_.get(next).getSalary() > 18000) {
System.out.println("id = " + next + " " + Person_.get(next));
}
}
System.out.println("========================");
Collection<person> values = Person_.values();
System.out.println(values);
for (person persons : values) {
if (persons.getSalary() > 18000) {
System.out.println(persons);
}
}
System.out.println("========================");
Iterator<person> iterator1 = values.iterator();
while (iterator1.hasNext()) {
person next = iterator1.next();
if (next.getSalary() > 18000) {
System.out.println(next);
}
}
System.out.println("========================");
Set<Map.Entry<Integer, person>> entries = Person_.entrySet();
/**这行代码用于获取一个 Map 中的所有条目(键-值对),然后将这些条目放入一个 Set 集合中。每个条目都是一个 Map.Entry 对象,其中包含了键和对应的值。
* 这样做的好处是可以通过迭代遍历这个 Set 集合来访问和操作 Map 中的所有键值对。*/
System.out.println(entries.getClass());
//entries集合里面存放着元素,每个元素都是Map.Entry<K,V>,所有entries 增强for循环遍历entry的类型要写Map.Entry<K,V>
//这里就是每个entries都是HashMap$EntrySet
for (Map.Entry<Integer,person> entry : entries) {
if (entry.getValue().getSalary() > 18000) {
System.out.println(entry.getValue());
}
}
System.out.println("========================");
/**
Set entries = Person_.entrySet();
//这里的entries集合里面是Node属于Object类型不像上面每个元素是Map.Entry,Node是静态内部类不能被其他包使用所有不能getValue和getKey,所以要转成Map.Entry<K,V>
System.out.println(entries.getClass()); // class java.util.HashMap$EntrySet
for (Object entry : entries) {
System.out.println(entry.getClass()); // class java.util.HashMap$Node
Map.Entry<Integer,person> entry1 = (Map.Entry<Integer, person>) entry;
System.out.println(entry1.getValue());
}
*/
/**
* 在Java中,使用泛型可以在集合中指定特定类型的元素。在您提供的代码中,Set<Map.Entry<Integer, person>> entries = Person_.entrySet(); 和 Set entries = Person_.entrySet(); 之间的区别涉及到泛型的使用。
* Set<Map.Entry<Integer, person>> entries = Person_.entrySet();
* 这行代码声明了一个变量 entries,它是一个Set类型的集合,该集合中的每个元素都是一个 Map.Entry 对象。这个 Map.Entry 对象有两个泛型类型参数:Integer 和 person,分别表示键的类型和值的类型。
* 这意味着这个集合中存储的元素是 Map.Entry<Integer, person> 类型的。
* 这种用法可以确保在迭代 entries 集合时,您可以直接获取键和值,并且编译器会强制执行类型检查。
* Set entries = Person_.entrySet();
* 这行代码声明了一个变量 entries,同样是一个 Set 类型的集合,但是没有指定泛型类型参数。这意味着这个集合中的元素可以是任何类型,编译器不会执行类型检查。
* 这种情况下,您在迭代 entries 集合时需要自己进行类型转换,可能会引发类型转换异常。*/
Iterator<Map.Entry<Integer, person>> iterator2 = entries.iterator();
System.out.println(iterator2.getClass());
while (iterator2.hasNext()) {
Map.Entry<Integer,person> entry = iterator2.next(); // 每个元素都是Map.Entry所以entry的类型是Map.Entry。
person person_1 = entry.getValue();
if (person_1.getSalary() > 18000) {
System.out.println(entry.getValue());
}
}
System.out.println("========================");
}
}
class person {
private String name;
private int age;
private double salary;
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
public person(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
遍历结果: