【Java】多线程理论 在初始的情况下, synchronized 会预测当前冲突的概率不大, 此时就会以乐观锁的模式运行, 此时是轻量级锁. 但是一旦检测到冲突的概率很大, 那么此时就会转换为以悲观的模式运行, 此时是重量级锁. 其中自旋的操作, 会在轻量级锁到重量级锁的升级过程中出现, 次数也是会自适应变化的, 然后如果失败就会进入阻塞, 也就是挂起等待
【Java】多线程代码案例 当我们点击刚刚哪个创建线程池的工厂方法后, 发现其实际上就是创建了一个 ThreadPoolExecutor 对象. 同时还提供了一大堆参数.很明显, 此时我们就可以看到这个工厂类的一部分优势了, 如果我们要自己手动创建线程池, 还需要去提供一大堆的参数, 但是我们通过一个工厂方法, 就可以非常简单的创建出一个线程池同时, 我们继续进入构造方法, 会发现其实虽然有很多构造方法, 它们的内部都是指向了同一个参数最复杂的方法, 没有提供的参数它都会直接提供一个默认值过去。
【Java】多线程基础操作 这实际上是编译器的优化机制导致的. 众所周知, CPU 从内存中读取数据是一个开销较大的工作, 那么我们这个循环处于一直执行的状态, 并且速度极快, 但是如果一直从内存中读取数据就会极大的降低程序的运行效率. 那么此时编译器就会检测, 假如它检测到你的这个标志位似乎是不变的, 那么此时编译器就会从内存中复制一份标志位的拷贝到 CPU 的寄存器中, 此时 CPU 从寄存器中读取数据就快很多, 就会起到优化的效果.此时我们可以在出去绿色区域的时候直接把锁释放掉吗?
【Java】反射, 枚举, Lambda Lambda 表达式是一个用于简化函数式接口的语法而设置的一个语法糖, 语法糖顾名思义, 语法上吃起来甜甜的东西, 实际指的就是一系例简化后的语法. 例如我们之前使用过的 for-each 循环, 就是简化了遍历数组或者集合这样的语法而设置的一种语法糖.那此时可能有人就要问了: 既然 Lambda 表达式是为了简化函数式接口设置的语法糖, 那函数式接口又是什么呢?实际上, 当我们的接口中, 有且仅有一个抽象方法的时候, 那么这个接口就可以被称作是函数式接口. 例如下面这个接口就是一个函数式接口。
【Java】多线程前置知识 & 初识Thread 既然提到了 CPU, 那么就不得不提到另外一个话题, 就是多核 CPU 的诞生. 在过去, 这些 CPU 都是只有单个核心的(核心就可以理解为是一个能够完成一些运算功能的集合体, 里面由很多运算器组成, 完成指令执行, 简易运算操作). 在最开始的时候, 都是通过提高 CPU 内部电路的集成程度, 去提高 CPU 的运行速度. 随着集成程度的提高, 那么此时自然那些运算单元就也需要去变得更小, 但是小到一定程度之后, 那么此时进一步去缩小难度就会比较高了.
【计算机网络】HTTP&HTTPS 实际上是因为, HTTP 协议是一种"一问一答"结构模型的协议, 因此请求和响应是需要有一些不同的. 不然我问啥你答啥这不就乱套了吗。为什么要这个属性呢?实际上是因为在过去, 浏览器的功能是比较有限的, 但是随着时代的发展, 有一些浏览器就支持了一些新的功能, 此时网站的设计者也就可以跟随时代潮流更新自己的网站. 但是有一个问题, 假如使用旧版本的浏览器访问新版本网页的话, 就会出现兼容性问题. 因此这个属性就可以帮助网站的设计者去区分谁用的是什么样的浏览器, 然后针对它们使用的浏览器来进行特定的响应.
【计算机网络】IP, 以太网, ARP, DNS IP 地址, 本质上是一个 32 位的整数, 但是为了方便人来理解, 采用了点分十进制来表示这个地址上面也说过IP地址是用来区分各个设备的, 因此理论上来说, 这个IP地址是不应该重复的, 但是从IP地址的大小来看, 我们也知道, IP 地址只能表示 2 的 32 次方个数字. 实际上在当初设计这个IP地址的时候, 这个数字是绰绰有余的, 但是随着互联网的高速发展, 如今要使用网络的设备, 早就超过了这个数字.那么要如何解决这个 IP 地址不够用的问题呢?实际上有两个方案动态分配 IP。
【计算机网络】初识网络 例如公司中, 假如人数很多, 那么就会实现分层管理, 每当要发配任务的时候, 员工给自己的上司汇报, 然后上司再给上层的领导进行汇报, 反之同理. 这样就能显著提高管理效率, 降低管理成本
【计算机网络】UDP & TCP介绍 可以看到, 此时李四后面回的消息, 反而先到达了, 此时就可能会产生歧义, 张三此时就会想: 这李四居然不想和我吃饭, 而是想转我一百万, 真是我的好兄弟啊. 但是实际上并不是这样的
【双指针】N数之和 解决了第一个点, 接下来就是第二个点, 去重. 这里有一个非常简单的方法就是使用自带的集合类去去重, 比如Java中的HashSet. 但是我们这里就不使用这种方法了, 而是使用手动的方式来实现.那么此时我们就可以在过程中, 当当前数字和上一个数字不同的时候, 存储数字, 如果当前数字和上一个数字相同, 那么就跳过这些相同的数字. 但是这里要注意的是, 无论是选择。双指针优化和三数之和的思路一致, 先找一个数, 在后方区间求三数之和, 然后三数之和的思路就和前面一样, 那么总结下来的流程如下。
【MySQL】索引和事务 在正常情况下, 数据库去搜索数据, 都是通过一行行的遍历, 然后找到符合要求的行并且筛选出来, 很明显这样的操作对于查询频繁的表来说, 效率是非常低的. 同时我们的数据库都是将数据存储在硬盘上的, 而每一次访问硬盘的操作, 开销是非常大的, 因此更不用说频繁的访问硬盘了.因此为了优化查询操作, 数据库添加了索引机制, 索引是针对于查询操作的一种特殊的优化手段, 它主要是通过一些数据结构去给表中的数据进行管理, 从而便于查找.
【MySQL】MySQL操作介绍 MySQL 是一个用于存储大量数据的数据库管理软件, 一般我们也会直接叫这种软件为数据库. 它主要的功能就是能够将大量的数据有组织的存储起来, 便于我们增删查改, 从而实现一些涉及到大量数据的业务逻辑. 目前, 我们就只需要知道, MySQL 他就是用于把数据有组织的存储起来的, 能够支持我们进行对数据进行增删查改, 那么就足够了.
【滑动窗口】将 x 减到 0 的最小操作数 当然也是没有必要的, 因为你要求区间里面的和至少要 target. 你刚刚区间, 就恰好是 >= target 的边界. 也就是说, 左边的值应该都是 <= target 的, 也就是下面这个图蓝色区间的和, 肯定是小于 target 的. 因为是正好加了右侧指针的值才 >= target 停下的。更新结果: 结果的更新, 可以说是最好写的一个部分, 你要什么, 你就在什么时候更新. 我们要的是 sum = target 的长度, 那我们就在 sum = target 的时候更新长度不就行了?
【链表】环形链表 而此时我们回到 fast 走两步, slow走一步的情况, 我们可以发现, 在这种情况中, fast 相对于 slow, 总是在以 1 步的相对速度逐渐靠近的(fast 走两步, slow 走一步, 相对速度 = fast - slow, 即一步). 而同时我们长度的最低计量单位就是 1 步, 那么此时自然就不可能会发生直接越过 slow 的情况了。假设我们的 slow 能够走一圈, 那么此时 fast 的速度既然是 slow 的两倍, 那它理论上都走完了两圈了, 怎么可能会追不上 slow 呢?
【Java & 数据结构】二叉搜索树 & TreeMap 和 TreeSet 介绍 很明显, 对于二叉搜索树来说, 如果它树的分布是对半分布的, 如下图左侧的二叉树所示. 那么此时在查找过程中每经过一个节点都会排除一半的元素, 类似于二分查找, 因此理想情况下查找的时间复杂度是 O(logN). 但是如果是最坏情况, 二叉搜索树会是一棵单叉树, 如右图所示, 那么此时每一次都只能排除一个节点, 此时查找的时间复杂度就是 O(N) 了。
【Java & 数据结构】HashMap和HashSet介绍 Map 和 Set 是 Java 集合框架中的两个接口, 其分别对应着两种不同的搜索模型. 其中 一个是纯 key 模型, 另一个则是 key-value 模型.纯 key 模型就类似于一个集合, 里面装载着一些元素, 这些元素只包含其本身. 例如我有一个冰箱, 里面装着各式各样的饮料, 那么此时这个冰箱就可以看作是一个饮料的集合, 里面装载着饮料. 此时如果我要在里面找饮料, 找的就是饮料本身.
【Java & 数据结构】排序 这里我们简单总结一下各个排序的性质, 其中取的时间复杂度和空间复杂度都是平均情况排序方法时间复杂度空间复杂度稳定性冒泡排序O(N^2)O(1)稳定选择排序O(N^2)O(1)不稳定插入排序O(N^2)O(1)稳定希尔排序O(1)不稳定堆排序O(NlogN)O(1)不稳定快速排序O(NlogN)O(logN)不稳定归并排序O(NlogN)O(N)稳定。
【Java & 数据结构】PriorityQueue介绍 上一次我们简单的了解了二叉树这个数据结构, 但是在学习过后难免会产生一个问题就是, 二叉树的这个结构到底有什么用呢?那么接下来我们就来介绍一个集合类 PriorityQueue, 翻译过来就是优先级队列, 它能够将内部的元素进行优先级的排列, 从而使得每一次的出队都能够是优先级最高的元素. 它的底层就是一个使用顺序存储的完全二叉树结构, 而这种结构也有一个新的名字, 它就叫做堆.上面我们也说过, 堆是一个顺序存储的完全二叉树, 但是它的特征不仅仅于此, 他还有一些还有其他的性质. 下面是一个关于堆的描述自然
【Java & 数据结构】初识二叉树 树是一种非线性的数据结构, 也就是说它和我们前面学习的顺序表链表之类的不太一样. 那些数据结构要求中间的元素都只有一个前驱和后继, 而树型结构的中间元素则允许有多个后继.例如下面这个就是一个树形结构为什么叫这种结构为树形结构呢?这是因为它的结构长的就像一颗倒过来的树, 最上面是树根, 最下面则是叶子.下面我们看几个例子, 来认识一下树形结构的注意点下面的这个结构, 就不是一个树形结构, 原因是其中间在同一层的节点, 是不可以相连的, 中间的节点只允许和上层节点和下层节点进行连接.
【二叉树】最近公共祖先 此时我们可以会想到我们最开始的分析, 我们是如何分析出最近公共祖先的位置的呢?实际上是不可能的, 因为我们的返回值是 p 和 q 的存在情况, 当我们确认公共祖先后, 证明 p 和 q 一定在刚刚那个公共祖先的位置以及它的下面, 你往上递归, 是不可能遇到其他的 p 和 q 的存在情况的.如果没有传递过来 q 的位置信息, 此时就能够充分的证明, 这个 q 一定在我的下面, 而不是在我的对面. 因为如果出现在对面, 我一定是可以在上面的某个节点处获取到的. 这个间接的排除也是非常的巧妙的.