码云: 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. string的函数的学习

    1.string类型的构造函数和对象的定义 string s3 : 把string s2 拷贝的 s3 string s4 : 把数组首地址或者字符串首地址strArr 从0开始截取到第n个字母 st ...

  2. php批量导出pdf文件的脚本(html-PDf)

    背景:突然有大量的文件需要导出成PDF文件,写一个批量导出pdf的脚本,同时文件的命名也需要有一定的规则 导出方式:向服务器中上传csv文件,csv文件中包含文件的地址和相对应的文件命名. 如下格式: ...

  3. snmpv3-snmpd.conf解析

    1.先指定createUser语句,设置密码和传输密钥. createUser user1 createUser user2 MD5 user2password createUser user3 MD ...

  4. 如何在for循环中使用多线程

    import java.util.concurrent.Executor;import java.util.concurrent.Executors; public class Test {priva ...

  5. centos7硬盘分区

    首先在虚拟机的设置中为系统添加硬盘 使用fdisk -l /dev/sdb   查看未分区的硬盘 fdisk -l /dev/sda  这是已经分区好得 接下来我们就要对sdb进行分区: 首先使用fd ...

  6. Go语言学习笔记(3)——分支、循环结构

    1 条件语句: if, else if, else   特殊用法:判断num是奇是偶:其中局部变量num只能在该if...else语句中使用! if num := 10; num % 2 == 0 { ...

  7. UiAutomator -- UiObject2 API

    1.点击与长按 void click() Clicks on this object. void click(long duration) Performs a click on this objec ...

  8. Restore HBase Data

    方法 1: Restoring HBase data by importing dump files from HDFS The HBase Import utility is used to loa ...

  9. 关于JSON基础的总结

    本文总结自百度百科 JSON 语法规则 JSON 语法是 JavaScript 对象表示语法的子集. 数据在键值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数 ...

  10. (转)MySQL登陆后提示符的修改

    MySQL登陆后提示符的修改 方法一:mysql命令行修改方式 mysql>prompt \u@night \r:\m:\s-> PROMPT set to '\u@night \r:\m ...