七、队列

排队,先进先出。

除并发应用外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. idea取消大小写自动提示

    file-settings 取消勾选Match case

  2. 大数据平台搭建 - cdh5.11.1 - oozie安装

    一.简介 oozie是hadoop平台开源的工作流调度引擎,用来管理hadoop作业,属于web应用程序,由oozie server 和oozie client构成. oozie server运行与t ...

  3. js 手机号码正则表达式

    var chenkPhone=/^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/var username=$ ...

  4. Linux 笔记 - 第六章 Linux 磁盘管理

    博客地址:http://www.moonxy.com 一.前言 1.1 硬盘 硬盘一般分为 IDE 硬盘.SCSI 硬盘和 SATA 硬盘.在 Linux 中,IDE 接口的设备被称为 hd,SCSI ...

  5. PTA A1009&A1010

    第五天 A1009 Product of Polynomials (25 分) 题目内容 This time, you are supposed to find A×B where A and B a ...

  6. C++基础之IO类

    下面是IO类的继承关系: ifstream和istringstream都继承自istream.因此,我们可以在传递istream对象的地方传递ifstream和istringstream. 例如:对i ...

  7. Loadrunner录制步骤及说明

    做好业务准备,如环境配置.服务启动等 打开Virtual User Generator界面---->New---->选择协议,录制网页时一般选择Web(HTTP/HTML) Start R ...

  8. demo演示如何写一个无配置格式统一的日志

    一.背景 大量项目在使用logback记日志,有部分项目使用日志混乱,格式不统一,多数人搞不懂配置文件,导致配置错误,现在需要开发一套统一的.少配置的日志组件,方便使用. 二.设计思路 尽量采用0配置 ...

  9. Java 世界的盘古和女娲 —— Zygote

    本文基于 Android 9.0 , 代码仓库地址 : android_9.0.0_r45 文中源码链接: Zygote.java ZygoteInit.java ZygoteServer.java ...

  10. win10下安装npm&cnpm步骤

    1.node官网下载安装包 2.分别输入node -v,npm -v检查是否完成 3.配置npm的全局模块的存放路径以及cache的路径,新建node_global和node_cache文件,以下是我 ...