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

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

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

Map 接口的实现类有:

HashMap、TreeMap、HashTable、Properties等。

常用的方法:


方法


说明


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  运行效果图

HashTable

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


HashMapHashTable的区别

1) HashMap:  线程不安全,效率高. 允许key或value为null

2) HashTable:线程安全,效率低. 不允许key或value为null

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

时间: 2024-10-19 13:00:12

9.4-全栈Java笔记:Map接口和实现类的相关文章

9.5-全栈Java笔记:Map接口中的实现类HashMap

上节聊到「Map接口和实现类」,今天我们深入探讨其实现类中的HashMap如何进行底层实现. Hashmap基本结构讲解 哈希表的基本结构就是"数组+链表".我们打开HashMap源码,发现有如下两个核心内容: public class   HashMap<K,V> extends   AbstractMap<K,V> implements   Map<K,V>, Cloneable, Serializable { /** * The default

9.3-全栈Java笔记:List接口常用实现类的特点和底层实现

上节我们讲到「List接口的特点和常用方法」,本节接着上节的内容继续深入学习. 课前回顾:  List接口常用的实现类有3个:ArrayList.LinkedList.Vector. 那么它们的特点和底层实现有哪些呢? ArrayList特点和底层实现 ArrayList底层是用数组实现的存储. 特点:查询效率高,增删效率低,线程不安全.我们一般使用它. 查看源码,我们可以看出ArrayList底层使用Object数组来存储元素数据.所有的方法,都围绕这个核心的Object数组来开展. Arra

JAVA笔记7__接口应用/Object类/简单工厂模式/静态代理模式/适配器模式

/** * 接口应用 */ public class Main { public static void main(String[] args) { Person p = new Person("fish7"); p.setIsay(new BeforeGong()); p.say(); p.setIsay(new AfterGong()); p.say(); } } class Person{ //只有在运行期才和say行为关联起来,这就叫面向接口编程 private String

9.8-全栈Java笔记:Iterator(迭代器)接口

迭代器介绍 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象. Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作. Iterator接口定义了如下方法: boolean hasNext();  //判断是否有元素没有被遍历 Object next();      //返回游标当前位置的元素并将游标移动到下一个位置 void remove(); //删除游标左面的元素,在执行完next之后该操作只能执行一次 图1

5.5-全栈Java笔记:接口的定义和使用

接口interface 接口的作用 为什么需要接口?接口和抽象类的区别? 接口就是比"抽象类"还"抽象"的"抽象类",可以更加规范的对子类进行约束.全面地专业地实现了:规范和具体实现的分离. 抽象类还提供某些具体实现,接口不提供任何实现,接口中所有方法都是抽象方法.接口是完全面向规范的,规定了一批类具有的公共方法规范. 从接口的实现者角度看,接口定义了可以向外部提供的服务. 从接口的调用者角度看,接口定义了实现者能提供那些服务. 接口是两个模块之

10.2-全栈Java笔记:最全面的IO技术(二)

上节我们聊到「IO技术概念及入门」这节我们继续聊一下IO技术的分类. Java中流的概念细分 按流的方向分类: 输入流:数据流向是数据源到程序(InputStream.Reader结尾的流) 输出流:数据流向是程序到目的地(OutPutStream.Writer结尾的流) 按处理的数据单元: 字节流:按照字节读取数据(InputStream.OutputStream)命名上以stream结尾的流一般是字节流. 字符流:按照字符读取数据(Reader.Writer).命名上以Reader/Writ

10.1-全栈Java笔记:最全面的IO技术(一)

IO技术 对于任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能.程序运行需要数据,数据的获取往往需要跟外部系统进行通信,外部系统可能是文件.数据库.其他程序.网络.IO设备等等. 外部系统比较复杂多变,那么我们有必要通过某种手段进行抽象.屏蔽外部的差异,从而实现更加便捷的编程. 输入(Input)指的是:可以让程序从外部系统获得数据(核心含义是"读",读取外部数据).常见的应用: 1) 读取硬盘上的文件内容到程序.例如:播放器打开一个视频文件.word打

9.6-全栈Java笔记:二叉树和红黑二叉树

二叉树的定义 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要. 二叉树(BinaryTree)由一个结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成.下图中展现了五种不同基本形态的二叉树. (a) 为空树 (b) 为仅有一个结点的二叉树 (c) 是仅有左子树而右子树为空的二叉树 (d) 是仅有右子树而左子树为空的二叉树 (e) 是左.右子树均非

15.1-全栈Java笔记:Java事件模型是什么?事件控制的过程有哪几步??

应用前边两节上一章节的内容,大家可以完成一个简单的界面,但是没有任何的功能,界面完全是静态的,如果要实现具体功能的话,必须要学习事件模型. 事件模型简介及常见事件模型 对于采用了图形用户界面的程序来说,事件控制是非常重要的. 一个源(事件源)产生一个事件并把它(事件对象)送到一个或多个监听器那里,监听器只是简单地等待,直到它收到一个事件,一旦事件被接收,监听器将处理这些事件. 一个事件源必须注册监听器以便监听器可以接收关于一个特定事件的通知. 每种类型的事件都有其自己的注册方法,一般形式为: v