Map集合、HashMap、LinkedHashMap、Hashtable

1.Map

(1)概述

现实生活中,我们常会看到这样的一种集合: IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等
这种一对应的关系 ,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接
口。
public interface Map<K,v>

java. util.Map<k, v>集合
Map集合的特点:
1.Map集合是一个双列集合,一个元素包含两个值(一 个key, 一个value)
2.Map集合中的元素, key和value的数据类型可以相同,也可以不同
3. Map集合中的元素, key是不允许重复的, value是可以重复的
4.Map集合中的元素, key和value是一一对应

map与collection的区别
Collection中的集合,元素是孤立存在的(理解为单身) ,向集合中存储元素采用一个一个元素的方式存储。
Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
Collection中的集合称为单列集合,Map 中的集合称为双列集合。
需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
Map常用子类

HashMap<K,V> :存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、 不重
复,需要重写键的hashCode()方法、equals()方法。
LinkedHashMap<K,V> : HashMap下有个子类LinkedHashMap ,存储数据采用的哈希表结构+链表结构。
通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复 ,需要重写键的
hashCode()方法、equal)方法。

Map中常用方法

1.public v put(K key, v value) ;把指定的键与指定的值添加到Map集合中。

      存储键值对的时候, key不重复返回值v是null
      存储键值对的时候, key重复,会使用新的value替换map中重复的value,返回被替换的value值

      Map<String,String> map=new HashMap<>;

      map.put("杨过","小龙女");

      System.out.println(map);

      运行结果:{杨过=小龙女}

2.public V remove(object key) :把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。

      返回值;V
      key存在, v返回被删除的值。 key不存在, v返回null

      //创建Map集合对象
      Map<String, Integer> map = new HashMap<>();
      map. put( "赵丽颖”,168);
      map.put("杨颖",165);
      map. put(“林志玲”,178);
      System. out . println(map);          //{林志玲=178,赵丽颖=168, 杨颖=165}
      Integer v1 = map. remove( key: "林志玲");
      System.out . println("v1:" +v1);    //v1:178
      System. out . println(map);         //{赵丽颖-168,杨颖=165}|

3.public V get(Object key)根据指定的键,在Map集合中获取对应的值。

     key存在,返回对应的value,key不存在返回null     

      //创建Map集合对象
      Map<String, Integer> map = new HashMap<>();
      map. put(“赵丽颖",168);
      map.put("杨颖" ,165);
      map. put(“林志玲”,178);
      Integer v1 = map.get("杨颖");
      System.out . println("v1: "+v1);        //v1:165
      Integer v2 = map. get("迪丽热巴");
      System.out . println("v2: " +v2);       //v2:null

4.boolean containsKey(Object key)判断集合中是否包含指定的键。

      包含返回true,不包含返回false

      //创建Map集合对象
      Map<String, Integer> map = new HashMap<>( );
      map . put( "赵丽颖" ,168);
      map. put("杨颖" ,165);
      map. put(“林志玲" ,178);
      boolean b1 = map. containsKey( '赵丽颖");
      System. out. println("b1:”+b1);         //b1: true
      boolean b2 = map. containsKey( "张无忌");
      System. out . println( "b2:"+b2);       //b2:false

5.public Set<K> keySet() :获取Map集合中所有的键,存储到Set集合中。

      Map集合的第一种遍历方式 :通过键找值的方式
      Map集合中的方法:
      Set<K> keySet() 返回此映射中包含的键的Set视图。
      实现步骤:
      1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
      2.遍历set集合,获取Map集合中的每一个key
      3.通过Map集合中的方法get(key),通过key找到value

6.public Set<Map. Entry<K,V>> entrySet() :获取到Map集合中所有的键值对对象的集合(Set集合)。
我们已经知道,Map 中存放的是两种对象, 一种称为key(键) ,一种称为value(值) .它们在Map中是一对对应关
系,这一对对象又称做Map中的一一个Entry(项)。Entry 将键值对的对应关系封装成了对象。即键值对对象,这
样我们在遍历Map集合时,就可以从每一个键值对( Entry)对象中获取对应的键与对应的值。
既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:
public K getKey()]:获取Entry对象中的键。
public V getValue() :获取Entry对象中的值。
在Map集合中也提供了获取所有Entry对象的方法:
public Set<Map. Entry<K,V>> entrySet() :获取到Map集合中所有的键值对对象的集合(Set集合)。

Map集合的第二中遍历

Map集合遍历的第二种方式:使用Entry对象遍历
Map集合中的方法:
Set<Map. Entry<K, V>> entrySet() 返回此映射中包含的映射关系的Set视图。
实现步骤:
1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
2.遍历Set集合,获取每一个Entry对象
3.使用Entry对象中的方法getKey( )和getVolue()获取键与值

使用for each遍历

2.HashMap 

java. util . HashMap<k, v>集合implements Map<k, v>接口
HashMap集合的特点:
1.HashMap集合底层是哈希表:查询的速度特别的快
JDK1.8之前:数组+单向链表
JDK1. 8之后:数组+单向链表/红黑树(链表的长度超过8) :提高查询的速度
2. hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致

HashMap存储自定义类型(自定义类型作为value)

HashMap存储自定义类型(自定义类型作为key)

HashMap存储自定义类型键值
key:Person类型
Person类就必须重写hashCode方法和equals方法,以保证key唯一
value:String类型
可以重复

3.LinkedHashMap

java. util. inkedHashMap<k, v>集合extends HashMap<k, v>集合
LinkedHashMap的特点:
1.L inkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
2. L inkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的
底层原理:
哈希表+链表(记录元素的顺序)

key不允许重复,有序

4.Hashtable集合(被HashMap取代)

java. util. Hashtable<K, V>集合implements Mop<K, V>接口
Hashtable:底层也是- -个哈希表,是一个线程安全的集合,是单线程集合,速度慢
HashMop:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
HashMap集合(之前学的所有的集合):可以存储null值, null键
Hashtable集合,不能存储null值, null键
Hashtable和Vector集合一样在jdk1 .2版本之后被更先进的集合(HashMap, Arraylist)取代了
Hashtable的子类Properties依然活跃在历史舞台
Properties集合是一个唯一和I0流相结合的集合


 

猜你喜欢

转载自blog.csdn.net/weixin_51980491/article/details/112968825