Java中的集合框架-Map
前两篇《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的更多相关文章
- Java中的集合框架-Collections和Arrays
		
上一篇<Java中的集合框架-Map>把集合框架中的键值对容器Map中常用的知识记录了一下,本节记录一下集合框架的两个工具类Collections和Arrays 一,Collections ...
 - 菜鸟日记之 java中的集合框架
		
java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterat ...
 - Java中的集合框架(上)
		
Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的 ...
 - 第51节:Java当中的集合框架Map
		
简书作者:达叔小生 Java当中的集合框架Map 01 Map提供了三个集合视图: 键集 值集 键-值 映射集 public String getWeek(int num){ if(num<0 ...
 - Java当中的集合框架Map
		
简书作者:达叔小生 Java当中的集合框架Map 01 Map提供了三个集合视图: 键集 值集 键-值 映射集 public String getWeek(int num){ if(num<0 ...
 - Java中的集合框架-Collection(二)
		
上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...
 - Java中的集合框架
		
概念与作用 集合概念 现实生活中:很多事物凑在一起 数学中的集合:具有共同属性的事物的总体 java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象 在编程时,常常需要集中存放多 ...
 - Java中的集合框架(下)
		
学生选课--判断Set中课程是否存在 package com.imooc.collection; import java.util.ArrayList; import java.util.Arrays ...
 - JAVA 中的集合框架
		
java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中 一.集合与数组 数组:(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知 ...
 
随机推荐
- 20条最最常用的Linux命令讲解
			
玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...
 - Linux ssh开启服务
			
1.登陆linux系统,打开终端命令.输入 rpm -qa |grep ssh 查找当前系统是否已经安装 2.如果没有安装SSH软件包,可以通过yum 或rpm安装包进行安装 启动SSH服务2 安装 ...
 - Vue.js学习(常用指令)
			
Vue.js的指令是以v-开头,它们用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为,我们可以将指令看作特殊的HTML特性. 本文参考:htt ...
 - Angular入门教程一
			
1 前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,紧跟时代潮流,学习掌握新知识自然是不敢怠慢. AngularJS是google在维护,其在国外已经十分火热,可是国内的 ...
 - IhyerDB modBus采集器配置.
			
近期查了一下ihyerDB-modbus采集器的相关配置,由于没有相关的modbus设备,于是今天上午根据网上的线索下载了Modbus Slave(modbus从站仿真器).笔记本也没有串口,于是下载 ...
 - js解决千分符问题[收藏下]
			
//js数字千分符处理 function commafy(num) { num = num + ""; var re = /(-?\d+)(\d{3})/ while (re.te ...
 - C++学习笔记(8)----C++类的大小
			
C++类的大小 (i) 如下代码: #include<iostream> using namespace std; class CBase { }; class CDerive :publ ...
 - 注解@Slf4j
			
介绍 常见的Slf4j日志打印有两种方式,分别为传统方式和注解方式. 1.传统方式 示例: package com.example.demo.controller; import org.slf4j. ...
 - 更改 centos yum 源
			
1.进入存放源配置的文件夹 cd /etc/yum.repos.d 2.检查wget是否安装,没有安装先安装wget 3.备份默认源 mv ./CentOS-Base.repo ./CentOS- ...
 - 【SQL server 2012】复制数据库到另一台机器上
			
当需要将一台机器(源机器)上的一个数据库完全复制到另一台机器(目标机器)上时,可以选择先在源机器上备份该数据库,然后在目标机器上还原该备份的方法. 下面详细描述具体步骤: 1. 打开SQL serve ...