代码改变世界

随笔档案-2022年11月

锁的定义和实现、分类

2022-11-30 09:54 by 杭伟, 439 阅读, 收藏,
摘要: 什么是锁? 通过一种抽象的锁来对资源进行锁定。具体来说:操作修改一个数据,在同一时刻只允许一个线程操作,操作完毕才能轮到下一个线程。 在这个过程中,是什么阻止了另一个线程的操作?即是“锁”。 Java锁机制: (主要发生在堆和方法区等线程共享的数据区域) java中每个对象都有一把锁,锁记录在对象头 阅读全文

操作系统原理之线程的分类:用户级线程和内核级线程

2022-11-28 19:45 by 杭伟, 294 阅读, 收藏,
摘要: 本篇文章作为Java并发编程的前置重点知识,有助于理解乐观锁和悲观锁。 这个世界上只有两种锁--> 乐观锁:指的是在操作数据的时候非常乐观,乐观地认为别人不会同时修改数据,因此乐观锁默认是不会上锁的,只有在执行更新的时候才会去判断在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作 阅读全文

HashMap实现原理和自动扩容

2022-11-28 17:42 by 杭伟, 115 阅读, 收藏,
摘要: HashMap实现原理: JDK1.7:数组+单向链表(头插) 在并发情况下头插可能出现循环链表(死循环)问题。原因:因为头插,在新数组中链表的元素顺序发生了变化, 如上图,假设线程1在扩容,刚刚调整链表完毕;线程2的指针却指向的还是原来的元素。这时新数组链表中是1->2->3的指向,但是线程2却是 阅读全文

哈希,哈希表,哈希冲突和哈希函数

2022-11-25 12:00 by 杭伟, 115 阅读, 收藏,
摘要: 哈希是什么? 哈希不等于加密。哈希不可逆,一般的加密函数是可逆的。 哈希表: 数组使用下标(序号)和元素进行关系对应,通过数组下标可以直接找到内存地址; 哈希表使用哈希值和元素进行关系对应(key-value),对key进行哈希函数计算即可找到内存地址; 哈希冲突: 解决 1,封闭寻址(拉链) 2, 阅读全文

B树和B+树

2022-11-25 11:16 by 杭伟, 60 阅读, 收藏,
摘要: 上一篇讲到了红黑树,想到说树从二叉树演进到红黑树这样近乎“完美”的数据结构,那直接所有大数据类的场景都用红黑树好了? 也不对。比如:如果新增删除少,查询多,那还是平衡二叉搜索树更具优势。因为它更“平衡”查找效率更高(红黑树高度一般比平衡二叉树要高)。 然后我们所讨论的时间复杂度也更多的是指在内存中操 阅读全文

2-3-4树和红黑树

2022-11-24 15:38 by 杭伟, 105 阅读, 收藏,
摘要: 2-3-4树,一种4阶的B树。红黑树的本质是2-3-4树。 其中: 2节点对应红黑树中的黑色节点(所有的2节点直接染黑), 3节点对应红黑树中的上黑下红(这里颜色一定是上黑下红), 4节点对应红黑树中的中间黑两边红。 裂变状态对应红黑树中:上红下黑新增红(新增一定是红),如果上是根节点再转为黑色。 阅读全文

Java实现平衡二叉搜索树(AVL树)

2022-11-23 19:31 by 杭伟, 196 阅读, 收藏,
摘要: 上一篇实现了二叉搜索树,本章对二叉搜索树进行改造使之成为平衡二叉搜索树(Balanced Binary Search Tree)。 不平衡的二叉搜索树在极端情况下很容易退变成链表,与新增/删除/查找时间复杂度为O(logN)的目标又远了一步。 平衡二叉搜索树始终围绕O(logN)这个目标来构建数据结 阅读全文

Java实现二叉搜索树

2022-11-22 17:06 by 杭伟, 151 阅读, 收藏,
摘要: 将链表进行改造,即可构造一棵二叉树。 本文用java实现一颗二叉搜索树,实现二叉树的新增,删除,查找等功能。并测试新增和查找的时间复杂度。 节点类与链表节点相似,将链表的前后节点定义逻辑改为左右(孩子)节点: /** * 二叉搜索树节点 */ public class Node { private 阅读全文

Java双向链表实现队列

2022-11-21 15:46 by 杭伟, 165 阅读, 收藏,
摘要: 将双向链表做简单的改造,即可实现一个FIFO(First Input First Out)队列, 该队列只在头节点出队,尾节点入队。 一般来说定义节点类只需一个后驱节点next即可。 这里保留pre节点,模拟一个已经入队的节点,如果需要取消,这样pre节点就是一个优势。 定义节点类: /** * 队 阅读全文

Java实现双向循环链表

2022-11-21 09:02 by 杭伟, 217 阅读, 收藏,
摘要: 上一篇文章实现了单向循环链表,双向很简单,在单向循环链表的基础上加一个前驱指针, 节点类如下: /** * 双向链表节点 */ public class Node { private int data;//数据域 private Node pre;//指向上一个节点 private Node nex 阅读全文

Java实现单向循环链表

2022-11-18 18:05 by 杭伟, 200 阅读, 收藏,
摘要: 准备节点类,节点类中只有一个int类型的数据域和一个指针: /** * 单链表节点 */ public class Node { private int data;//数据域 private Node next;//指向下一个节点 public int getData() { return data 阅读全文

ArrayList实现原理和自动扩容

2022-11-18 16:34 by 杭伟, 199 阅读, 收藏,
摘要: ArrayList在Java集合中的位置, ArrayList原理: transient Object[] elementData; ArrayList通过数组来实现。 默认构造方法会构造一个容量为10的空数组。 自动扩容: 在每次添加新元素(Add方法)时,都会通过grow方法判断当前list的s 阅读全文