七、队列

排队,先进先出。

除并发应用外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. 云原生生态周报 Vol. 19 | Helm 推荐用户转向 V3

    作者| 禅鸣.忠源.天元.进超.元毅 业界要闻 Helm 官方推荐用户迁移到 V3 版本 Helm 官方发布博客,指导用户从 v2 迁移到 v3,这标志着官方开始正式推进 helm 从 v2 转向 v ...

  2. 史上最全面的SignalR系列教程-目录汇总

    1.引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习. 致正在奔跑的您! 2.SignalR介绍 SignalR实现服务器与客户端的实时通信 ,她是一个 ...

  3. 1.mssql和mysql sql如何调优?

    mssql是指微软的SQL Server数据库服务器. mssql常见的调优方法主要分为两类, (1)代码优化,代码优化,我搜集常用到的有以下几点: 1.避免使用select *  语句 2.避免关联 ...

  4. FreeSql (二十七)将已写好的 SQL 语句,与实体类映射进行二次查询

    有时候,我们希望将写好的 sql 语句,甚至是存储过程进行查询,虽然效率不高(有时候并不是效率至上). 巧用AsTable var sql = fsql.Select<UserX>() . ...

  5. 安卓APP开发简单实例 结对编程心得

    开始说起搞APP开发,自己和小伙伴的编程水平真的很低,无从下手,只有在网上找点案列,学习着怎样开发,结对编程还是面临着许多问题的,大家的水平有所差异和编程风格不同,我们用eclipse做了一个仿微信登 ...

  6. 关于CPU核心,线程,进程,并发,并行,及java线程之间的关系

    前言:作为一个转行java的小白,一直搞不清楚java中的多线程.于是来梳理一下关于CPU核心,线程,进程,并发,并行,及java线程之间的关系, 1.CPU角度来看: 我们以Intel的Core i ...

  7. Day 9 用户管理

    1.什么是用户? 能正常登陆系统的都算用户 windows系统和linux系统的用户有什么区别? 本质上没有区别, linux支持多个用户同一时刻登陆系统, 互相之间不影 响 而windows只允许同 ...

  8. nginx主配置参数详解

    ########Nginx的main(全局配置)文件 #指定nginx运行的用户及用户组,默认为nobody #user nobody; #开启的线程数,一般跟逻辑CPU核数一致 worker_pro ...

  9. 【POJ - 3723 】Conscription(最小生成树)

    Conscription Descriptions 需要征募女兵N人,男兵M人. 每招募一个人需要花费10000美元. 如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱. 给出若干男女之前的1 ...

  10. Win系统下使用命令链接MySQL数据库

    方法一: 1:打开[开始]>[运行]输入[cmd]单击[确定]后出现CMD命令黑色窗口,这就是我们说的CMD命令行 2:默认进入C盘,于是我们可以进入E盘,点击回车.因为我的数据库是存放在E盘的 ...