9.4-全栈Java笔记:Map接口和实现类

现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微信账户。这就是一种成对存储的关系。

Map就是用来存储“键(key)-值(value) 对”。  Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。 

Map 接口的实现类有:

HashMapTreeMapHashTableProperties等。 

常用的方法:

方法

说明

Object   put(Object key, Object value)

存放键值对

Object   get(Object key)

通过键对象查找得到值对象

Object   remove(Object key)

删除键对象对应的键值对

boolean   containsKey(Object key)

Map容器中是否包含键对象对应的键值对

boolean   containsValue(Object value)

Map容器中是否包含值对象对应的键值对

int   size()

包含键值对的数量

boolean   isEmpty()

Map是否为空

void   putAll(Map t)

t的所有键值对存放到本map对象

void   clear()

清空本map对象所有键值对

HashMap

HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。

【示例1Map接口中常用方法的使用

public class   Test {

    public static void   main(String[] args) {

       Map<Integer,String> m1 = new   HashMap<Integer,String>();

       Map<Integer,String> m2 = new   HashMap<Integer,String>();

       m1.put(1, "one");

       m1.put(2, "two");

       m1.put(3, "three");

 

       m2.put(1,"");

       m2.put(2,"");

      

       System.out.println(m1.size());

       System.out.println(m1.containsKey(1));

       System.out.println(m2.containsValue("two"));

      

       m1.put(3, "third");      //键重复了,则会替换旧的键值对

      

       Map<Integer,String> m3 = new   HashMap<Integer,String>();

       m3.putAll(m1);

       m3.putAll(m2);

       System.out.println("m1:"+m1);

       System.out.println("m2:"+m2);

       System.out.println("m3:"+m3);

    }

}

 

示例1  运行效果图

9.4-全栈Java笔记:Map接口和实现类

HashTable

HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了Synchronized关键字确保线程同步检查,效率较低。

HashMapHashTable的区别

1) HashMap:  线程不安全,效率高允许keyvaluenull

2) HashTable:线程安全,效率低不允许keyvaluenull

HashMap底层实现

HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。对于我们以后理解很多技术都非常有帮助(比如:redis数据库的核心技术和HashMap一样),因此,非常有必要让大家理解。

 

数据结构中有数组和链表来实现对数据的存储,他们各有特点。

数组:占用空间连续。 寻址容易,查询速度快。但是,增加和删除效率非常低。

链表:占用空间不连续。 寻址困难,查询速度慢。但是,增加和删除效率非常高。

 

那么,我们能不能结合数组+链表,可以结合双方优点(即查询快,增删效率也高)的结构呢? 答案就是“哈希表”。 哈希表的本质就是数组+链表

老鸟建议

对于本章中频繁出现的“底层实现”讲解,建议学有余力的童鞋将他搞通。刚入门的童鞋如果觉得有难度,可以暂时跳过。入门期间,掌握如何使用即可,底层原理是扎实内功,便于大家应对一些大型企业的笔试面试。

下节,我们继续深入讨论「HashMap底层实现



「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。


  笔记包含从浅入深的六大部分:

  A-Java入门阶段

  B-数据库从入门到精通

  C-手刃移动前端和Web前端

  D-J2EE从了解到实战

  E-Java高级框架精解

  F-Linux和Hadoop