《码出高效 Java开发手册》第六章 数据结构与集合

码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/collection/index.md

6.1 数据结构

1. 数据结构定义:

数据结构是指逻辑意义上的数据组织方式及其相应的处理方式;

1.1. 数据组织方式:

  • 树: 二叉树, 三叉树, B+ 树等;
  • 图: 有向图, 无向图;
  • 队列: 先进先出的线性结构;
  • 哈希: 根据某种算法直接定位的数据组织方式;

1.2. 数据处理方式:
在既定的数据组织方式上, 以某种特定的算法实现数据的增删改查和遍历.
不同数据处理方式存在巨大的性能差异;

2. 数据结构分类

  1. 线性结构: 0至1个直接前继和直接后继;

    包括顺序表、链表、栈、队列等,栈和队列是访问受限的结构;
    栈是 LIFO (Last-In, First-Out), 队列是FIFO (First-In, First-Out);

  2. 树结构: 0至1个直接前继和 0至n个直接后继(n大于或等于2);

    结构稳定均衡;

  3. 图结构: 0 至n 个直接前继和直接后继( n大于或等于2 );
  4. 哈希结构: 没有直接前继和直接后继;

    通过某种特定的哈希行数将索引与存储的值关联起来; 查找效率非常高;

  5. 数据结构复杂度: 空间复杂度, 时间复杂度; 算法时间复杂度是衡量计算性能的指标

6.2 集合框架

6.2.1 List集合

  • 线性数据结构; ArrayList和LinkedList;
  • ArrayList 容量可变, 非线程安全集合;扩容问题(内部使用数组进行存储,
    集合扩容时会创建更大的数组空间, 把原有的数据复制到新数组中);
    插入删除数据慢(因为过程中可能需要移动其他元素), 但是索引数据快;
  • LinkedList 是双向列表;相比ArrayList, 插入删除速度快, 随机访问速度慢;

6.2.2 Queue集合

队列是以中先进先出的数据结构; FIFO , 一端获取一端插入数据, 特殊线性表;

BlockingQueue (阻塞队列)

6.2.3 Map 集合

K-V键值对为存储元素实现的哈希结构; K 唯一,V 可重复;

keySet() 查看所有K, values() 查看所有V, entrySet() 查看所有K-V;

最早的Hashtable已经被淘汰(因性能瓶颈);

HashMap 线程不安全;

ConcurrentMap 线程安全(并发包);

TreeMap 是Key有序的Map集合

6.2.4 Set 集合

Set 不允许出现重复元素;

HashSet 从源码分析是使用HashMap事项, Value 固定为一个静态对象, Key 保证元素唯一, 不保证顺序;

TreeSet 由TreeMap实现; 树结构, 保证集合顺序;

LinkedHashSet 继承 HashSet; 内部使用链表维护元素插入顺序;

6.3 集合初始化

CollectionInitialization.Java

初始化通常进行内存分配、设置特定参数等工作;

ArrayList 默认为10个容量; 每次扩容调用Array.copyOf(), 创建新数组再复制;
创建对象就直接分配大小避免额外开销;

    /**
     * Default initial capacity.
     */
    private static final int DEFAULT_CAPACITY = 10;

HashMap 的 Capacity 决定了存储容量大小, 默认16; Load Factor 决定填充比例, 默认0.75;
基于这两个的乘积, HashMap 内部用threshold存储

    /* ---------------- Public operations -------------- */

    /**
     * Constructs an empty <tt>HashMap</tt> with the specified initial
     * capacity and load factor.
     *
     * @param  initialCapacity the initial capacity
     * @param  loadFactor      the load factor
     * @throws IllegalArgumentException if the initial capacity is negative
     *         or the load factor is nonpositive
     */
    public HashMap(int initialCapacity, float loadFactor) {
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }
    /**
     * The default initial capacity - MUST be a power of two.
     */
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

HashMap 容量不会在new的时候分配, 而是在第一次map后创建;

HashMap 容量大于2的幂;

6.4 数组与集合

数组是一种顺序表. 在Java体系中数组用于存储同一类型的对象; 一旦分配内存不可扩容;

NegativeArraySizeException;

对于动态大小的数组, 集合提供了 Vector (线程安全, 但性能较差, 已启用) 和 ArrayList (线程不安全);

数组遍历推荐jdk1.5引进的foreach方式; 也可使用jdk8 的lambda遍历;

针对数组对象操作的工具类: Arrays;

  • 数组转集合: Arrays.asList(); 适配器模式; 返回的是Arrays的内部类, 即修改(set)集合(list)元素, 原数组元素也随之改变
    , 但没有实现修改集合个数(add/remove/clear)的相关方法, 抛出UnsuppotedOperationException;
    public static <T> List<T> asList(T... a) {
        // 此处 ArrayList 为Arrays的一个内部类, 并非java.util.ArrayList
        return new ArrayList<>(a);
    }

避免修改问题:

List<Object> objectList = new java.util.ArrayList<Object>(Arrays.asList(数组));
  • 集合转数组: toArray(T[] array) ; 注意传入类型T一致 (数组长度小于集合长度问题)

6.5 集合与泛型

  • List / List
  • List<?> 通配符集合,赋值之后就不可以随便添加元素; 但是可以remove()和clear();
    一般作为参数来接收外部的集合, 或者返回一个不知道具体元素类型的集合.
  • List 只能放置一中类型, 如果随意转换类型, 会造成 "破窗理论"
  • List<? extends T>, 适合 Get First;
  • List<? super T> , 适合Put First;

原文地址:https://www.cnblogs.com/52liming/p/10686203.html

时间: 2024-08-02 15:46:09

《码出高效 Java开发手册》第六章 数据结构与集合的相关文章

《码出高效 Java开发手册》第七章 并发与多线程

码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/concurrency/multithreading/index.md 并发(Concurrency) 与并行(Parallelism) 以KTV唱歌为例, Parallelism 是指有多少人可以使用话筒同时唱歌, Concurrency是指同一个话筒被多少个人轮流使用; 一个科室两个专家同时出诊, 就是两个并行任务; 其中一个医生时而问诊, 时而

阿里巴巴 Java 开发手册 1.4.0

一.编程规约(一) 命名风格1. [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.反例: _name / __name / $name / name_ / name$ / name__2. [强制]代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式.说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义.注意,即使纯拼音命名方式也要避免采用.正例: alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同

阿里巴巴Java开发手册v1.2.0

最近阿里出了java开发手册v1.2.0版,看一下自己平时有哪些做不到的,特此记录一下(不太理解的标为红色) 此手册编写是为了提供代码质量,降低协同成本,提升沟通效率.对无规范的沟通深有感触. 编程规范 变量规范 1.类名在 PO(Persist Object) VO(Value Object) BO(Business Object) DO(Domain Object) DTO(Data Transfer Object) AO(Access Object)使要保持大写 2.抽象类名Abstrac

《码出高效:Java开发手册》杨冠宝 高海慧等著 高清pdf

<码出高效:Java开发手册> 引爆技术圈,全球瞩目的中国计算机民族图书,中国人自己原创的Java编程规范,希望未来社会发展的每一行代码都规范.合理.高效,马云.行癫.鲁肃亲笔推荐! 百度网盘链接: https://pan.baidu.com/s/1ZjJ0_xEC26w0k4mJgo4Grw 提取码: t4wv ? 内容简介  · · · · · · <码出高效:Java 开发手册>源于影响了全球250万名开发工程师的<阿里巴巴Java开发手册>,作者静心沉淀,对Ja

《阿里巴巴Java开发手册》码出高效详解(一)- 为什么要学习阿里编码手册

<Java 开发手册>(以下简称<手册>)是每个 Java 工程师人手必备的一本参考指南.该手册包括 编程规约.异常日志.单元测试.安全规约.MySQL 数据库.工程结构.设计规约 7 个部分 ,涵盖了 Java 开发的常见知识点.认真实践该<手册>能够帮助 Java 开发者养成好的编程习惯,帮助企业的开发团队在 Java 开发上更加高效.提高容错性.团队协作更好,并有助于提高代码的质量.降低项目维护的难度.然而很多人会遇到看过就忘,记住却不理解.不会用的困境. 另外在

阿里巴巴Java开发手册1.4.0

转自官网 前言 <阿里巴巴Java开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大开发者.现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量.比如:数据库的表结构和索引设计缺陷可能带来软件上的架构缺陷或性能风险:工程结构混乱导致后续维护艰难:没有鉴权的漏洞代码易被黑客攻击等等.所以本手册以Java开发者为中心视角,划分为编程规约.异常日志.单元测

读阿里巴巴Java开发手册v1.2.0之编程规约有感【架构篇】

 不为过去蹉跎,改变当下. 为什么开篇就送这么一句话给大家,我相信很多处于1-3年码龄的哥们儿们,在平时的编码历程中编码的个性可能是多彩的,每个人都有每个人特定的风格,但是我们现在这么随意写,以后这么随意写,好没问题,但是等你离开这个公司了或者是去开发别的项目了,再等别人过来接手维护你一手写出来的这段个性十足的代码时,那么你的右眼皮时不时地就会跳,因果我就不说了~~ 所以我建议看到这篇博文的朋友们,或许你稍微改变一下你的编码风格,遵从一套好的编码规约对己对人都是有好处的.可能朋友的公司也有专门的

阿里正式发布《Java开发手册》终极版!

摘要: 本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质量的美.而代码规约其实就是一个对美的定义. 本文讲的是阿里正式发布<Java开发手册>终极版!,别人都说我们是码农,但我们知道,自己是个艺术家.也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美.质量的美.而代码规约其实就是一个对美的定义. <阿里巴巴Java开发手

阿里巴巴java开发手册pdf

下载地址:网盘下载 编辑推荐 规范了Java开发准则与代码编写习惯 将直接影响Java从业者.求职者和在校相关专业大学生等逾百万的计算机相关人群 以阿里的技术底蕴,以一个独特的视角地成为影响到世界的经典计算机图书 对Java教育教学产生深远影响 对社会贡献及深远影响不可估量 内容提要 <阿里巴巴Java开发手册>的愿景是码出高效,码出质量.它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软件设计智慧,浓缩成为立体的编程规范和最佳实践.众所周知,现代软件行业的高速发展对开