- 博客(51)
- 资源 (2)
- 问答 (12)
- 收藏
- 关注
原创 LeetCode 432 全O(1)数据结构
今天捣鼓一天总算是把整个代码给搞通顺了。整体思路是双端链表+Hash的方式,实现代码为C++;首先定义双端链表结点的数据结构(与LRU那道题有点类似),我们规定,链表是一个升序链表:struct Node { Node() {} Node(string key) : key(std::move(key)), count(1) {} // 保存当前的key和count值,其中count默认赋值为1 string key; int count; No
2021-07-11 22:30:05
312
原创 递归学习与理解
最近重新开始做力扣的习题,加深了自己对于递归的理解,因此以两道题为例分别解释递归的作用。两道题分别是LeetCode 83和24。虽然它们都有相应的迭代解法,但是递归的解法相对更为巧妙。以LeetCode83为例:迭代方式ListNode deleteDuplicates(ListNode head) { ListNode dummy = head; while (head != null && head.next != null) { if (hea
2021-07-10 12:30:28
352
原创 字节面试题:为每个学生进行排名
这道题还是比较有难度,主要是5.7的mysql不能使用rank函数。首先我们创建相应的表,以及create table if not exists `rank`.grade( id bigint not null primary key, name varchar(20) null, stu_rank int null);然后要注意的是,这是原来的表,需要新增一列stu_rank。ALTER TABLE grade ADD COLUMN stu_rank int null;我们先
2020-12-22 11:28:29
335
原创 Spring Boot配置Redis主从复制
先说结论,Spring Boot是不能直接通过application配置来实现主从Redis的配置的。Spring Boot支持的cluster是原始的使用槽的集群模式,而不是常用的主从集群,因此最好自己来搭建Redis的主从集群模式。需要我们通过自己定义的方式来实现。这里我们用docker来搭建redis集群,详细的docker-file如下:version: "2.0"services: master: image: redis restart: always co
2020-11-11 20:43:07
1834
原创 LintCode 486:(快手面试真题)合并K个有序数组
当时没撕出来,下来看了一下,要用到最小堆来进行辅助。整体的算法复杂度是O(Nlogk),N是所有点的总数,logk是堆内调整的复杂度代码如下:public int[] mergekSortedArrays(int[][] arrays) { List<Integer> res = new ArrayList<>(); int high = arrays.length; Queue<int[]> queue = new PriorityQueu
2020-10-11 16:28:31
279
原创 Spring Boot 纯注解实现Bean的生命周期
最近在准备面试,有关Bean的生命周期被问到了,下来巩固一下,之前都是针对Spring在回答Bean的各项注意事项,由于现在Spring Boot用的更多,因此找了一些如何用纯注解实现的方式。首先是Bean的完整加载流程:接下来是代码实现(已经按照顺序):@Componentpublic class Person implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean
2020-09-15 16:21:12
375
原创 ConcurrentHashMap:学习总结
ConcurrentHashMapJDK 1.7JDK 1.7 是一个Segment数组总览:Segment内部有一个HashEntry[] table 的字段Segment数组大小默认是16Segment由DEFAULT_CONCURRENT_LEVEL决定,去找比DEFAULT_CONCURRENT_LEVEL大的2次幂HashEntry由DEFAULT_CONCURRENT_LEVEL和initialCapacity决定。通过两者相除后再向上取整每个Segment对象内
2020-07-30 11:43:11
343
1
原创 面向对象思想:学习总结
面向对象的设计思想封装封装的是数据和基于数据的操作 – 构成不可分割的实体隐藏内部细节,只**暴露对外的接口(方法)**使其与外部发生联系优点减少耦合:各个模块相互独立提升代码重用性降低程序风险:整个系统不可用,但是单个模块是可用的易于维护和性能分析典型例子:Java Bean (POJO)继承对象之间的is-A的关系。继承需要遵循里氏替换原则:子类对象可以完全替换父类多态编译时多态:方法的重载运行时多态:类型只有在真正运行的时候才会最终确认条件:继承:声
2020-07-28 17:06:35
132
原创 数据库学习:MySQL总结
MySQL学习总结B+ Tree 原理B Tree — Balance Tree。B树是一棵平衡树B+ Tree。这个"+",加的是叶子结点之间的指针。通过B树去划分区间,在叶子结点可以通过指针进行范围遍历。结点的key按升序进行排列查找:先从根节点开始进行二分查找,再在指针的位置上递归进行查找。直到找出key所对应的data与红黑树对比:(数据结构)B+树的高度更低:有效的减少了指针向下递归的层树。红黑树出度为2,而B+树的出度会很多(硬件优化)磁盘读写快:磁盘寻道的次数与
2020-07-26 10:32:51
281
原创 数据库:知识总结
事务ACID性质A – 原子性:整体事务只有全部失败或全部成功。通过恢复日志进行事务的回滚C – 一致性:事务操作前后的状态具有一致性。这是指满足开始和结束的时候受到的程序约束是一致的。一致性状态下,事务对同一个数据的读取结果都是相同的。这里的一致性是指系统从一个正确的状态,迁移到另一个正确的状态.什么叫正确的状态呢?就是当前的状态满足预定的约束就叫做正确的状态.而事务具备ACID里C的特性是说通过事务的AID来保证我们的一致性.I – 隔离性:数据执行事务操作时不能被其他事务操作。在提交
2020-07-24 11:47:40
134
原创 动态规划:学习总结
动态规划1.题目特点(1)计数- 有多少种方式走到右下角- 有多少种方法选出k个数使得和是Sum(2)求最大最小值从左上角走到右下角路径的最大数字和最长上升子序列长度(3)求存在性取石子游戏,先手是否必胜能不能选出k个数使得和是sum例题: Coin Change动态规划解题步骤确定状态两个意识:最后一步 & 子问题(1)最后一步:得出的最后结果一定是最优结果。通过最优结果去反推前面的结果(2)子问题:通过最后的结果去反推前面的各个子问题(
2020-07-19 14:39:45
188
原创 HashMap:学习总结
首先是HashMap的整体结构:主体采用数组进行存储。当数组处的节点产生碰撞,会向下延伸,生成一条链表当超过成树阈值(8)且数组长度大于64后,采用红黑树进行存储(红黑树的结构复杂,但是查找效率高)HashTable的创建jdk8以前:在创建的时候就会有一个Entry[] table来存储jdk8以后:会在第一次put方法被调用的时候创建Entry[] 数组数据的存储通过Key的hashCode方法计算出值,再通过某种算法计算出数组中存储数据的空间的索引值,如果没有数据
2020-07-14 21:01:10
2887
5
原创 字符串部分:子字符串查找
子字符串查找在母串中匹配对应的模式串(pattern)暴力查找public class PatternMatch { public static int search(String pat, String txt) { int M = pat.length(); int N = txt.length(); for (int i = 0; i <= N - M; i++) { int j; /
2020-07-10 23:22:04
385
原创 最短路径:学习总结
最短路径最小生成树是以无向带权图为基准,而最短路径则是以加权有向图为基准最短路径树给定一幅加权有向图和一个顶点s。以s为起点的一棵最短路径树是图的一幅子图,它包含s和从s可达的所有顶点。根节点为s,到叶子结点的每条路径和都是有向图中的一条最短路径基本数据结构:public class DirectedEdge { // 定义的是起始节点,互相不一定互通 private final int v; private final int w; private fin
2020-06-22 14:50:00
1617
原创 LeetCode刷题(二):树的递归部分
树 – 递归部分1.求树的高度 – :没什么难度,分别对左子树和右子树求高度,取两者的较大值。+1是为了囊括结点本身的高度public class MaxDepth_104 { public int maxDepth(TreeNode root) { if (root == null) return 0; // 分别递归求解左右子树的高度,注意最后需要加上结点本身的高度 return Math.max(maxDepth(root.left)
2020-06-16 23:05:54
259
原创 有向图:学习总结
有向图相较于无向图,有向图的边是带有方向性的。v→w,那么v的邻接点链表中会有w,但是w的邻接点链表不存在v。因此就邻接表来说,体现有向性是通过链表中的节点有无来实现的。public class Digraph { private final int V; private int E; // 边的有向性体现在结点添加时,不像之前无向图,两端结点可以互达。 // 有向图的节点是不一定可互达的 private Bag<Integer>[] adj;
2020-06-16 18:55:43
871
原创 无向图:学习整理
无向图使用的数据结构:邻接表:使用一个以顶点为索引的列表数组 – 每个元素都是和该顶点相邻的顶点列表空间和V+E成正比添加一条条边所需的时间为常数遍历顶点v的所有相邻顶点所需的时间和v的度数成正比基本数据结构:public class Graph { private final int V; private int E; private Bag<Integer>[] adj; //邻接表 public Graph(int V) {
2020-06-16 15:01:14
318
原创 红黑树:整理学习
红黑树红黑树定义红色结点均为左节点 – 红色结点与黑色结点合并会得到一个-3结点没有任何一个结点同时和两个红色结点相连任一空连接到根节点的长度和黑色结点的数目相同结点定义// 红色结点记为true,黑色记为falseprivate static final boolean RED = true;private static final boolean BLACK = false;// BST helper node data typeprivate class Node {
2020-06-15 20:32:34
132
原创 JMM 理解
JMM 理解read:将主内存中的数据读取出来load:紧跟在read之后,将数据写入到线程内部的私有数据副本中use:线程内部的方法将调用数据副本中的数据进行操作assign:如果数据副本的值在方法中发生改变,那么又会调用assign将其复制给数据副本中的对应变量store:会先在主内存中开辟一块空间,将变量值传入到主内存中write:在这一步中才会将数据值真正的写入到主内存中lock:将一个主内存中的变量设置会线程私有unlock:将一个线程私有的变量释放,可以令其他线程访问到
2020-06-15 09:27:35
161
原创 堆排序:学习记录
堆排序核心要点:通过下沉的方式,自底向上进行建堆 ,可以保证当检测到有父节点的堆有序时,其所有子堆都是满足堆的成立条件。即父节点大于任意两个子节点下沉排序的过程,实质上是在删除最大元素后,堆的自我调整过程。调整的过程中,堆逐渐构成一个有序序列父节点的坐标是左子节点的一半,所以开头要减一。由于使用了一个完全二叉树,因此索引为0的位置不能有数public static void heapSort(int[] arr) { int N = arr.length - 1; // 建堆
2020-06-14 21:53:38
126
原创 其他排序算法:学习整理
其他排序算法整理选择排序选一个最小的放在最前面,然后前面的就有序了,最简单的排序。public static void selectSort(int[] arr){ for (int i = 0; i < arr.length - 1; i++) { // 从当前i开始 int min = i; for (int j = i; j < arr.length; j++) { // 当有更小的记录 -- 选择最小的
2020-06-14 21:01:21
144
原创 归并排序:学习记录
归并排序要点:基于分治的思想,将需要比较的数组分为左右两部分。自顶向下进行分组,知道lo >= hi时,开始递归出栈。将出栈后的数组依次进行递归,借助一个辅助数组aux对数组结果临时储存归并操作从开头和中间两个位置向左遍历当左半部分已经到头,只须将右半部分辅助数组的数据赋值给原数组的对应位置右半部分到头同理当左半部分的值大于右半部分,则用右半部分的值进行赋值;右半部分同理这样保证归并后的数组,左半部分始终是较小值;而右半部分始终是较大值代码实现// 根据实际的数组安排
2020-06-14 19:50:23
135
原创 快速排序:学习记录
快速排序快速排序的基本思想是:选择一个排序的切分点,对剩余的部分进行从前至后的遍历从左边开始向右,找到第一个比切分点大的值从右边开始向左,找到第一个比切分点小的值交换两个值的位置这样保证切分点左边比切分点小,右边比切分点小同时交换的前提是两个指针不发生碰撞(相遇) — 假定了切分点是在中间这里将第一个位置作为切分点,因此还需要返回切分点的具体位置在碰撞发生后,切分循环退出,这时需要交换低位(low)与碰撞的h因为发生碰撞时,h是不大于l的,需要交换两个低位值,所以交换的是h和
2020-06-14 18:01:45
122
原创 力扣刷题记录(一):链表
双指针问题两个链条求交点,每一条链条到达尾端的时候,执行一次链条的切换,可以最终使两个链条达到同步运行的效果。这里注意到达尾部的条件是为null,而不是下一个结点为nullpublic ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode pointA = headA, pointB = headB; while (pointA != pointB) { // 到达尾部的时候才需要进
2020-06-11 23:36:09
232
原创 Gradle打包jar遇到问题,找不到主类
前几天需要部署一个jar到远程执行,平时用的maven,但是当需要多次编译成jar的时候,maven就开始捉急了,把编译速度确实感人。于是换成了Gradle来进行打包,那速度真心快不少。然后速度快是快,当你满心欢喜的执行java -jar时,就会发现:人一下傻了,然后看了看gradle.build,确认是没有任何问题的plugins { id 'java' id 'application' id 'org.jetbrains.kotlin.jvm' version '1.3.
2020-06-05 08:00:07
4628
1
原创 Kafka集群搭建踩坑记录
Kafka集群搭建踩坑记录最近在学习kafka,但是在用虚拟机跑的时候,动不动就会卡死,内存不足之类的,于是想用docker来搭建kafka的运行环境。当然也踩了不少的坑,写一篇博文记录一下。这里我们先不搭建集群的kafka,而是搭建单机的。Zookeeper环境搭建弄Kafka不搞zookeeper那是不可能的,因此我们先开始弄zookeeper的环境。首先我们在docker里新建一个内网环境:docker network create docker_net # 接下来zookeeper和ka
2020-05-27 09:16:05
1024
原创 Docker学习三:Dockerfile
摘自B站UP主狂神的学习笔记,欢迎大家去看原视频学习:BV1og4y1q7M4DockerFIledockerfile用来构建docker镜像的文件!命令参数脚本构建步骤:编写一个dockerfile文件docker build 构建一个镜像docker run运行镜像docker push 发布镜像很多官方的镜像都是基础包,很多功能都没有。通常会自己搭建镜像DockerFile的脚本构建基础知识:1、每个保留字都必须是大写字母1、每个保留字都是大写2、执行从上到下顺序执行
2020-05-24 20:43:02
270
原创 Docker学习二:Docker镜像原理
Docker镜像原理镜像定义轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件所有的应用,直接打包docker镜像,就可以跑起来。获取镜像:从远程仓库拷贝自己制作DockerFileDocker镜像加载原理UnionFS:封层、轻量级并且高性能的文件系统。支持对文件系统的修改和提交来一层层叠加Docker的镜像其实就是一层一层的文件系统组成对一些精简的OS,rootfs可以很小。只需要基本的命令。工具和程序库。底层直接用Host的kernelDocker分层
2020-05-24 20:41:27
759
原创 Docker学习一:Docker配置一个Nginx
这篇是一个比较粗糙的记录。资料摘自狂神的视频,我把BV号放这里,欢迎大家去三连:BV1og4y1q7M4Docker 配置 Nginxdennis@dennis-1:~$ sudo service docker restartdennis@dennis-1:~$ sudo docker pull nginxUsing default tag: latestlatest: Pulling from library/nginxafb6ec6fdc1c: Pull complete b90c53a0
2020-05-24 20:40:32
218
原创 Ubuntu+Virtualbox:傻瓜式大数据集群搭建教程
最近需要搞一点大数据分析相关的东西,今天捣鼓了一天搞这个生产集群,总算是弄完了,踩了不少的坑。这个教程适合那种初步上手的,按照这个一步步来,基本没什么问题。首先是下载virtualbox(一个虚拟机软件),还有ubuntu 16.04.-desktop(一步一步来,不要一开始就硬扛命令行)这两个不多做赘述,可以参考:https://www.bilibili.com/video/BV19J41157et?from=search&seid=13220585138641360838手把手教学安装。这
2020-05-22 22:02:37
697
原创 Java Modbus数据读取:TCP部分
最近在研究传输协议这一块。今天看了看Modbus4j相关的内容,感觉还是蛮简单的,就是官方有几个大坑没填,还需要自己去搞。我使用的库是modbus4j,注意maven导入的时候要设置对应repository,阿里云仓库里面好像没有这个库首先需要安装两个软件,一个是modbus slave,另一个是vspd,这两个软件网上都有相关的教程。也可以参考这篇博文:https://www.cnblogs.com/ioufev/p/10831289.html先从简单的来,就用Modbus TCP来进行传输。在Mo
2020-05-21 21:38:59
2925
原创 记录一下ktor client的一个坑:java.net.BindException: Address already in use: no further information
记录一下用ktor client的时候遇到的一个坑。这是我的代码@Scheduled(fixedRate = 10L)//这里httpClient是ktor client,另一个client是OPC UA milo的client private fun collectingCoordData() = runBlocking { val time = measureTimeMillis { val absoluteValues = async(Dis
2020-05-20 14:53:24
1526
原创 ktor client:支持协程的HTTP工具库
最近用kotlin开发服务端,用了很多库,像Spring boot的RestTemplate,okhttp还有retrofit,觉得retrofit很好用。但是,在用retrofit来实现协程的时候,遇到了一个问题如图所示,提示Inappropriate blocking method call,说这种协程的使用方式是不合适的。我在Stack Overflow上搜了一下,发现如下解答也就是说这个execute方法会阻塞当前线程,因此不能令线程挂起,导致协程失效,而这个execute的原方法中:@O
2020-05-19 19:50:20
2959
原创 OPC UA JAVA开发笔记(六):milo的数组数据写入
今天研究了一下OPC UA milo中有关数组数据的写入,算是对之前的数据写入的一个补充。首先我们先定义一个数组的节点这里是通过opcua-modeler来建立节点对象。主要是设置ValueRank为OneDimension,然后AccessLevel的读写都要圈上。启动Server。至于结点解析可以看我上一篇。我们在官方的WriteExample中修改一点:public class WriteExample implements ClientExample { public stat
2020-05-18 17:28:12
3572
6
原创 Kotlin学习:委托的理解
Kotlin的委托模式看了官方的还是有一些迷惑,决定写一篇博文记录一下。委托基础首先我们要了解委托模式到底是什么:在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理用wiki中的一个简单的例子来说明:class RealPrinter { // the "delegate" void print() { System.out.print("something"); } } class Printer { // t
2020-05-17 16:01:18
259
原创 基于Netty实现串口通讯
这个其实在官方示例里面有,我在官方示例的基础上改写了一下,当时本来是Java,被转换成Kotlin搞忘改回来了,大家凑合着看,Kotlin也不难理解:object RxtxClient { // 在外部定义的channel lateinit var channel: RxtxChannel @Throws(Exception::class) @JvmStatic fun main(args: Array<String>) { // 这里Eve
2020-05-14 19:00:36
7389
1
原创 Netty 出站入站机制详解
前段时间在B站学习Netty,讲到出站入站的机制时一直没搞明白到底是怎么弄的,直到开始讲源码部分时才终于搞明白。先来看看Netty官方有关出站入站机制的解释:按照图片的理解,则是在通道中,每次出现读事件时,会从头至尾依次调用Inbound即入站方法处理;而触发写事件时,则会从尾到头依次调用outbound即出站方法处理。这里会给人一种错觉,那就是netty在内部维护了两个单向链表实现出站...
2020-05-03 16:41:51
4259
4
原创 Java多线程:对于Thread.join()的理解
以前一直搞不明白Thread当中的join到底是怎么用的,今天自己写了个小例子过后总算是有点眉目。先来看JDK官方文档对于join是怎么描述的:// 等待该线程终止。public final void join() throws InterruptedException还有几个重载的方法就不多赘述,这样描述其实挺让人难懂的,所以还是看例子吧package concurrent;im...
2020-05-02 10:05:58
138
原创 MySQL ACID知识总结
本文主要总结一些原理和理论相关的一些知识:数据库的ACID特性A – Atomicity 原子性: 一次数据库的事务,要么全部执行,要么都执行,不能只发生一次操作。 数据库事务的内在要求C – Consistency 一致性: 数据保持一致性状态,数据的数目可以发生改变,但是本身的数据结构不变,数据特性不变。A有800,B有200,A转给B 200,在这个过程中,AB的总钱数保持不变I –...
2020-04-22 22:18:41
217
原创 Java多线程:有关可重入锁ReentrantLock的理解
前几天看狂神的视频学习Java的多线程并发相关知识。了解到Java多线程除了Thread线程类相关的以外,最重要的就是有关锁的使用,以保证对于共享资源的保护。ReentrantLock:可重入锁,顾名思义,是可以反复进入的锁,这个应该怎么理解呢。我决定用狂神写的测试类来解释一下自定义一个自旋锁类:public class SelfSpinLock { AtomicRefere...
2020-04-21 20:22:15
236
Beeond_UMX_Setup.zip
2020-02-16
Effective Java(中文版第3版).pdf
2020-01-05
Gradle 打包成jar,提示找不到主类
2020-06-03
Netty 如何通过Client发送HTTP请求获取JSON
2020-05-09
CPU缓存的刷新和冲刷分别指什么?
2020-04-29
如何调整redis发布订阅的队列大小
2020-04-21
请问在库中经常看到的core,stack这些是什么意思
2020-03-03
最近想用Java调用数据采集卡的数据,想通过JNA调用dll来实现
2019-11-19
SpringBoot yml文件无法添加多个数据源
2019-11-06
这个平衡二叉树的平衡因子是怎么算的呢
2019-11-03
学习数据结构二叉树的一个问题
2019-10-24
求助,在学习Java反射的时候碰到的一个问题
2019-10-19
eclipse里面怎么一直开启建议呢
2019-05-09
为什么我的Android studio没有device file explorer
2019-03-18
TA创建的收藏夹 TA关注的收藏夹
TA关注的人