发布时间:2023-08-14 08:30
现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map
接口。
我们通过查看Map
接口描述,发现Map
接口下的集合与Collection
接口下的集合,它们存储数据的形式不同,
如下图:
Collection
中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。Map
中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。Collection
中的集合称为单列集合,Map
中的集合称为双列集合。Map
中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。
tips:Map接口中的集合都有两个泛型变量
,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量 的数据类型可以相同,也可以不同。
Map接口中定义了很多方法,常用的如下:
public V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。public V get(Object key)
根据指定的键,在Map集合中获取对应的值。boolean containsKey(Object key)
判断集合中是否包含指定的键。public Set keySet()
: 获取Map集合中所有的键,存储到Set集合中。public Set> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。Map接口的方法演示:
public class MapDemo { public static void main(String[] args) { //创建 map对象 HashMapmap = new HashMap (); //添加元素到集合 map.put(\"青菜\", \"萝卜\"); map.put(\"红花\", \"绿叶\"); map.put(\"美景\", \"佳人\"); System.out.println(map); //String remove(String key) System.out.println(map.remove(\"青菜\")); System.out.println(map); // 查看 红花的键值是啥 System.out.println(map.get(\"红花\")); System.out.println(map.get(\"青菜\")); } }
Tips:
使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;
若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
键找值方式:即通过元素中的键,获取键所对应的值
分析步骤:
keyset()
get(K key)
代码演示:
public class MapDemo01 { public static void main(String[] args) { //创建Map集合对象 HashMapmap = new HashMap (); //添加元素到集合 map.put(\"青菜\", \"萝卜\"); map.put(\"红花\", \"绿叶\"); map.put(\"美景\", \"佳人\"); //获取所有的键 获取键集 Set keys = map.keySet(); // 遍历键集 得到 每一个键 for (String key : keys) { //key 就是键 //获取对应值 String value = map.get(key); System.out.println(key+\"的CP是:\"+value); } } }
我们已经知道,Map
中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map
中是一一对应关系,这一对对象又称做Map
中的一个Entry(项)
。Entry
将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map
集合时,就可以从每一个键值对(Entry
)对象中获取对应的键与对应的值。
既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:
public K getKey()
:获取Entry对象中的键。public V getValue()
:获取Entry对象中的值。在Map集合中也提供了获取所有Entry对象的方法:
public Set> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
操作步骤:
entrySet()
。getkey() getValue()
public class MapDemo02 { public static void main(String[] args) { // 创建Map集合对象 HashMapmap = new HashMap (); // 添加元素到集合 map.put(\"青菜\", \"萝卜\"); map.put(\"红花\", \"绿叶\"); map.put(\"美景\", \"佳人\"); // 获取 所有的 entry对象 entrySet Set > entrySet = map.entrySet(); // 遍历得到每一个entry对象 for (Entry entry : entrySet) { // 解析 String key = entry.getKey(); String value = entry.getValue(); System.out.println(key+\"的CP是:\"+value); } } }
Tips:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。
练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。
注意:学生姓名相同并且年龄相同视为同一名学生。
编写学生类:
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = 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; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age); } }
编写测试类:
public class HashMapTest { public static void main(String[] args) { //1,创建Hashmap集合对象。 Mapmap = new HashMap (); //2,添加元素。 map.put(newStudent(\"lisi\",28), \"上海\"); map.put(newStudent(\"wangwu\",22), \"北京\"); map.put(newStudent(\"zhaoliu\",24), \"成都\"); map.put(newStudent(\"zhouqi\",25), \"广州\"); map.put(newStudent(\"wangwu\",22), \"南京\"); //3,取出元素。键找值方式 Set keySet = map.keySet(); for(Student key: keySet){ Stringvalue = map.get(key); System.out.println(key.toString()+\".....\"+value); } } }
java.util.LinkedHashMap
集合来存放。我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序,还要速度快怎么办呢?
在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。
public class LinkedHashMapDemo { public static void main(String[] args) { LinkedHashMapmap = new LinkedHashMap (); map.put(\"青菜\", \"萝卜\"); map.put(\"红花\", \"绿叶\"); map.put(\"美景\", \"佳人\"); Set > entrySet = map.entrySet(); for (Entry entry : entrySet) { System.out.println(entry.getKey() + \" \" + entry.getValue()); } } }
结果:
青菜 萝卜
红花 绿叶
美景 佳人
复制代码
需求:计算一个字符串中每个字符出现次数。
分析:
代码:
public class MapTest { public static void main(String[] args) { //友情提示 System.out.println(\"请录入一个字符串:\"); String line = new Scanner(System.in).nextLine(); // 定义 每个字符出现次数的方法 findChar(line); } private static void findChar(String line) { //1:创建一个集合 存储 字符 以及其出现的次数 HashMapmap = new HashMap (); //2:遍历字符串 for (int i = 0; i < line.length(); i++) { char c = line.charAt(i); //判断 该字符 是否在键集中 if (!map.containsKey(c)) {//说明这个字符没有出现过 //那就是第一次 map.put(c, 1); } else { //先获取之前的次数 Integer count = map.get(c); //count++; //再次存入 更新 map.put(c, ++count); } } System.out.println(map); } }
通常,我们在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 add方法 调用,使得代码重复。
public class Demo01 { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(\"abc\"); list.add(\"def\"); list.add(\"ghi\"); System.out.println(list); } }
Java 9,添加了几种集合工厂方法,更方便创建少量元素的集合、map实例。新的List、Set、Map的静态工厂方法可以更方便地创建集合的不可变实例。
例子:
public class HelloJDK9 { public static void main(String[] args) { Setstr1=Set.of(\"a\",\"b\",\"c\"); //str1.add(\"c\");这里编译的时候不会错,但是执行的时候会报错,因为是不可变的集合 System.out.println(str1); Map str2=Map.of(\"a\",1,\"b\",2); System.out.println(str2); List str3=List.of(\"a\",\"b\"); System.out.println(str3); } }
需要注意以下两点:
of()方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如 HashSet,ArrayList等待;
返回的集合是不可变的;
到此这篇关于java Map接口子类HashMap遍历与LinkedHashMap详解的文章就介绍到这了,更多相关Java Map接口 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
BufferedWniter_字符缓冲输出流和BufferedReader_字符缓冲输入流
Java微服务开发指南-使用Docker和Kubernetes构建可伸缩的微服务
python中ahp的代码_AHP | 层次分析法原理及Python实现
Android Gradle生命周期与Gradle 自定义插件
UE4 利用WEBUI插件完成UE与JS的交互 (UE4嵌入WEB)
《论文阅读》LVI-SAM: Tightly-coupled Lidar-Visual-Inertial Odometry via Smoothing and Mapping
为了更好的吃这个瓜,我去拉了一下评论,吵起来了,太有意思了。
4.DesignForShapes\CreateAutoShape(ShieldGnd)