七、队列

排队,先进先出。

除并发应用外Queue只有两个实现:LinkedList,PriorityQueue。他们的差异在于排序而非性能。

一些常用方法:

 继承自Collection的方法:

  add 在尾部增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常

  remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常

  element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常

 自带的方法:这些更适用于缓冲和并发访问,最主要是不报异常啊

  offer 在尾部添加一个元素并返回true 如果队列已满,则返回false

  poll 移除并返问队列头部的元素 如果队列为空,则返回null

  peek 返回队列头部的元素 如果队列为空,则返回null

  put 添加一个元素 如果队列满,则阻塞

  take 移除并返回队列头部的元素 如果队列为空,则阻塞

八、理解Map

标准的Java类库包含以几种基本实现:

HashMap,TreeMap,LinkedHashMap,WeakHashMap,ConcurrentHashMap,IdentityHahMap.

1.性能

普通的Map中get()方法呈线性搜索,执行速度相当慢,而hashMap使用了特殊的:散列码来取代对键缓慢的搜索。

散列码:“相对唯一”的,用以代表对象的int值。hashCode()是根类Object中的方法,所以所有Java对象都有散列码,HashMap就是使用对象的hashCode()进行快速查询的。

HashMap *:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量和负载因子以调节容器的性能。最常用的Map。

LinkedHashMap:使用链表维护内部顺序,所以迭代访问快。get访问要慢一点点。

TreeMap:基于红黑树实现的。键会由Comparable或Comparator进行排序,是唯一带有subMap()方法的Map;

  

WeakHashMap:弱键(weak key)映射,允许释放映射所指向的对象;如果映射之外没有引用指向某个"键",则此”键“可以被垃圾回收

ConcurrentHashMap:一种线程安全的Map.详见 Java编程思想——第21章 并发 读书笔记系列

IdentityHashMap:使用== 代替 equals()对键进行比较的散列映射。

对Map的键要求于Set中的元素要求一样,任何键都要由一个equals()方法;如果是散列Map,键要实现hashCode()方法;如果是TreeMap,必须实现Comparable。

2.SortedMap

 TreeMap是现在的唯一实现,确保键处于排序状态,以下是由SortedMap提供的方法:

    //返回当前Map使用的Comparator
    public Comparator<? super K> comparator() {
        return comparator;
    }
    //返回Map的第一个Key
    public K firstKey() {
        return key(getFirstEntry());
    }
    //返回Map的最后一个Key
    public K lastKey() {
        return key(getLastEntry());
    }
    //生成Map子集 由fromKey(包含) 到 toKey(不包含)的键值组成
    public SortedMap<K,V> subMap(K fromKey, K toKey) {
        return subMap(fromKey, true, toKey, false);
    }
    //生成Map子集 由键小于toKey的键值组成
    public SortedMap<K,V> headMap(K toKey) {
        return headMap(toKey, false);
    }
   //生成Map子集 由键大于或等于fromKey的键值组成
    public SortedMap<K,V> tailMap(K fromKey) {
        return tailMap(fromKey, true);
    }

3.LinkedHashMap

  为了提高速度LindedHashMap散列化所有的元素,但是遍历键值对时又以元素的插入顺序返回键值对。

  *可以在构造函数中设定LinkedHashMap,使之采用基于访问的最近最少使用(LRU)算法。

// 初始化大小,加权因子,true开启LRU算法 false插入顺序public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {
        super(initialCapacity, loadFactor);
        this.accessOrder = accessOrder;
    }
 

Java编程思想——第17章 容器深入研究 读书笔记(三)的更多相关文章

  1. Java编程思想——第17章 容器深入研究 读书笔记(二)

    五.List的功能方法 排除Collection已包含的方法外还增加了 boolean addAll(int index, Collection<? extends E> c);从索引位置 ...

  2. Java编程思想——第17章 容器深入研究 读书笔记(一)

    这一章将学习散列机制是如何工作的,以及在使用散列容器时怎么样编写hashCode()和equals()方法. 一.容器分类 先上两张图 来概况完整的容器分类 再细说都为什么会有那些特性. 二.填充容器 ...

  3. Java编程思想——第17章 容器深入研究 读书笔记(四)

    九.散列与散列码 HashMap使用equals()判断当前的键是否与表中存在的键相同. 正确的equals()方法需满足一下条件: 1)自反性.x.equals(x) 是true; 2)对称性.x. ...

  4. Java编程思想——第17章 容器深入研究(two)

    六.队列 排队,先进先出.除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: add ...

  5. Java编程思想——第17章 容器深入研究(一)

    这一章将学习散列机制是如何工作的,以及在使用散列容器时怎么样编写hashCode()和equals()方法. 一.容器分类 先上两张图 来概况完整的容器分类 再细说都为什么会有那些特性. 二.Coll ...

  6. Java编程思想(11~17)

    [注:此博客旨在从<Java编程思想>这本书的目录结构上来检验自己的Java基础知识,只为笔记之用] 第十一章 持有对象 11.1 泛型和类型安全的容器>eg: List<St ...

  7. Java编程思想 第21章 并发

    这是在2013年的笔记整理.现在重新拿出来,放在网上,重新总结下. 两种基本的线程实现方式 以及中断 package thread; /** * * @author zjf * @create_tim ...

  8. Java编程思想——第14章 类型信息(一)

    运行时类型信息使得你可以在程序运行时发现和使用类型信息.Java是如何让我们在运行时识别对象和类的信息得呢? 主要有两种方式:1.传统RTTI,他假定我们在编译期间已经知道了所有类型:2.反射,它允许 ...

  9. Java编程思想(第一章 对象入门)总结

    面向对象编程(oop) 1.1抽象的进步 所有编程语言的最终目的都是提供一种“抽象”方法.   难点是 在机器模型(位于“方案空间”)和实际解决问题模型(位于“问题空间”)之间,程序员必须建立起一种联 ...

随机推荐

  1. 20182324 实验一《Linux基础与Java开发环境》实验报告

    20182324 2019-2020-1 <数据结构与面向对象程序设计>实验1报告 课程:<程序设计与数据结构> 班级: 1823 姓名: 殷宇豪 学号: 20182324 实 ...

  2. 粗糙版ORM(附详细注释)

    目录 ORM 其他 ORM代码 数据库表代码 mysql代码 db/models.py db/pymysql_opreator.py ORM 作为数据库表记录 和 python中对象的映射关系中间件 ...

  3. 使用ECMAScript 6 模块封装代码

    JavaScript 用"共享一切"的方法加载代码,这是该语言中最容易出错且最容易让人感到困惑的地方.其他语言使用诸如包这样的概念来定义代码作用域,但在 ECMAScript 6 ...

  4. springboot数据库主从方案

    本篇分享数据库主从方案,案例采用springboot+mysql+mybatis演示:要想在代码中做主从选择,通常需要明白什么时候切换数据源,怎么切换数据源,下面以代码示例来做阐述: 搭建测试环境(1 ...

  5. SpannableString设置文本背景色

    参考内容: http://blog.csdn.net/harvic880925/article/details/38984705 http://blog.it985.com/14433.html 1. ...

  6. Imageio: 'ffmpeg-win32-v3.2.4.exe' was not found on your computer; downloading it now.

    场景 在使用pip下载了Imageio之后,需要下载ffmpeag-win-32-v3.2.4.exe文件,一种是在代码的 开头部分加入: imageio.plugins.ffmpeg.downloa ...

  7. thymeleaf+layui加载页面渲染时TemplateProcessingException: Could not parse as expression

    Caused by: org.attoparser.ParseException: Could not parse as expression: " {type: 'numbers'}, { ...

  8. JS 防抖和节流

    防抖和节流 在处理高频事件,类似于window的resize或者scorll,或者input输入校验等操作时.如果直接执行事件处理器,会增大浏览器的负担,严重的直接卡死,用户体验非常不好. 面对这种情 ...

  9. PTA A1005&A1006

    第三天 A1005 Spell It Right (20 分) 题目内容 Given a non-negative integer N, your task is to compute the sum ...

  10. Mybatis源码解析,一步一步从浅入深(三):实例化xml配置解析器(XMLConfigBuilder)

    在上一篇文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码 ,中我们看到 代码:XMLConfigBuilder parser = new XMLConfigBuilder(read ...