1 Map

  • 将键映射到值的对象。Map不能包含重复的键; 每个键可以映射到最多一个值,一个值可以被多个键所映射
    构造方式:
public interface Map<K,V>

1.1.Map接口的基本使用

    • put(K Key,V value) 将指定的值与该映射中指定的键相关联(可选操作)
    • V get(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。
    • boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true
      boolean containsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true
    • Set<Map.Entry<K,V>> entrySet() 返回此地图中包含的映射的Set视图。
    • default V replace(K key, V value) 只有当目标映射到某个值时,才能替换指定键的条目。
    • int size() 返回此地图中键值映射的数量。
      Collection<V> values() 返回此地图中包含的值的Collection视图。

代码示例:

public class MapDemo1 {public static void main(String[] args) {//创建Map集合Map<String ,String > map = new HashMap<>();//存储键值对map.put("lanqiao001","张昌昌");//lanqiao001是键,张昌昌是是值map.put("lanqiao002","王国栋");map.put("lanqiao003","曲睿");//判断是否包含某一个键boolean b = map.containsKey("lanqiao001");//contains是包含的意思System.out.println(b);
//        获取map中键值对的个数System.out.println(map.size());
//        获取所有的键集Set<String> keySet =  map.keySet();System.out.println("--------------键集----------------");for(String str : keySet){System.out.println(str);}//获取所有的值集Collection<String> values =  map.values();System.out.println("---------------值集--------------");for(String str : values){System.out.println(str);}//输出集合中的元素System.out.println(map);}
}

1.2Map集合的遍历方式

遍历方式一:

 public static void main(String[] args) {//创建Map集合Map<String ,String > map = new HashMap<>();//存储键值对map.put("lanqiao001","张昌昌");map.put("lanqiao002","王国栋");map.put("lanqiao003","曲睿");//获取键集Set<String> keySet = map.keySet();for(String key :keySet){//根据键获取值String value = map.get(key);System.out.println(key+"---"+value);}}

运行结果

遍历方式二:

public static void main(String[] args) {//创建Map集合Map<String ,String > map = new HashMap<>();//存储键值对map.put("lanqiao001","张昌昌");map.put("lanqiao002","王国栋");map.put("lanqiao003","曲睿");//获取键值对集合Set<Map.Entry<String,String>> entrySet =  map.entrySet();for(Map.Entry<String,String> entry : entrySet){//entry代表一对键值对  分别获取键和值String key = entry.getKey();String value = entry.getValue();System.out.println(key +"---" + value);}}

运行结果

1.3 HashMap(非常常用)

HashMap是Map接口使用频率最高的实现类

​ 允许使用null键和null值 ,null只能有一个 与hashSet一样 不保证映射的顺序

​ 所有的key构成的集合是set集合 是无序 不可以重复 如果key是一个自定义对象 那么此时类必须重写hashcode和equals方法

​ 所有的value构成的集合是Coollection 无序的 是可以重复的

​ 一个key和一个value构成一个entry

​ 所有的entry构成的集合是Set 无序的 是不可重复的

HashMap中判断key是否唯一的标准和Hash判断元素是否唯一的方式是一样。

1.4 HashMap的存储结构

HashMap是基于Hash表实现的

​ jdk7及以前的版本:HashMap是数组 +链表的结构

​ jdk8及以后的版本 HashMap 数组 + 链表 + 红黑树实现的

HashMap中重要的常量:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 表示Map的默认容量是2的4次方 16/*** The maximum capacity, used if a higher value is implicitly specified* by either of the constructors with arguments.* MUST be a power of two <= 1<<30.*/
static final int MAXIMUM_CAPACITY = 1 << 30;//最大容量 2的30次方/*** The load factor used when none specified in constructor.*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;// 默认加载因子 0.75/*** The bin count threshold for using a tree rather than list for a* bin.  Bins are converted to trees when adding an element to a* bin with at least this many nodes. The value must be greater* than 2 and should be at least 8 to mesh with assumptions in* tree removal about conversion back to plain bins upon* shrinkage.*/
static final int TREEIFY_THRESHOLD = 8;//链表转换为红黑树的最大长度static final int UNTREEIFY_THRESHOLD = 6;// 红黑树的节点数<=6  则转化为链表

Map中的键和值 都可以是任意类型 可以使jdk提供的类型 也可以是自定义类型

public static void main(String[] args) {//创建Map集合Map<Student, String> map = new HashMap<>();Student stu1 = new Student("张三",18);Student stu2 = new Student("李四",21);Student stu3 = new Student("王五",20);Student stu4 = new Student("赵六",22);System.out.println(stu1.hashCode());//此处是为了验证stu的哈希码是否相同System.out.println(stu2.hashCode());//此处输出时一定要重写Student类System.out.println(stu3.hashCode());// 以学生对象作为key  使用String作为值map.put(stu1,"北京");map.put(stu2,"郑州");map.put(stu3,"天津");map.put(stu4,"南京");Set<Map.Entry<Student,String>> entrySet =   map.entrySet();Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();while(iter.hasNext()){Map.Entry<Student,String> entry =  iter.next();Student key = entry.getKey();String value = entry.getValue();System.out.println(key+"---"+value);}System.out.println("---------------------");Set<Student> keySet=  map.keySet();for(Student key : keySet){String value = map.get(key);System.out.println(key+"---"+value);}}

运行结果

使用自定义类作为键的时候 必须重写hashCode和Equeals方法

例子: ArrayList中 存储HahshMap 并遍历

public class MapDemo2 {public static void main(String[] args) {List<Map<String,String>> list = new ArrayList<>();//创建MapMap<String,String> map1 = new HashMap<>();map1.put("郭靖","黄蓉");map1.put("杨过","小龙女");list.add(map1);Map<String ,String> map2=new HashMap<>();map2.put("孙策","大乔");map2.put("周瑜","小乔");list.add(map2);for(Map<String,String>  map : list){Set<Map.Entry<String,String>> entrySet = map.entrySet();for(Map.Entry<String,String>  entry : entrySet){System.out.println(entry.getKey()+"----"+entry.getValue());}}}
}

运行结果

1.5 HashTable

HashMap类大致相当于Hashtable ,除了它是不同步的,并允许null

HashTable : 是同步的 不允许null

1.6 TreeMap

基于红黑树实现 可以实现对元素的自然排序和定制排序 次实现不是同步的

自然排序

public class Student implements Comparable<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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic int compareTo(Student stu) {//比较规则: 按照年龄排序  年龄相同则按照姓名排序int ageRes =  this.getAge() - stu.getAge();int nameRes = this.getName().compareTo(stu.getName());return ageRes == 0 ?nameRes:ageRes;}
}
public static void main(String[] args) {Student stu1 = new Student("张三",23);Student stu2 = new Student("李四",20);Student stu3 = new Student("王五",18);Student stu4 = new Student("赵六",22);Map<Student,String>  map = new TreeMap<>();map.put(stu1,"北京");map.put(stu2,"郑州");map.put(stu3,"天津");map.put(stu4,"南京");Set<Student> keySet=  map.keySet();for(Student key : keySet){String value = map.get(key);System.out.println(key+"---"+value);}}

对于存入TreeMap中的键 如果是自定义类型 则必须实现Comparable并实现compareTo方法

定制排序

public class MapDemo3 {public static void main(String[] args) {Student stu1 = new Student("张三",23);Student stu2 = new Student("李四",20);Student stu3 = new Student("王五",18);Student stu4 = new Student("赵六",22);Map<Student,String>  map = new TreeMap<>(new Comparator<Student>() {@Overridepublic int compare(Student stu1, Student stu2) {//比较规则: 按照年龄排序  年龄相同则按照姓名排序int ageRes =  stu1.getAge() - stu2.getAge();int nameRes = stu1.getName().compareTo(stu2.getName());return ageRes == 0 ?nameRes:ageRes;}});map.put(stu1,"北京");map.put(stu2,"郑州");map.put(stu3,"天津");map.put(stu4,"南京");Set<Student> keySet=  map.keySet();for(Student key : keySet){String value = map.get(key);System.out.println(key+"---"+value);}}
}

需要在创建TreeMap对象的时候 传入一个比较器对象

java Map的知识点相关推荐

  1. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  2. Java map 知识

    Java map: Map 接口中键和值一一映射. 可以通过键来获取值 map 的方法如下: 序号 方法描述 1 void clear( )  从此映射中移除所有映射关系(可选操作). 2 boole ...

  3. 高级 Java 面试通关知识点整理

    转载自 高级 Java 面试通关知识点整理 1.常用设计模式 单例模式:懒汉式.饿汉式.双重校验锁.静态加载,内部类加载.枚举类加载.保证一个类仅有一个实例,并提供一个访问它的全局访问点. 代理模式: ...

  4. 这些Java基础面试知识点,你都掌握了吗?

    想了解一下学Java的小伙伴们,在学习Java的时候有没有去总结知识点,哪些知识点我们没有掌握,哪些知识点是我们还没有掌握的,今天小编来发掘一些Java基础面试知识点,不知道大家掌握没有. 小编分享的 ...

  5. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  6. 进大厂一条龙服务(Java核心面试知识点+一线大厂Java笔试面试题+月薪3万Java优秀简历模板),看这篇就够了

    你有没有觉得Java_工程师竞争压力大.就业困难?不知道面试Java工程师应该准备些什么?.. 现在一切都解决了!你想要的干货知识和面试题统统在这,还有月薪3万Java优秀简历模板,快拿回去嚼烂吧! ...

  7. 华清远见—重庆中心——JAVA高级阶段知识点梳理

    华清远见-重庆中心--JAVA高级阶段知识点梳理 String字符串 String是一个类,属于数据类型中的引用类型.Java中所有使用""引起来的内容都是属于这个类的实例,称为字 ...

  8. JAVA开发工程师知识点总结【数组集合篇】

    JAVA开发工程师知识点总结 前言:本文撰写目的是为了给广大网友总结一份尽力涵盖所有常用的java知识点,用于笔试或面试,同时也是自己学习过程的一个记录,希望各位网友能够广开言路,各位大牛能够多给给指 ...

  9. (小白学JAVA之)Java高级特性知识点梳理

    Java高级特性知识点梳理 集合框架和泛型 List接口 ArrayList ArrayList类的常用方法 具体实现步骤 LinkedList LinkedList类的常用方法 具体实现步骤 Set ...

最新文章

  1. pandas高级处理-交叉表与透视表
  2. c#冒泡、快速、选择和插入排序算法的项目应用
  3. 物料变式的订货型生产(3.0C:可库存的类型)(26)
  4. javascript --- [虚拟DOM] 初始化 实现
  5. 状态机设计模式_设计模式-代理/状态机模式
  6. PDE双曲型方程数值解形式及例题分析
  7. U盘安装CentOS Linux图文详解
  8. c语言程序申请管理员权限,vc 软件 要管理员运行 vc 管理员权限运行
  9. python—004
  10. End-to-End Object Detection with Transformers的部分解读
  11. oracle12c开发连接jar包ojdbc7
  12. 网页制作全套视频教程下载(包括html,ASP,Flash,Photoshop)
  13. 2016最新精彩而又幽默的搞笑段子精选
  14. Win10使用系统自带命令diskpart格式化U盘
  15. win11重启键在哪 windows11关机重启的设置方法
  16. 【ReID】Harmonious Attention Network for Person Re-Identification
  17. Linux可加载内核模块(LKM)(转载)
  18. gin阶段学习(入门)
  19. 10 个最好的免费开源网店系统
  20. 用好CRM,它能通过这6种步为企业开源节流

热门文章

  1. SqlServer数据库常用sql语句
  2. Python:pandas.DataFrame.describe(df.describe(include='all'))
  3. 幼儿机器人编程课程介绍
  4. oracle 日志 aw,DBMS_AW_EXP: not AW$
  5. mysql求2个日期之间的工作日数(周一到周五)
  6. C ++程序将给定的英寸转换为等效的码,英尺和英寸
  7. 【安全资讯】个人信息保护新规将出台 消费者被短信轰炸将成为历史
  8. 海康 综合安防管理平台 对接
  9. (三)UPF之Domain Coverage Relationship(Cover、Equivalent、Independent)
  10. 如何实现css垂直居中