Map的遍历方式:使用keySet,values和entrySet

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

遍历结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值