码云: 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;

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

  1. 《码出高效 Java开发手册》第二章 面向对象

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding 第2章 面向对象 Object-Oriented Pro ...

  2. 《码出高效 Java开发手册》第一章计算机基础(未整理)

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding

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

    码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/concurrency/multithreading ...

  4. 《码出高效 Java开发手册》第五章 异常与日志

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

  5. 《码出高效 Java开发手册》第四章 走进JVM(未整理)

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding

  6. 《码出高效 Java开发手册》第三章 代码风格

    第3章 代码风格 3.1 命名 符合语言特性 体现代码元素特征: Abstract xxx. Basexxxx.xxException.xxxTest等; 包名统一使用小写, 完整单词+点分隔符; 枚 ...

  7. Java开发笔记(六十五)集合:HashSet和TreeSet

    对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...

  8. 阿里巴巴 Java 开发手册 1.4.0

    一.编程规约(一) 命名风格1. [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.反例: _name / __name / $name / name_ / name$ ...

  9. 码出高效,阿里巴巴JAVA开发手册1.4.0

    码出高效,阿里巴巴JAVA开发手册1.4.0阅读笔记 一.编程规约(三) 代码格式// 关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格 if (flag == 0) { ...

随机推荐

  1. python 实现获取电脑IP、主机名、Mac地址

    import socket import uuid # 获取主机名 hostname = socket.gethostname() #获取IP ip = socket.gethostbyname(ho ...

  2. JavaScript ES6 核心功能一览(转)

    原文地址:Overview of JavaScript ES6 features (a.k.a ECMAScript 6 and ES2015+) 原文作者:Adrian Mejia 译文出自:掘金翻 ...

  3. [bug]小米部分机型(5x、mix2)中,文字/背景闪现然后消失

    2/9更新 后来遇到float 元素也这样,改成flex布局就没问题.不知道具体原因. 描述: 使用vue 2.4开发HTML5时,遇到在小米部分机型(5x.mix2)中,文字/文字背景闪现然后消失. ...

  4. Redis初探,写个HelloWorld

    资源获取 https://redis.io/download 从官网上下载redis的源码,使用gcc的安装方式. 安装 make make install 需要达到的效果是,在/usr/local/ ...

  5. css style 标签可编辑

    一次偶然在鑫大技术博客上发现  style  标签配合contenteditable 可编辑属性 实现动态编辑css 这里我就回顾了下  contenteditable  可编辑属性 (这个属性并无浏 ...

  6. java API连接虚拟机上的hbase

    今天用本地的eclipse连接虚拟机上的hbase数据库,代码如下: public static void main(String[] args) throws Exception{ Configur ...

  7. 【洛谷P4934】 礼物,拓扑排序

    题目大意:给你$n$个不重复的数,其值域为$[0,2^k)$,问你至少需要将这$n$个数拆成多少个集合,使得它们互相不是对方的子集,并输出方案. 数据范围:$n≤10^6$,$k≤20$. $MD$我 ...

  8. 【NOIP2017】列队 splay

    当年太菜了啊,连$60$分的暴力都没拿满,只打了一个$30$分的. 考虑到这题最多只会询问到$30W$个点,且整个矩阵会去到$30W\times 30W$,显然不能将所有的点存下来. 对于每一行(除最 ...

  9. 面试题:js如何渲染十万条数据并不卡住界面

    这道题考察了如何在不卡住页面的情况下渲染数据,也就是说不能一次性将几万条都渲染出来,而应该一次渲染部分 DOM,那么就可以通过 requestAnimationFrame 来每 16 ms 刷新一次. ...

  10. java数据结构之(堆)栈

    (堆)栈概述栈是一种特殊的线性表,是操作受限的线性表栈的定义和特点•定义:限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈•特点:先进后出(FILO)或后进先出(L ...