《码出高效 Java开发手册》第六章 数据结构与集合
码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/collection/index.md
6.1 数据结构
1. 数据结构定义:
数据结构是指逻辑意义上的数据组织方式及其相应的处理方式;
1.1. 数据组织方式:
- 树: 二叉树, 三叉树, B+ 树等;
- 图: 有向图, 无向图;
- 队列: 先进先出的线性结构;
- 哈希: 根据某种算法直接定位的数据组织方式;
1.2. 数据处理方式:
在既定的数据组织方式上, 以某种特定的算法实现数据的增删改查和遍历.
不同数据处理方式存在巨大的性能差异;
2. 数据结构分类
线性结构: 0至1个直接前继和直接后继;
包括顺序表、链表、栈、队列等,栈和队列是访问受限的结构;
栈是 LIFO (Last-In, First-Out), 队列是FIFO (First-In, First-Out);树结构: 0至1个直接前继和 0至n个直接后继(n大于或等于2);
结构稳定均衡;
图结构: 0 至n 个直接前继和直接后继( n大于或等于2 );
哈希结构: 没有直接前继和直接后继;
通过某种特定的哈希行数将索引与存储的值关联起来; 查找效率非常高;
数据结构复杂度: 空间复杂度, 时间复杂度; 算法时间复杂度是衡量计算性能的指标
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开发手册》第六章 数据结构与集合的更多相关文章
- 《码出高效 Java开发手册》第二章 面向对象
码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding 第2章 面向对象 Object-Oriented Pro ...
- 《码出高效 Java开发手册》第一章计算机基础(未整理)
码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding
- 《码出高效 Java开发手册》第七章 并发与多线程
码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/concurrency/multithreading ...
- 《码出高效 Java开发手册》第五章 异常与日志
码云: https://gitee.com/forxiaoming/JavaBaseCode/blob/master/EasyCoding/src/exception/index.md 5.2 try ...
- 《码出高效 Java开发手册》第四章 走进JVM(未整理)
码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding
- 《码出高效 Java开发手册》第三章 代码风格
第3章 代码风格 3.1 命名 符合语言特性 体现代码元素特征: Abstract xxx. Basexxxx.xxException.xxxTest等; 包名统一使用小写, 完整单词+点分隔符; 枚 ...
- Java开发笔记(六十五)集合:HashSet和TreeSet
对于相同类型的一组数据,虽然Java已经提供了数组加以表达,但是数组的结构实在太简单了,第一它无法直接添加新元素,第二它只能按照线性排列,故而数组用于基本的操作倒还凑合,若要用于复杂的处理就无法胜任了 ...
- 阿里巴巴 Java 开发手册 1.4.0
一.编程规约(一) 命名风格1. [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.反例: _name / __name / $name / name_ / name$ ...
- 码出高效,阿里巴巴JAVA开发手册1.4.0
码出高效,阿里巴巴JAVA开发手册1.4.0阅读笔记 一.编程规约(三) 代码格式// 关键词if与括号之间必须有一个空格,括号内的f与左括号,0与右括号不需要空格 if (flag == 0) { ...
随机推荐
- 第五章 JVM垃圾收集器(1)
说明:垃圾回收算法是理论,垃圾收集器是回收算法的实现,关于回收算法,见<第四章 JVM垃圾回收算法> 1.七种垃圾收集器 Serial(串行GC)-- 复制 ParNew(并行GC)-- ...
- Java基础学习篇---------封装
一.类和对象分配内存 二.Java中的内部类 : 可以直接去访问外部类的所有属性(包括私有成员) 1.Java中成员内部类 (1).内部类的方法可以直接访问外部类的类中的所有成员变量 (2).外部类 ...
- 深入学习c++--左值引用和右值引用
#include <iostream> #include <string> #include <vector> using namespace std; int m ...
- 雨天的尾巴(bzoj3307)(线段树合并+树上差分)
\(N\)个点,形成一个树状结构.有\(M\)次发放,每次选择两个点\(x,y\) 对于\(x\)到\(y\)的路径上(含\(x,y\))每个点发一袋\(Z\)类型的物品.完成 所有发放后,每个点存放 ...
- jzoj5923
我們可以記f[i]表示i個點的連通圖的個數 則我們可以考慮將i個點不必聯通的圖個數(記為g)減去i個點的不連通圖個數 那麼f[i]=g[i]-c(j-1,i-1)f[j]gi-j 枚舉一個j,強制將j ...
- CPU的寄存器结构
计算机的硬件有三个基本要素,CPU.内存和I/O.CPU负责解释.执行程序,从内存或I/O输入数据,在内部进行运算,再把运算结果输出到内存或I/O.内存中存放着程序,程序是指令和数据的集合.I/O中临 ...
- 这里给大家介绍一下通过 Wi-Fi 连接“慷慨捐赠”你的身份信息的七种方法.
这里给大家介绍一下通过 Wi-Fi 连接“慷慨捐赠”你的身份信息的七种方法和反制措施. 本文作者:黑子小盆友 1.利用免费热点 它们似乎无处不在,而且它们的数量会在接下来四年里增加三倍.但是它们当中很 ...
- 使用canvas绘制渐变色矩形和使用按键控制人物移动
使用canvas绘制渐变色矩形和使用按键控制人物移动 1.使用canvas绘制渐变色矩形 效果演示 相关代码: <!DOCTYPE html> <html lang="en ...
- spring boot整合RabbitMQ(Fanout模式)
1.Fanout Exchange介绍Fanout Exchange 消息广播的模式,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列,如果配置了routing_key会被忽略. 如上图所示, ...
- C/C++ -- Gui编程 -- Qt库的使用 -- HelloWorld
1.纯代码写对话框HelloWorld 创建空Qt工程,添加C++源文件main.cpp 需要设置编码以支持中文 -----源代码main.cpp----- #include <QApplica ...