“ 我是小羊同学,一个兢兢业业的程序员”
Map集合
概述
IP地址与主机名,身份证号码与个人,这种一一对应的关系,被称为映射。在java中,有用来专门存放这种对象关系的集合类。java.util.Map
接口
Map接口与Collection接口的存储数据形式不同
Collection
中的集合,元素是孤立存在的(单身),存储采用一个个元素的方式存储Map
中的集合,元素是成对存在的(夫妻),每个元素由键和值两部分组成,通过键来找到值,一一对应,一个键对应的只有一个值Collection
中的集合被称为单列集合,Map
中的集合被称为双列集合Map中的集合,键不能重复,值可以重复
Map常用子类
HashMap
,LinkedHashMap
集合
HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
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集合)。
//当使用put方法时 ,若指定key在集合中没有,则对应值返回为null,并且把指定值添加到集合中//若key值存在,则返回值为集合中原本存在的值(替换前的值),并把指定键Kry对应的值,进行替换public class MapDemo { public static void main(String[] args) { //创建 map对象 Map<String, String> map = new HashMap<String, String>(); //添加元素到集合 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("吕布")); //貂蝉 }}
Map集合遍历找键的方式
键找值:通过元素的键,获取键对应的值
步骤分析:1.获取Map中所有的键,返回一个Set集合存储所有的键 //keyset()2.遍历键的Set集合,得到每一个键3.根据键,获取对应的值 //get(K key)
Entry键值对对象
Map存放的是两种对象,一是key(键),二是value(值),在Map中是一一对应的关系,这一对对象,又被称为Map中的一个Entry(项)
Entry将键值对的对应关系封装成了对象(键值对对象),这样可以使我们,在遍历Map集合时,可以从每一个键值对 对象中获取对应的键与值
方法
public K getKey()
:获取Entry对象中的键。public V getValue()
:获取Entry对象中的值。
public Set> entrySet()
: 获取到Map集合中所有的键值对对象的集合(Set集合)。
Map集合遍历键值对方式
键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
步骤:1.获取Map集合中,所有键值对(Entry)对象,以Set集合返回 //entrySet()2.遍历键值对对象的Set集合,得到每一天键值对(Entry)对象3.通过键值对对象,获取Entry对象中的键与值 //getkey() getvalue()
代码: public class MapDemo02 { public static void main(String[] args) { // 创建Map集合对象 HashMap<String, String> map = new HashMap<String,String>(); // 添加元素到集合 map.put("小月", "小轩"); map.put("无敌", "鲁班"); map.put("吕布", "貂蝉"); // 获取 所有的 entry对象 entrySet SetString, // 遍历得到每一个entry对象 for (Entry<String, String> entry : entrySet) { // 解析 String key = entry.getKey(); String value = entry.getValue(); System.out.println(key+"的值是:"+value); } }}
Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。
HashMap存储自定义类型键值
练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到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; } //重写toString方法 @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } //重写equals方法 @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); } //重写hashCode方法 @Override public int hashCode() { return Objects.hash(name, age); }}
测试类
import java.util.HashMap;import java.util.Map;import java.util.Set;public class HashMapTest { public static void main(String[] args) { //1,创建Hashmap集合对象。 Mapmap = new HashMap(); //2,添加元素。 map.put(new Student("李四",28), "上海"); map.put(new Student("王五",22), "北京"); map.put(new Student("小罗",24), "成都"); map.put(new Student("小月",18), "广州"); map.put(new Student("小轩",22), "南京"); //3,取出元素。键找值方式 Set keySet = map.keySet(); for(Student key: keySet){ String value = map.get(key); System.out.println(key.toString()+"....."+value); } }}
在给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法
java.util.LinkedHashMap
集合,可以保证map存放的key和取出顺序一致
LinkedHashMap
HashMap保证成对元素唯一,并且查询速度很快,但是成对元素存放进去没有顺序,若要保证有序,并且速度快,我们可以使用HashMAp下面的一个子类LinkedHashMap
public class LinkedHashMapDemo { public static void main(String[] args) { LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(); map.put("小月", "小轩"); map.put("无敌", "鲁班"); map.put("吕布", "貂蝉"); SetString, for (Entry<String, String> entry : entrySet) { System.out.println(entry.getKey() + " " + entry.getValue()); } }}
结果
小月 小轩无敌 鲁班吕布 貂蝉
JDK9的优化
class HelloJDK9 { public static void main(String[] args) { Set<String> str1=Set.of("a","b","c"); //str1.add("c");这里编译的时候不会错,但是执行的时候会报错,因为是不可变的集合 System.out.println(str1); Map<String,Integer> str2=Map.of("a",1,"b",2); System.out.println(str2); List<String> str3=List.of("a","b"); System.out.println(str3); }}结果[c, b, a]{b=2, a=1}[a, b]
tips:
1:of()方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如 HashSet,ArrayList等待;
2:返回的集合是不可变的;
JAVA+Windows每日爬取必应壁纸
2020年11月程序员工资统计,平均14327元
如何编写优雅的异步代码 — CompletableFuture
据说是程序员才看懂的段子。。。
end
*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。
好文!必须在看