文章目录
现在已经是深夜十二点了,才复习完Map部分的内容,打算将自己今天所学的再做一次巩固,毕竟这一次是我打算给自己留的最后一次机会了,不管以后的路是平坦,是坎坷,我只需要做到无悔于自己的决定。
文章目录
前言
话不多说,开始干。
提示:以下是本篇文章正文内容,下面案例可供参考
一、认识Map集合
(1)、Map集合的说明
在前面我已经解释过集合大家族的另一位成员(Collection),今天来对比着讲解一下本次的主角Map集合,前面说到 Collection集合 其存储特点是存入的是单个的引用类数据,在进行数据的查询的时候可以通过其对应的下标来查询,存储的方式是有序的,而这次的Map集合存入的确实有着映射关系的“键值对”数据,所谓“键值对(key–values)”,一个键(key) 对应着一个值(values),键与值之间的关系是 一 一对应的 ,即 一个键对应着一个值,可以在遍历的时候通过键的查询来锁定需要获取的值。此外存储的方式是无序的
(2)、Map的结构图
今天的主要内容就是以上已经展示出来的,我会尽自己的最大能力来进行解读,其中尽量通过案例来进行解读,还会将部分面试题公布出来,由于集合非常重要,应聘的时候百分之七十的面试题都是和集合有关的。
二、走进集合
(1)、HashMap的认识与使用
对于HashMap而言,最主要的是要先了解他的结构,存储数据的特点(以键值对的方式进行存储),然后了解一下它的基本操作与遍历方式,我将常用的部分以案例的形式发布出来了,写了有点久,主要是上课的笔记有点小混乱。
package net.yzy.homework.homework13.hashmap_class;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
/**
* 知识点:HashMap的方法使用
*
* 总结:
* HashMap key是唯一的,value可以重复
* HashMap 存储键值对、无序的
*/
public class Test01 {
public static void main(String[] args) {
HashMap<String,Integer> map=new HashMap<>();//创建一个HashMap
//添加元素
map.put("盖伦",27);
map.put("赵信",21);
map.put("嘉文",21);
map.put("拉克丝",22);
map.put("伊泽瑞尔",23);
System.out.println("-------------------------------------");
Integer put=map.put("塔里克",25);
System.out.println(put);//第一次添加key,返回null
//清空集合
//map.clear();
System.out.println("判断在集合中是否有某个key:"+map.containsKey("盖伦"));//true
System.out.println("判断此集合中是否有某个value:"+map.containsValue(25));//true
System.out.println("-------------------------------------");
System.out.println("通过key获取对应的value");
System.out.println("通过key获取对应的value值:"+map.get("赵信"));
System.out.println("通过key获取对应的value值:"+map.getOrDefault("雍仲杨",888));//如果没有该对象则返回默认值888
System.out.println("判断集合中是否没有元素:"+map.isEmpty());//false
System.out.println("-------------------------------------");
System.out.println("将新集合中的所有元素添加到map集合中操作:");
//创建HashMap集合
HashMap<String,Integer> newMap1=new HashMap<>();
newMap1.put("卢锡安",21);
newMap1.put("赛娜",20);
newMap1.put("雷恩加尔",30);
map.putAll(newMap1);//将新集合添加到map集合中去
System.out.println("-------------------------------------");
System.out.println("添加元素操作");
/**
* 如果有 该 key就不添加,返回集合中的value
* 如果 没有 ,就添加 k-v
*/
Integer putIfAbsent=map.putIfAbsent("奥拉夫",123);
System.out.println(putIfAbsent);//null,说明之前的集合中是没有的
System.out.println("-------------------------------------");
System.out.println("删除操作:");
map.remove("赛娜");//通过key来删除映射关系
map.remove("卢锡安",21);//通过key + value来删除
System.out.println("-------------------------------------");
System.out.println("替换操作:");
Integer replace=map.replace("雷恩加尔",50);//通过key来替换value
System.out.println("返回替换前的value值:"+replace);
System.out.println("替换后的值:"+map.get("雷恩加尔"));//替换后的值
map.replace("雷恩加尔",50,100);//通过key+value的值来替换
System.out.println("-------------------------------------");
System.out.println("替换操作:");
Integer put2=map.put("雷恩加尔",50);//添加元素,如果有相同的key,就替换value,并返回旧值
System.out.println("替换前的值:"+put2);//返回替换之前的值 100
System.out.println(map.get("雷恩加尔"));//50,返回新值
System.out.println("-------------------------------------");
System.out.println("返回集合中的映射个数:");
System.out.println("集合中映射个数为:"+map.size());
System.out.println("-------------------------------------");
System.out.println("获取所有的value值的操作:");
Collection<Integer> values=map.values();//将所有的值存入到Collection集合中
System.out.println(values);
System.out.println("-------------------------------------");
System.out.println("遍历方法1---keySet()");
//遍历思路:把HashMap中所有的key抽取出存放在Set集合中,遍历Set集合依次取出Key,就能依次取出对应的value
Set<String> keySet=map.keySet();//取出所有的key存放在keySet中
for (String a:keySet) {
Integer value=map.get(a);
System.out.println(a+"---"+value);
}
System.out.println("-------------------------------------");
System.out.println("遍历方法2--entrySet()");
//遍历思路:把HashMap中所有的映射关系(Entry)抽取出存放在Set集合中,
// 遍历Set集合依次取出映射关系(Entry),就能获取映射关系中的key和value
Set<Entry<String,Integer>> entrySet=map.entrySet();
for (Entry<String,Integer>a:entrySet
) {
String key=a.getKey();//获取每一个键
Integer value=a.getValue();//获取每一个值
System.out.println(key+"---"+value);
}
System.out.println("------------基本操作如上---------------");
}
}
以上就是对于HashMap的一些基本操作。比较简单,虽然我是以案例的形式进行展示,但是该有的操作都有,而且是我一点一点从API上查完后才补充的,其中加了一些自己的解释。
(2)、LinkedHashMap的使用
LinkedHashMap的使用与 HashMap的使用差不多,毕竟是有着继承关系的,区别在于HashMap 是一个散列表,它存储的内容是键值对(key-value)映射,LinkedHashMap是HashMap的子类,但是内部还有一个双向链表维护键值对的顺序,每个键值对既位于哈希表中,也位于双向链表中。LinkedHashMap支持两种顺序插入顺序 、 访问顺序
package net.yzy.homework.homework13.linkedhashmap_class;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Set;
/**
* 知识点:LinkedHashMap的方法使用
* <p>
* 总结:
* LinkedHashMap key是唯一的,value可以重复
* LinkedHashMap 存储键值对、有序的
*/
public class Test01 {
public static void main(String[] args) {
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
//添加元素
map.put("盖伦", 27);
map.put("赵信", 21);
map.put("嘉文", 21);
map.put("拉克丝", 22);
map.put("伊泽瑞尔", 23);
System.out.println("-------------------------------------");
Integer put = map.put("塔里克", 25);
System.out.println(put);//第一次添加key,返回null
//清空集合
//map.clear();
System.out.println("判断在集合中是否有某个key:" + map.containsKey("盖伦"));//true
System.out.println("判断此集合中是否有某个value:" + map.containsValue(25));//true
System.out.println("-------------------------------------");
System.out.println("通过key获取对应的value");
System.out.println("通过key获取对应的value值:" + map.get("赵信"));
System.out.println("通过key获取对应的value值:" + map.getOrDefault("雍仲杨", 888));//如果没有该对象则返回默认值888
System.out.println("判断集合中是否没有元素:" + map.isEmpty());//false
System.out.println("-------------------------------------");
System.out.println("将新集合中的所有元素添加到map集合中操作:");
//创建HashMap集合
LinkedHashMap<String, Integer> newMap1 = new LinkedHashMap<>();
newMap1.put("卢锡安", 21);
newMap1.put("赛娜", 20);
newMap1.put("雷恩加尔", 30);
map.putAll(newMap1);//将新集合添加到map集合中去
System.out.println("-------------------------------------");
System.out.println("添加元素操作");
/**
* 如果有 该 key就不添加,返回集合中的value
* 如果 没有 ,就添加 k-v
*/
Integer putIfAbsent = map.putIfAbsent("奥拉夫", 123);
System.out.println(putIfAbsent);//null,说明之前的集合中是没有的
System.out.println("-------------------------------------");
System.out.println("删除操作:");
map.remove("赛娜");//通过key来删除映射关系
map.remove("卢锡安", 21);//通过key + value来删除
System.out.println("-------------------------------------");
System.out.println("替换操作:");
Integer replace = map.replace("雷恩加尔", 50);//通过key来替换value
System.out.println("返回替换前的value值:" + replace);
System.out.println("替换后的值:" + map.get("雷恩加尔"));//替换后的值
map.replace("雷恩加尔", 50, 100);//通过key+value的值来替换
System.out.println("-------------------------------------");
System.out.println("替换操作:");
Integer put2 = map.put("雷恩加尔", 50);//添加元素,如果有相同的key,就替换value,并返回旧值
System.out.println("替换前的值:" + put2);//返回替换之前的值 100
System.out.println(map.get("雷恩加尔"));//50,返回新值
System.out.println("-------------------------------------");
System.out.println("返回集合中的映射个数:");
System.out.println("集合中映射个数为:" + map.size());
System.out.println("-------------------------------------");
System.out.println("获取所有的value值的操作:");
Collection<Integer> values = map.values();//将所有的值存入到Collection集合中
System.out.println(values);
System.out.println("-------------------------------------");
System.out.println("遍历方法1---keySet()");
//遍历思路:把HashMap中所有的key抽取出存放在Set集合中,遍历Set集合依次取出Key,就能依次取出对应的value
Set<String> keySet = map.keySet();//取出所有的key存放在keySet中
for (String a : keySet) {
Integer value = map.get(a);
System.out.println(a + "---" + value);
}
System.out.println("-------------------------------------");
System.out.println("遍历方法2--entrySet()");
//遍历思路:把HashMap中所有的映射关系(Entry)抽取出存放在Set集合中,
// 遍历Set集合依次取出映射关系(Entry),就能获取映射关系中的key和value
Set<Entry<String, Integer>> entrySet = map.entrySet();
for (Entry<String, Integer> a : entrySet
) {
String key = a.getKey();//获取每一个键
Integer value = a.getValue();//获取每一个值
System.out.println(key + "---" + value);
}
}
}
(3)、HashTable的认识与使用
认识:相比较于HashMap,HashTable的运行效率更慢,线程安全,不允许null作为键或者值,其余的基本操作与前面的一样,没什么变化,都是Map的实现类
package net.yzy.homework.homework13.Hashtable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map.Entry;
import java.util.Set;
public class Test01 {
public static void main(String[] args) {
Hashtable<String, Integer> map = new Hashtable<>();
map.put("盖伦",27);
map.put("赵信",21);
map.put("嘉文",21);
map.put("拉克丝",22);
map.put("伊泽瑞尔",23);
System.out.println("-------------------------------------");
Integer put=map.put("塔里克",25);
System.out.println(put);//第一次添加key,返回null
//清空集合
//map.clear();
System.out.println("判断在集合中是否有某个key:"+map.containsKey("盖伦"));//true
System.out.println("判断此集合中是否有某个value:"+map.containsValue(25));//true
System.out.println("-------------------------------------");
System.out.println("通过key获取对应的value");
System.out.println("通过key获取对应的value值:"+map.get("赵信"));
System.out.println("通过key获取对应的value值:"+map.getOrDefault("雍仲杨",888));//如果没有该对象则返回默认值888
System.out.println("判断集合中是否没有元素:"+map.isEmpty());//false
System.out.println("-------------------------------------");
System.out.println("将新集合中的所有元素添加到map集合中操作:");
//创建HashMap集合
HashMap<String,Integer> newMap1=new HashMap<>();
newMap1.put("卢锡安",21);
newMap1.put("赛娜",20);
newMap1.put("雷恩加尔",30);
map.putAll(newMap1);//将新集合添加到map集合中去
System.out.println("-------------------------------------");
System.out.println("添加元素操作");
/**
* 如果有 该 key就不添加,返回集合中的value
* 如果 没有 ,就添加 k-v
*/
Integer putIfAbsent=map.putIfAbsent("奥拉夫",123);
System.out.println(putIfAbsent);//null,说明之前的集合中是没有的
System.out.println("-------------------------------------");
System.out.println("删除操作:");
map.remove("赛娜");//通过key来删除映射关系
map.remove("卢锡安",21);//通过key + value来删除
System.out.println("-------------------------------------");
System.out.println("替换操作:");
Integer replace=map.replace("雷恩加尔",50);//通过key来替换value
System.out.println("返回替换前的value值:"+replace);
System.out.println("替换后的值:"+map.get("雷恩加尔"));//替换后的值
map.replace("雷恩加尔",50,100);//通过key+value的值来替换
System.out.println("-------------------------------------");
System.out.println("替换操作:");
Integer put2=map.put("雷恩加尔",50);//添加元素,如果有相同的key,就替换value,并返回旧值
System.out.println("替换前的值:"+put2);//返回替换之前的值 100
System.out.println(map.get("雷恩加尔"));//50,返回新值
System.out.println("-------------------------------------");
System.out.println("返回集合中的映射个数:");
System.out.println("集合中映射个数为:"+map.size());
System.out.println("-------------------------------------");
System.out.println("获取所有的value值的操作:");
Collection<Integer> values=map.values();//将所有的值存入到Collection集合中
System.out.println(values);
System.out.println("-------------------------------------");
System.out.println("遍历方法1---keySet()");
//遍历思路:把HashMap中所有的key抽取出存放在Set集合中,遍历Set集合依次取出Key,就能依次取出对应的value
Set<String> keySet=map.keySet();//取出所有的key存放在keySet中
for (String a:keySet) {
Integer value=map.get(a);
System.out.println(a+"---"+value);
}
System.out.println("-------------------------------------");
System.out.println("遍历方法2--entrySet()");
//遍历思路:把HashMap中所有的映射关系(Entry)抽取出存放在Set集合中,
// 遍历Set集合依次取出映射关系(Entry),就能获取映射关系中的key和value
Set<Entry<String,Integer>> entrySet=map.entrySet();
for (Entry<String,Integer>a:entrySet
) {
String key=a.getKey();//获取每一个键
Integer value=a.getValue();//获取每一个值
System.out.println(key+"---"+value);
}
System.out.println("-------------------------------------");
System.out.println("-------------------------------------");
System.out.println("-------------------------------------");
}
}
(4)、Properties的使用
Properties的使用是非常简单的,主要用于在以后的信息系统开发的时候作为数据文件来传递值的时候来使用
首先,在src文件目录下创建 以.properties结尾的文件 里面写上 数据库的用户与用户密码
(5)、HashMap vs LinkedHashMap vs Hashtable vs ConcurrentHashMap作比较
特点:调用方法都是一样的,都继承与Map类
区别:
HashMap:存储键值对,无序,允许存null键,线程不安全
LinkedHashMap:存储键值对,有序,允许存null键,线程不安全
Hashtable:存储键值对,无序,不允许存null键,线程安全(直接在方法中上锁,效率低),已弃用
ConcurrentHashMap:存储键值对,无序,不允许存null键,线程安全(局部加锁,效率高)
package com.dream.concurrenthashmap_class;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class Test02 {
public static void main(String[] args) {
ConcurrentHashMap<Object, Object> map = new ConcurrentHashMap<>();
map.put(null, "xx");
Set<Entry<Object,Object>> entrySet = map.entrySet();
for (Entry<Object, Object> entry : entrySet) {
System.out.println(entry.getKey() + " -- " + entry.getValue());
}
}
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了常用的Map接口下的子类的使用方法,明天我们将进入到底层代码的学习,属于难度较大的内容模块