Java面向对象之Set 接口实现类-LinkedHashSet 及 Map 接口和常用方法

文章目录

      • 1、Set 接口实现类-LinkedHashSet
        • 1.1、LinkedHashSet 的全面说明
        • 1.2、LinkedHashSet 代码实现
      • 2、Map 接口和常用方法
        • 2.1、Map 接口实现类的特点
        • 2.2、Map 接口常用方法
        • 2.3、Map 接口遍历方法
        • 2.4、Map 接口小练习

1、Set 接口实现类-LinkedHashSet

1.1、LinkedHashSet 的全面说明

在这里插入图片描述
在这里插入图片描述

1.2、LinkedHashSet 代码实现

在这里插入图片描述

package set_;import java.util.LinkedHashSet;
import java.util.Objects;@SuppressWarnings({"all"})
public class LinkedHashSetExercise {public static void main(String[] args) {LinkedHashSet linkedHashSet = new LinkedHashSet();linkedHashSet.add(new Car("奥拓", 1000));  // OKlinkedHashSet.add(new Car("奥迪", 300000));  // OKlinkedHashSet.add(new Car("法拉利", 10000000));  // OKlinkedHashSet.add(new Car("奥迪", 300000));  // 加入不了linkedHashSet.add(new Car("保时捷", 70000000));  // OKlinkedHashSet.add(new Car("奥迪", 300000));  // 加入不了System.out.println("linkedHashSet=" + linkedHashSet);/*** linkedHashSet=[* Car{name='奥拓', price=1000.0}, * Car{name='奥迪', price=300000.0}, * Car{name='法拉利', price=1.0E7}, * Car{name='保时捷', price=7.0E7}]*/}
}/*** Car 类(属性:name,price), 如果 name 和 price 一样* 则认为是相同元素, 就不能添加*/
class Car {private String name;private double price;public Car(String name, double price) {this.name = name;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "\nCar{" +"name='" + name + '\'' +", price=" + price +'}';}// 重写 equals 方法 和 hashCode// 当 name 和 price 相同时, 就返回相同的 hashCode 值, equals 返回 true@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Car car = (Car) o;return Double.compare(car.price, price) == 0 && Objects.equals(name, car.name);}@Overridepublic int hashCode() {return Objects.hash(name, price);}
}

2、Map 接口和常用方法

2.1、Map 接口实现类的特点

在这里插入图片描述
在这里插入图片描述

package map_;import java.util.HashMap;
import java.util.Map;@SuppressWarnings({"all"})
public class Map_ {public static void main(String[] args) {// Map 接口实现类的特点, 使用实现类 HashMap// 1. Map 与 Collection 并列存在, 用于保存具有映射关系的数据: Key-Value(双列元素)// 2. Map 中的 key 和 value 可以是任何引用类型的数据, 会封装到 HashMap$Node 对象中// 3. Map 中的 key 不允许重复, 原因和 HashSet 一样, 分析过源码// 4. Map 中的 value 可以重复// 5. Map 的 key 可以为 null, value 也可以为 null, 注意 key 为 null, 只能有一个, value 为 null, 可以多个// 6. 常用 String 类作为 Map 的 key// 7. key 和 value 之间存在单向一对一关系, 即通过指定的 key 总能找到对应的 valueMap map = new HashMap();map.put("no1", "赵敏");  // k-vmap.put("no2", "张无忌");  // k-vmap.put("no1", "张三丰");  // 当有相同的 k, 就等价于替换map.put("no3", "张三丰");  // k-vmap.put(null, null);  // k-vmap.put(null, "abc");  // 等价替换map.put("no4", null);  // k-vmap.put("no5", null); //k-vmap.put(1, "周芷若");  // k-vmap.put(new Object(), "金毛狮王");  // k-v// 通过 get 方法, 传入 key, 会返回对应的 valueSystem.out.println(map.get("no2"));  // 张无忌System.out.println("map=" + map);  // map={no2=张无忌, null=abc, no1=张三丰, 1=周芷若, no4=null, no3=张三丰, no5=null, java.lang.Object@1b6d3586=金毛狮王}}
}

2.2、Map 接口常用方法

package map_;import java.util.HashMap;
import java.util.Map;@SuppressWarnings({"all"})
public class MapMethod {public static void main(String[] args) {// map 接口常用方法Map map = new HashMap();map.put("邓超", new Book("", 100));  // OKmap.put("邓超", "孙俪");  // 替换操作, 分析源码map.put("王宝强", "马蓉");  // OKmap.put("宋喆", "马蓉");  // OKmap.put("刘令博", null);  // OKmap.put(null, "刘亦菲");  // OKmap.put("鹿晗", "关晓彤");  // OKmap.put("jack", "jack 的老婆");  // OKSystem.out.println("map=" + map);  // map={邓超=孙俪, 宋喆=马蓉, 刘令博=null, null=刘亦菲, 王宝强=马蓉, 鹿晗=关晓彤, jack=jack 的老婆}// remove: 根据键删除映射关系map.remove(null);System.out.println("map=" + map);  // map={邓超=孙俪, 宋喆=马蓉, 刘令博=null, 王宝强=马蓉, 鹿晗=关晓彤, jack=jack 的老婆}// get: 根据键获取值Object val = map.get("鹿晗");System.out.println("val=" + val);  // val=关晓彤// size: 获取元素个数System.out.println("size=" + map.size());  // size=6// isEmpty: 判断个数是否为 0System.out.println(map.isEmpty());  // false// containsKey: 查找键是否存在System.out.println("结果=" + map.containsKey("allen"));  // 结果=false// clear: 清除 k-vmap.clear();System.out.println("map=" + map);  // map={}}
}class Book {private String name;private int num;public Book(String name, int num) {this.name = name;this.num = num;}
}

2.3、Map 接口遍历方法

在这里插入图片描述
在这里插入图片描述

package map_;import java.util.*;@SuppressWarnings({"all"})
public class MapFor {public static void main(String[] args) {Map map = new HashMap();map.put("邓超", "孙俪");map.put("王宝强", "马蓉");map.put("宋喆", "马蓉");map.put("刘令博", null);map.put(null, "刘亦菲");map.put("鹿晗", "关晓彤");// 第一组: 先取出 所有的 Key, 通过 Key 取出对应的 ValueSet keySet = map.keySet();// (1) 增强 forSystem.out.println("===第一种方式===");for (Object key : keySet) {System.out.println(key + "-" + map.get(key));/*** ===第一种方式===* 邓超-孙俪* 宋喆-马蓉* 刘令博-null* null-刘亦菲* 王宝强-马蓉* 鹿晗-关晓彤*/}// (2) 迭代器System.out.println("===第二种方式===");Iterator iterator = keySet.iterator();while (iterator.hasNext()) {Object key = iterator.next();System.out.println(key + "-" + map.get(key));/*** ===第二种方式===* 邓超-孙俪* 宋喆-马蓉* 刘令博-null* null-刘亦菲* 王宝强-马蓉* 鹿晗-关晓彤*/}// 第二组: 把所有的 values 取出来Collection values = map.values();// 这里可以使用所有的 Collections 使用的遍历方法// (1) 增强 forSystem.out.println("===取出所有的 value 增强 for===");for (Object value : values) {System.out.println(value);/*** ===取出所有的 value 增强 for===* 孙俪* 马蓉* null* 刘亦菲* 马蓉* 关晓彤*/}// (2) 迭代器System.out.println("===取出所有的 value 迭代器===");Iterator iterator2 = values.iterator();while (iterator2.hasNext()) {Object value = iterator2.next();System.out.println(value);/*** ===取出所有的 value 迭代器===* 孙俪* 马蓉* null* 刘亦菲* 马蓉* 关晓彤*/}// 第三组: 通过 EntrySet 来获取 k-vSet entrySet = map.entrySet();  // EntrySet>// (1) 增强 forSystem.out.println("===使用 EntrySet 的 for 增强(第 3 种)===");for (Object entry : entrySet) {// 将 entry 转成 Map.EntryMap.Entry m = (Map.Entry) entry;System.out.println(m.getKey() + "-" + m.getValue());/*** ===使用 EntrySet 的 for 增强(第 3 种)===* 邓超-孙俪* 宋喆-马蓉* 刘令博-null* null-刘亦菲* 王宝强-马蓉* 鹿晗-关晓彤*/}// (2) 迭代器System.out.println("===使用 EntrySet 的 迭代器(第 4 种)===");Iterator iterator3 = entrySet.iterator();while (iterator3.hasNext()) {Object entry = iterator3.next();// System.out.println(entry.getClass());  // HashMap$Node 实现 -> Map.Entry (getKey, getValue)Map.Entry m = (Map.Entry) entry;System.out.println(m.getKey() + "-" + m.getValue());/*** ===使用 EntrySet 的 迭代器(第 4 种)===* 邓超-孙俪* 宋喆-马蓉* 刘令博-null* null-刘亦菲* 王宝强-马蓉* 鹿晗-关晓彤*/}}
}

2.4、Map 接口小练习

在这里插入图片描述

package map_;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;@SuppressWarnings({"all"})
public class MapExercise {public static void main(String[] args) {// 代码实现Map hashMap = new HashMap();// 添加对象hashMap.put(1, new Emp("jack", 300000, 1));hashMap.put(2, new Emp("tom", 21000, 2));hashMap.put(3, new Emp("milan", 12000, 3));// 遍历 2 种方式// 并遍历显示工资>18000 的员工(遍历方式最少两种)// 1. 使用 keySet -> 增强 forSet keySet = hashMap.keySet();System.out.println("===增强 for===");for (Object key : keySet) {// 先获取 valueEmp emp = (Emp) hashMap.get(key);if (emp.getSal() > 18000) {System.out.println(emp);/*** ===增强 for===* Emp{name='jack', sal=300000.0, id=1}* Emp{name='tom', sal=21000.0, id=2}*/}}// 2. 使用 EntrySet -> 迭代器Set entrySet = hashMap.entrySet();System.out.println("===迭代器===");Iterator iterator = entrySet.iterator();while (iterator.hasNext()) {Map.Entry entry = (Map.Entry) iterator.next();// 通过 entry 取得 key 和 valueEmp emp = (Emp) entry.getValue();if (emp.getSal() > 18000) {System.out.println(emp);/*** ===迭代器===* Emp{name='jack', sal=300000.0, id=1}* Emp{name='tom', sal=21000.0, id=2}*/}}}
}/*** 使用 HashMap 添加 3 个员工对象,要求* 键:员工 id* 值:员工对象* 

* 并遍历显示工资>18000 的员工(遍历方式最少两种)* 员工类:姓名、工资、员工 id*/ class Emp {private String name;private double sal;private int id;public Emp(String name, double sal, int id) {this.name = name;this.sal = sal;this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSal() {return sal;}public void setSal(double sal) {this.sal = sal;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "Emp{" +"name='" + name + '\'' +", sal=" + sal +", id=" + id +'}';} }


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部