前两篇《Java中的集合框架-Commection(一)》《Java中的集合框架-Commection(二)》把集合框架中的Collection开发常用知识点作了一下记录,从本篇开始,对集合框架里的另外一部分Map作一下记录。

一,集合框架的Map接口

  Map与Collection不同之处在于它是以键值对来存储数据;

  Map比较常用的实现类有四个:HashTable,HashMap,LinkedHashMap,TreeMap;

  Map的方法也可以分为四类,增删改查,大致如下:

  新增的方法:

      put(k,v)  此方法将一对Key:Value形式的数据添加到容器中,并返回此Key所对应的旧值的结果(如果Key已存在的话),若此Key是一个新的Key则返回一个null

      put(Map)  此方法的作用是把一个Map中的元素复制到此Map中

  删除的方法:

      clear()  清除容器中的所有元素

      remove()  此方法移除一对Key:Value,返回的是被移除的键所对应的值

  修改的方法:

      put(k,v)  键相同,值不同便起到了修改的作用

  查询的方法:

      containsKey(key)  是否包含指定的Key,若包含则返回true

      containsValue(value)  是否包含指定的Value,若包含则返回true

      get(key)  返回指定的键所对应的值

      isEmpty()  查询Map是不是为空,若为空则返回true

      size()  返回Map中Key:Value的数量

      keySet()  返回Map中所有Key所组成的一个Set集合

      values()  返回Map中所有Value对应的Collection集合

      entrySet()  返回键值对所对应的Map.entry的Set集合

  其它的equals方法,hashcode方法便不再罗列。方法的使用还是到它的实现类中去演示,在此不作演示。

二,HashTable与HashMap

  HashTable是1.0出现的,后来它被HashSet所取代;

  HashTable内部结构是哈希表,它是线程安全的,另外HashTable不可存储null键以及null值;

  HashMap功能与HashTable基本相同,只是它非线程安全,另外它可存储null健以及null值;

  虽然HashMap内部是哈希表的结构,但是它真正的存储结构是数组+链表的形式,当一个元素被put进来的时候,它会先计算该元素的hashcode,当hashcode冲突的时候,它会使用链表进行挂载;

  当HashMap存储null键和null值的时候,它会存储到数组下标0的位置,若该位置有元素存在则进行挂载。

  HashMap在存储自定义对象的时候和HashSet一样(其实HashSet里面维护的就是一个HashMap),也会先调用该元素的hashcode方法,当hashcode相同是再去调用该元素的equals方法去判断两个元素是否为同一个元素,若是同一个元素则修改其原来的值为新值并返回原来的值;若元素的hashcode不同,则直接判断为不同的元素进行存储;演示如下:

 public class Person {
private String name;
private int age; public Person(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;
} }
  主程序:
     private static void fun_demo2() {
HashMap hm = new HashMap();
hm.put(new Person("张三", 32), "程序员");
hm.put(new Person("张三", 12), "项目经理");
hm.put(new Person("王五", 22), "老板");
System.out.println(hm);
}

  程序运行结果:

        

  可见三个元素都被存储进去了,这个原因很好理解,每new出来一个Person,它的hashcode是不一样的,所以存储了三个元素。下面我们改一下Person类,重写一下hashcode和equals方法

 public class Person {
private String name;
private int age; public Person(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;
} @Override
public int hashCode() {
return this.getName().hashCode();
} @Override
public boolean equals(Object obj) {
return true;
} }

  程序运行结果:

        

  可见我们把hashcode直接返回Person的name的hashcode,由于Person对象有两个叫张三的,所以它会调用equals方法再进一步比较这两个对象是否为同一个元素,我们的equals方法又返回了true,它就认定这两个元素是同一个元素,所以拿第二个“张三”的Value值“项目经理”把第一个“张三”的Value值“程序员”给覆盖掉了。

  其它的关于HashMap的方法不再一一演示。

三,LinkedHashMap

  LinkedHashMap与HashMap的区别是LinkedHashMap内部维护着一个所有元素的双向链表,它能保证存储进容器的元素与取出元素的顺序一致;请看以下操作:

     private static void fun_demo3() {
HashMap lhm = new HashMap();
lhm.put(2, "z");
lhm.put(3, "a");
lhm.put(1, "b");
lhm.put(0, "z");
lhm.put(null, "t");
Iterator iterator = lhm.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Entry) iterator.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}

  程序运行结果:

        

  它对元素的Key进行了自然顺序的排序,之所以null元素在0元素的后面,就是因为null元素会自动存储到数组0的位置,若0的位置有了元素便进行链式存储进行挂载;

  我们把上面的程序的第一行改为LinkedHashMap lhm=new LinkedHashMap();则程序运行结果如下:

        
  可见和我们存储元素的位置是一样的。

四,TreeMap

  TreeMap是基于二叉树的结构来存储数据的,它会按照键的自然顺序进行存储数据;

  当TreeMap存储自定义对象时,此对象需要实现Comparable接口并重写compareTo方法;

  也可接收一个Comparator比较器对象来实例化TreeMap;

  其操作方法与TreeSet相类似,便不再演示了(TreeSet内部便是TreeMap);

Java中的集合框架-Map的更多相关文章

  1. Java中的集合框架-Collections和Arrays

    上一篇<Java中的集合框架-Map>把集合框架中的键值对容器Map中常用的知识记录了一下,本节记录一下集合框架的两个工具类Collections和Arrays 一,Collections ...

  2. 菜鸟日记之 java中的集合框架

    java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterat ...

  3. Java中的集合框架(上)

    Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的 ...

  4. 第51节:Java当中的集合框架Map

    简书作者:达叔小生 Java当中的集合框架Map 01 Map提供了三个集合视图: 键集 值集 键-值 映射集 public String getWeek(int num){ if(num<0 ...

  5. Java当中的集合框架Map

    简书作者:达叔小生 Java当中的集合框架Map 01 Map提供了三个集合视图: 键集 值集 键-值 映射集 public String getWeek(int num){ if(num<0 ...

  6. Java中的集合框架-Collection(二)

    上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...

  7. Java中的集合框架

    概念与作用 集合概念 现实生活中:很多事物凑在一起 数学中的集合:具有共同属性的事物的总体 java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象 在编程时,常常需要集中存放多 ...

  8. Java中的集合框架(下)

    学生选课--判断Set中课程是否存在 package com.imooc.collection; import java.util.ArrayList; import java.util.Arrays ...

  9. JAVA 中的集合框架

    java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 一.集合与数组 数组:(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知 ...

随机推荐

  1. 修改Nginx 伪静态Rewrite规则 安装Chevereto

    Chevereto 是目前最为强大的 PHP 图床系统,通过它可部署多用户公开或私有的图片存储服务,现在 Chevereto 出了免费的版本,小伙伴可以围观一下. https://github.com ...

  2. 如何在FineReport中解析数据库内XML文件

    在数据库表中,其中字段XML所存的为xml格式数据在表xmltest中.那么在使用该表进行报表制作时,需要将存于xml字段中的值读取出来作为报表数据源. XML每条记录数据格式如下: <Fiel ...

  3. ubuntu下面解压tar.gz包报错:tar命令报错: gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error

    原因: 压缩包文件不完整(损坏或者其他原因) 比如今天下载的tomcat8,使用ubuntu的命令下载的 curl -O http://apache.mirrors.ionfish.org/tomca ...

  4. 三、python小功能记录——杀掉进程

    import os os.system("taskkill /F /IM python.exe")#旧版 os.system("taskkill /F /IM py.ex ...

  5. Windows环境下使用Nginx搭建负载均衡

    前言 最近没有什么事情,喜欢总结并学习东西!前几天写来一个Session共享,那么我们为什么需要Session共享?因为我们的应用程序分布在多个服务器上,为了合理分配用户的请求,就需要用到负载均衡技术 ...

  6. awk 截取某段时间的日志

    好久没有截取nginx/haproxy 中 的日志了,竟有点不熟悉了. 记录一下,以免以后忘记. NGINX 日志格式: 192.168.1.26 - - [14/Sep/2017:16:48:42 ...

  7. [EffectiveC++]item04:Make sure the objects are initialized before they're used

    28 页 C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前. 构造函数的一个较佳的写法是,使用所谓的member initialization list替换赋值动作. 29页 但请立下 ...

  8. XML序列化 System.Xml.Serialization

    一.定义元数据 XML序列化常用属性:XMLRoot,XMlType.XMLText.XMLEnum等 [Serializable] [XmlRoot] public class Product { ...

  9. vue笔记2

    vue项目目录 <pre> ├── build // 构建服务和webpack配置 ├── config // 项目不同环境的配置 ├── dist // 项目build目录 ├── in ...

  10. PhoneGap API 之事件处理

    一. deviceready 事件 1.在使用 PhoneGap 开发应用时,deviceready 事件是非常常用的.这一事件在设备的本地 环境和页面完全加载完成之后才触发 2.注意:此事件一般晚于 ...