![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 63
记录 Java 常见数据结构
盼兮猫
长亭外 古道边 芳草碧连天
展开
-
String、StringBuffer、StringBuilder
String :字符串常量StringBuffer:字符串变量,线程安全StringBuilder:字符串变量,线程不安全String 字符串通过 char[] 数组实现,每次赋值都会创建新的字符串,原先的字符串此时不会被指向,后续可能被 gc 回收StringBuffer 相比 StringBuilder 新增了 synchronzied 保证同步...原创 2021-04-15 15:13:30 · 62 阅读 · 0 评论 -
SkipList 原理
SkipList 跳跃表,一种根据 key 高效查找 value 的数据结构,本质是链表。原生 Java 实现了 ConcurrentSkipListSet 以及 ConcurrentSkipListMap,文末我会给出 java 代码实现的 SkipList 源码使用跳跃表的条件:必须包含可以排序的属性,否则没有意义思路:按照属性大小建立链表,在链表的基础上改造,增加新的引用,分别指向更远处的节点,提高查询效率如上图所示,假设现在需要查询 22 节点:假设只有一层:依次遍历 head &原创 2021-05-12 15:04:46 · 187 阅读 · 1 评论 -
红黑树简单介绍
红黑树是二插平衡树的再优化,二插平衡树强制要求左右子树高度差不能超过1,并且它的左右子树也得是二插平衡树。这就导致每次添加、删除元素时需要大量的操作保持树的平衡,红黑树在其基础上优化,它不强制要求高度差必须小于1,但也尽可能保证树相对平衡,查询效率也高首先红黑树需要满足以下几条规则:1. 节点非黑即红2. 根节点必须黑色3. 每个叶节点(不是叶子节点,页节点值 NIL 或空节点)必须是黑色4. 每个红色节点的两个子节点必须是黑色5. 从任一节点到每个叶节点所经过的黑色节点数目相同也就是说原创 2021-09-12 09:08:55 · 278 阅读 · 0 评论 -
二叉树类简单介绍
二叉树:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为 i 的结点与满二叉树中编号为 i 的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树满二叉树:在二叉树的基础上,满二叉树满足:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树二叉查找树(二叉搜索树、二叉排序树)二叉查找树原创 2021-08-17 10:26:57 · 264 阅读 · 0 评论 -
ConcurrentHashMap JDK 1.7 源码解析
ConcurrentHashMap 也是一种存储键值对的数据结构,和 HashMap 相比,它可以保证同步HashTable 虽然也能保证同步,但由于它通过 synchronized 直接对方法加锁,并且没有引入红黑树等效率更高的数据结构,导致整体效率较差,一般很少用到在 JDK 1.7 中,ConcurrentHashMap 核心属性如下:其中它的 put() 方法源码如下:public V put(K key, V value) { Segment<K,V> s;原创 2021-07-28 17:04:57 · 188 阅读 · 0 评论 -
HashMap
HashMap 是一种存储 key-Value 键值对的数据结构,每个键值通过 Entry 对象表示。size:HashMap 已经存储的节点个数threshold:扩容阈值,当 HashMap 的个数达到该值,触发扩容loadFactor:负载因子,扩容阈值 = 容量 * 负载因子,默认为 0.75它的底层实现原理为数组加链表,链表实现原理是由于 Entry 包含自身类型引用,方便链接。put():直到我们第一次插入节点时,才会对 table 进行初始化,避免不必要的空间浪费。首先通过哈希原创 2021-04-14 11:23:27 · 123 阅读 · 2 评论 -
List 相关实现类整理
Java 代码中常见的 List 实现类有 ArrayList、LinkedList、Vector 等ArrayList 和 Vector 底层都基于数组实现,区别在于 Vector 方法通过 Synchronized 修饰,保证线程安全、并且 ArrayList 扩容后长度为原来 1.5 倍,而 Vector 变为原来两倍LinkedList 底层基于双向链表实现(它还实现 Deque 接口),节点在内存地址上不连续由于实现方式的不同,ArrayList 和 LinkedList 有以下区别:对原创 2021-07-30 10:17:04 · 123 阅读 · 0 评论 -
Java 集合架构
Java 集合架构图如下所示:这里空心三角实线箭头表示泛化,其实就是父子类之间的继承关系、空心三角虚线箭头表示实现,就是接口与实现类之间的关系、双向箭头表示关联,是对象之间的一种引用关系、虚线箭头表示依赖,通常表现为类的方法参数用到被依赖对象如图所示,最顶层 Iterator 表示迭代器,它实现了遍历集合的方法,通常在代码中这样使用:List<Integer> list = new ArrayList<>();for (int i = 0; i < 20; i++)原创 2021-07-05 15:01:28 · 144 阅读 · 0 评论