在生活中有些数据是以映射关系存在的,也就是成对出现的,比如:老公  老婆(key-->value)

双列集合:
-------------------| Map    如果是实现了Map接口的集合类,集合类具备的特点是:存储的数据是以键值对存在的,键不可重复,值可重复
-------------| HashMap    底层是基于哈希表实现的
HashMap的实现原理:
    往HashMap添加元素的时候,HashMap会自动先调用元素的hashCode方法得到元素的哈希表,
    然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置
    
    情况一:如果算出元素的存储位置目前还没有元素,那么该元素可以直接存储到该位置
    
    情况二:如果算出元素的存储位置已经存在其他元素,那么会自动调用equals方法再进行比较一次
    如果equals返回ture那么就视为重复元素,不可添加,如果返回false,那么就可以添加

-------------| TreeMap    底层是基于红黑树实现的(二叉数),特点:会跟元素排序(key值,而不是value值排序)
TreeMap注意事项:
    1.TreeMap在添加元素的时候,如果数据有自然排序规则,那么就按照元素的自然顺序的特性进行排序存储
    2.TreeMap在添加元素的时候,如果数据不具备自然排序规则,那么该元素所属类必须实现Comparable接口,把元素的比较规则写在compareTo方法上
    3.TreeMap在添加元素的时候,如果元素本身不具备自然数据特性,而元素也没有实现Comparable接口,那么必须要在创建ThreeSet的时候传入一个比较器
    4.如果比较元素的时候调用compareTo返回的是0,那么该元素就被视为重复元素,不可添加(注意:跟hashcode和equals无关)

-------------| Hashtable(了解) 底层也是维护了一个哈希表,不过它的线程安全,但效率低

Map<K,V>的常用方法:

添加:
        put(K key, V value)     
            添加的时候,如果不存在添加的key值,那么添加成功后返回null
            如果存在添加的key值,那么会替换原先的value值,并返回原来的value
            
         putAll(Map<? extends K,? extends V> m)  
             把另一个集合的数据添加到指定的集合中,如果两个集合中存在相同的key值,
             那么会跟put方法一样,但是没有返回值
     
     删除:
         clear()         清空集合
         remove(Object key)   根据键删除数据,并返回此key所对应的value(因为键值不允许重复)
     
     判断:
         containsKey(Object key)   根据key判断集合中是否存在指定的键值对
        containsValue(Object value)  根据value判断集合中是否存在指定的键值对
        isEmpty()            判断集合是否为空
        
    获取:
        get(Object key)  根据键获取对应的值
        size()      判断集合中键值对的大小

迭代:
        values()   返回此映射中包含的值的 Collection 视图
        keySet()   返回此映射中包含的键的 Set 视图
        entrySet()  返回此映射中包含的映射关系的 Set 视图。

下面是一些方法的实例

put(K key, V value)

添加的时候,如果不存在添加的key值,那么添加成功后返回null
如果存在添加的key值,那么会替换原先的value值,并返回原来的value

public static void main(String[] args) {

        Map<String, String> map = new HashMap<String, String>();
String old = map.put("老公", "老婆");
System.out.println(old);
System.out.println(map);
//修改后
String news = map.put("老公", "小三");
System.out.println(news);
System.out.println(map);
}

putAll(Map<? extends K,? extends V> m)  
把另一个集合的数据添加到指定的集合中,如果两个集合中存在相同的key值,
那么会跟put方法一样,但是没有返回值

public class Demo6 {
public static void main(String[] args) { Map<String, String> map1 = new HashMap<String, String>();
String old = map1.put("老公", "小三"); Map<String, String> map2 = new HashMap<String, String>();
String news = map2.put("老公", "老婆");
System.out.println("添加前:"+map2);
//把map1添加到map2中
map2.putAll(map1);
System.out.println("添加后:"+map2);
}
}

56. Map(双列集合)的更多相关文章

  1. Map(双列集合)

    出现的原因:现实生活中有些数据成对存在. 特点:键不可重复,值可以重复. ----------|Map                数据都是以键值对的形式存在,键唯一,值可重复. --------- ...

  2. (10)集合之双列集合Map,HashMap,TreeMap

    Map中的元素是两个对象,一个对象作为键,一个对象作为值.键不可以重复,但是值可以重复. 看顶层共性方法找子类特有对象. Map与Collection在集合框架中属并列存在 Map存储的是键值对 Ma ...

  3. 双列集合Map

    1.双列集合Map,就是存储key-value的键值对. 2.hashMap中键必须唯一,值可以不唯一. 3.主要方法:put添加数据    getKey---通过key获取数据    keySet- ...

  4. Map集合——双列集合

    双列集合<k, v> Map: Map 和 HashMap是无序的: LinkedHashMap是有序的: HashMap & LinkedHashMap: put方法: 其中,可 ...

  5. 双列集合Map的嵌套遍历

    双列集合Map的嵌套使用,例如HashMap中还有一个HashMap,这样的集合遍历起来稍微有点儿复杂.例如一个集合:HashMap<Integer,HashMap<String,Inte ...

  6. Map集合(双列集合)

    Map集合(双列集合)Map集合是键值对集合. 它的元素是由两个值组成的,元素的格式是:key=value. Map集合形式:{key1=value1 , key2=value2 , key3=val ...

  7. Java之Map接口(双列集合)

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

  8. Day 9:双列集合Map及实现该接口的类的常用方法

    为什么要学双列集合? 因为单列集合无法处理映射关系,会有成对出现的数据 Map接口  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复 Map接 ...

  9. Java中的集合(七)双列集合顶层接口------Map接口架构

    Java中的集合(七)双列集合顶层接口------Map接口 一.Map接口的简介 通过List接口,我们知道List接口下的集合是单列集合,数据存储是单列的结构.Map接口下是一个键值对(key-v ...

随机推荐

  1. java基础之轻松搞定反射

    前言 java的名词太古怪.反射白话文解释,就是把一个字符串的类名,实例化,少了个new单词. 反射步骤 准备一个苹果类像这个样子. public class PingGuo { private St ...

  2. C++ 之获取map元素[转]

    链接:https://www.cnblogs.com/jianfeifeng/p/11089799.html 对于map对象, count成员返回值只能是0或者1,map容器只允许一个键对应一个实例. ...

  3. 最近开发的项目,遇到用户上传excel文件并导入数据到系统这个需求,而有excel中有的单元格是日期格式,本文介绍怎么从excel中读取日期格式的数据。

    可以先判断单元格的类型,有的日期是字符串存储的,有的是按日期存储的(单元格按数字解析),代码如下: Cell cell = row.getCell(); Date date = null; if (c ...

  4. JS的加载和执行

    从JS的加载和执行谈性能优化 ---高性能JS读后感(第一章) 从脚本的"霸道"说起,随着浏览器的进步,js越来越听话了,所以,我们先说说以前的浏览器是怎么加载js的,以及js如何 ...

  5. boost库:多线程

    1.线程管理 最重要的一个类是boost::thread,是在boost/thread.hpp里定义的,用来创建一个新线程. #include <boost/thread.hpp> #in ...

  6. 每天一个Linux命令:rmdir(6)

    rmdir rmdir命令用来删除空目录.当目录不再被使用时,或者磁盘空间已到达使用限定值,就需要删除失去使用价值的目录.利用rmdir命令可以从一个目录中删除一个或多个空的子目录.删除目录时,必须具 ...

  7. IP地址的定义和划分

    IP地址分类:                IP地址根据首首字节开始位可以分为5大类:             分类        首字节开始位         首字节数字范围           ...

  8. Echarts mc地图

    Echarts mc地图 echarts官网实例: https://gallery.echartsjs.com/editor.html?c=xSNlA5O-zl 效果: 代码: <html> ...

  9. (转)将SVN从一台服务器迁移到另一台服务器(Windows Server VisualSVN Server)

    转:http://blog.sina.com.cn/s/blog_855a24030102xp9q.html 服务器环境: Windows Server 2012  软件版本: VisualSVN-S ...

  10. centos 安装 Lamp(Linux + Apache + PHP) 并安装 phpmyadmin

    来源:http://www.laozhe.net/302.html 一般情况下,安装的都是最新的正式版,除非你有特殊需求,要安装指定的版本,本文暂不讨论.从最基础的开始,一点点完成一个可用的 Linu ...