集合框架Map接口

Map接口:

  1. 键值对存储一组对象
  2. key不能重复(唯一),value可以重复
  3. 常用具体实现类:HashMap、LinkedHashMap、TreeMap、Hashtable

HashMap

HashMap实现原理:

  1. 基于哈希表(数组+链表+二叉树(红黑树JDK1.8新增的))
  2. 默认负载因子为0.75,默认的数组大小为16
  3. 如何把对象存储到哈希表中?
    把key对象通过hash()方法计算hash值,然后用这个hash值对数组长度(默认16)取余,来决定key对象在数组中的存储位置,当这个位置有多个对象时,以链表长度大于8时,链表将转换为红黑色结构存储。这样做的目的是为了取值更快,而且存储的数据量越大,效果越明显。
  4. 扩充原理:当数组的容量超过了75%时,那么表示该数组需要扩充,如何扩充呢?
    扩充的算法是:当前数组容量<<1(相当于乘2),扩大一倍。扩充次数越多,会影响性能,每次扩充表示哈希表重新散列(重新计算每个对象的存储位置),在开发中尽量减少扩充次数带来的性能问题
  5. 线程不安全,适合单线程使用

代码示例:

private static void hashMap() {
Map<Integer, String> map = new HashMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three"); // map的遍历方式一(通过遍历Entry遍历键值)
Set<Entry<Integer, String>> entrySet = map.entrySet();
for (Entry<Integer, String> e : entrySet) {
System.out.println(e.getKey() + "->" + e.getValue());
} // map的遍历方式二(通过遍历键取值)
Set<Integer> keys = map.keySet();
for (Integer i : keys) {
String value = map.get(i);
System.out.println(i + "->" + value);
} // 只遍历值
Collection<String> values = map.values();
for (String v : values) {
System.out.println(v);
} // forEach遍历,(遍历键值)
map.forEach((key, value) -> System.out.println(key + "->" + value));
}

TreeMap

/**
* 基于二叉树的红黑树实现
*/
private static void treeMap() {
Map<Integer, String> map = new TreeMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three"); map.forEach((key, value) -> System.out.println(key + "->" + value));
}

LinkedHashMap

/**
* LinkedHashMap:具有可预知的迭代顺序。此实现与HashMap的不同之处在于,它维护着一个运行于所有条目的双重链接列表。
*/
private static void linkedHashMap() {
Map<Integer, String> map = new LinkedHashMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three"); map.forEach((key, value) -> System.out.println(key + "->" + value));
}

Hashtable

/**
* JDK1.0开始就有
* 基于哈希表实现(数组+链表)
* 默认数组大小为11,负载因子为0.75f
* 扩充方式:原数组<<1(乘2) + 1
* 线程安全,用在多线程访问时
*/
private static void hashtable() {
Map<Integer, String> table = new Hashtable<>();
table.put(1, "One");
table.put(2, "Two");
table.put(3, "Three"); table.forEach((key, value) -> System.out.println(key + "->" + value));
}

Java集合框架Map接口的更多相关文章

  1. Java集合框架——Map接口

    第三阶段 JAVA常见对象的学习 集合框架--Map集合 在实际需求中,我们常常会遇到这样的问题,在诸多的数据中,通过其编号来寻找某一些信息,从而进行查看或者修改,例如通过学号查询学生信息.今天我们所 ...

  2. JAVA集合框架 - Map接口

    Map 接口大致说明(jdk11): 整体介绍: 一个将键映射到值的(key-value)对象, 键值(key)不能重复, 每个键值只能影射一个对象(一一对应). 这个接口取代了Dictionary类 ...

  3. java集合框架——Map

    一.概述 1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  4. Java集合框架——Set接口

    第三阶段 JAVA常见对象的学习 集合框架--Set接口 List集合的特点是有序的,可重复的,是不是存在这一种无序,且能保证元素唯一的集合呢?(HashSet )这就涉及到我们今天所要讲的Set集合 ...

  5. Java集合框架——List接口

    第三阶段 JAVA常见对象的学习 集合框架--List接口 按照集合框架的继承体系,我们先从Collection中的List接口开始学习 (一) 概述及功能(ArrayList演示) (1) 概述 L ...

  6. Java集合框架之接口Collection源码分析

    本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法.在介绍Collection接口之前我们不得不先学习一下Iterable, ...

  7. Java集合——集合框架Map接口

    1.Map接口 public interface Map<K,V>将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.  2.HashMap.Hashtable.Tr ...

  8. Java集合框架顶层接口collectiion接口

    如何使用迭代器 通常情况下,你会希望遍历一个集合中的元素.例如,显示集合中的每个元素. 一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合 ...

  9. Java集合中Map接口的使用方法

    Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值 ...

随机推荐

  1. BZOJ 2286: [Sdoi2011]消耗战 虚树

    Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军 ...

  2. java logger的info记录在哪

    这个要看你的日志配置文件是怎么配置的,以log4j为例log4j.appender.mainLog=org.apache.log4j.ConsoleAppenderlog4j.appender.mai ...

  3. 在java中

    // 进入prompt回调 public class JSBridgeWebChromeClient extends WebChromeClient { @Override public boolea ...

  4. HDU 6024 Building Shops (简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6024 题意:有n个room在一条直线上,需要这这些room里面建造商店,如果第i个room建造,则要总 ...

  5. BZOJ 5170: Fable

    离散化+树状数组 求当前位之前是否有k位比它大 这样的话它就需要前移k位 剩下的按照原来的顺序依次填入 其实我觉得sort一下就可以做出来了 太久没写树状数组了 所以写了一下树状数组 #include ...

  6. isset、empty 误区

    isset()  常用来判定变量是否存在  但是当变量赋值为NUll时候,返回值一样是FALSE  而实际上变量是存在的,与实际情况不符,判定错误. empty() 用来判定变量或者类的属性值是否为等 ...

  7. Ehcache配置项及持久化到硬盘

    EhCache 常见的配置项: cache元素的属性 name:缓存名称 maxElementsInMemory:内存中最大缓存对象数 maxElementsOnDisk:硬盘中最大缓存对象数,若是0 ...

  8. 电脑可以识别sd卡手机无法识别 的解决方法。 我成功了。 淘宝买的sd卡 不用退货了。 退的人肝疼

    https://wenku.baidu.com/view/822e471055270722192ef736.html 电脑可以识别 sd 卡手机无法识别 * (本教程只是本人实际操作方法,可以解决一部 ...

  9. EF框架之——Code First以及踩过的这些“坑”

    传送门 Code First使用步骤 Code First报错和解决办法 以前在上海做了一段时间的Asp.net,基本用的都是.net自带的EF框架连接数据库,不过都是用的Model First,最近 ...

  10. mysql的命令入门

    mysql入门实践 学习教程 教程链接地址 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 文 ...