自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 资源 (3)
  • 收藏
  • 关注

原创 [Top-K] 海量数据的Top-K问题/出现频率Top-K问题

描述最近在面试中有被问到,Top-K的相关问题,在此做以总结,希望对后续面试的小伙伴有帮助题目要素1.海量数据(大数量,小内存)2.排名前K变体:海量数据的词频问题例子先举一个比较有趣的例子。已知现在有25匹马,5条赛道,假设不考虑马的疲劳问题,不可以使用计时器记录每一匹马的时间。最少需要多少次比赛才能选出25匹马中的TOP3。答案:7次思路:❗ 解决此类问题,脑海中一定要从哪些马没有资格成为TOP3的思想出发。首先,对25匹马进行5次比赛,淘汰每一组中排名靠后的两匹马,因为这些

2021-03-25 21:21:23 773

原创 [Java] 多线程中的信号量与操作系统中的信号量

信号量在面试中被问到,操作系统的信号量,觉得回答的不是很好,查了些资料,将操作系统中的信号量及JUC下的信号量概念进行比较。操作系统中的信号量操作系统中的信号量主要负责进程间的信息同步 ,可以理解为常说的进程间通信。其本质上就是一个计数器 通过操作系统的P(上锁),V(释放锁)操作。在理解信号量的之前需要先理解临界资源 及 临界区临界资源临界资源:具有排他性的资源。可以理解为Java中的需要各个线程间增强的资源,在操作系统中等价于各个进程需要统一维护的一个变量。临界区临界区:访问临近资源的代码

2021-03-23 11:05:45 406

原创 [Java] 阻塞队列的实现原理

阻塞队列的实现原理核心: lock锁+多条件(condition)的阻塞控制Java中的阻塞队列使用BlockingQueue封装了根据condition条件阻塞线程的过程,使得我们不需要求关系繁琐的await和signal操作。以生产消费者模式举例,使用阻塞队列可以不关系什么时候阻塞生产,什么时候阻塞消费。实现: 各个阻塞队列都实现了BlockingQueue接口常用阻塞队列:ArrayBlockingQueue:是一个用数组实现的、有界的阻塞队列,其内部实现是将对象放到一个数组里。有界也

2021-03-23 10:11:08 406

原创 [分布式锁] 分布式锁的使用场景

分布式锁为了解决分布式场景下全局加锁的问题。在单体项目中可以使用synchronize完成对于不同线程之间的资源争抢问题。但是在分布式场景下,synchronize只能对其中一个项目进行资源控制,进程之间的资源增强仍然无法解距。换言之,可以将分布式锁理解为对于整个分不是系统的synchronize。通常使用独立与线程之外的工具控制资源,如redis及框架redisson。1.传统单体架构业务流程synchronized(this){ /** 业务逻辑扣减库存 */}以上代码对于单体架构可

2021-02-24 14:05:31 1739

原创 [算法] 并查集的Java实现

最近阅读到一篇关于并查集的博客文章,自己也研究一下。并查集算法的主要概念初始化(Init):初始化定义,将每个对象的父节点指向自己;查询(Find):查询两个元素是否在同一个集合中;合并(Union):把两个不相交的集合合并为一个集合。以LeetCode中547. 省份数量为例解释算法。题目中给定一个图的邻接矩阵isConnected[ ][ ],矩阵中0表示不相连,1表示相连;需要输出集合总数。class Solution { public int findCircleNum(in

2021-02-23 15:34:07 148

原创 [MyCat] 一文读懂MyCat

MyCatMyCat是一种数据库中间件,一端连接Java应用,一端连接数据库集群。使用对Mycat的配置完成对于数据库集群的管理,完成读写分离、数据分片(分库分表)、多数据源整合。原理拦截,拦截用户的sql语句,为sql语句查询指定数据源,并返回结果。登录Mycatmysql -umycat -p1223456 -p 8066 -h 192.168.0.1垂直拆分(分库)根据业务在mycat上配置哪个数据库在哪个机器上。水平拆分(分表)分库后将一张表在多台数据库上拆分,一般根据某个字段

2021-02-23 14:25:32 130

原创 [算法] 广度优先算法通用模板

广度优先算法和深度优先算法类似是较为优雅的暴力算法,时间复杂度为o(n^2)解题模板定义Queue加入初始条件队列不为空的while循环3.0 业务处理3.1 for循环将队列元素逐一取出进行处理3.2 将下一条件放入队列中3.3 将符合条件的一种结果放入结果集中返回结果集接下来用LeetCode中的一些题目来验证如上解题模板题目展示1. 二叉树的层序遍历LeetCode-102.二叉树的层序遍历根据要求编写代码class Solution { public Lis

2021-01-13 12:16:45 341 1

原创 [Netty]bind方法源码分析

服务器在bind方法中完成初始化,核心方法为doBind方法,该方法主要完成执行initAndRegister方法执行doBind方法initAndRegister使用channelFactory.newChannel()方法反射创建一个NIOServerSocketChannel对象,同时创建了一个NioServerSocketChannelConfig对象。对NioServerSocketChannelConfig调用init方法完成初始化2.1 init方法设置NioServer

2021-01-11 21:12:18 140

原创 [Netty] 使用Netty实现webSocket服务端

使用Netty实现WebSocket的服务端部分服务端代码import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;import io.netty.channel.EventLoopGroup;import io.netty.c

2021-01-07 15:48:06 336

原创 [Netty] Netty心跳检测

Netty进行心跳检测的方法有很多,本文主要介绍通过Netty提供的idleStateHandler完成心跳检测IdleStateHandlerIdleStateHandler是Netty提供的专门用于处理空闲状态的处理器三个参数:1. readerIdleTIme 表示多长时间没有读了,就会发送一个心跳检测包,检测是否还是连接状态2. readerIdleTime 表示多长时间没有写了,就会发送一个心跳检测包,检测是否还是连接状态3. allIdleTIme 表示多长时间没有读写了,就会

2021-01-06 20:35:25 344 1

原创 [Netty] 基于Netty的简单群聊系统

功能使用Netty实现简单的群聊系统检测各个客户端的上线和下线;将客户端的数据分别推送到其他客户端代码服务端代码import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.netty.channel.Cha

2021-01-06 15:02:06 214 1

原创 [Netty] Bytebuf

Unpooled类是Netty提供的一个专门用于操作Netty数据容器的工具类Bytebuf创建一个Bytebuf对象,该对象包含一个byte[] 数组,在Netty的ByteBuf中不需要使用lip进行反转,也可完成读写操作Bytebuf使用了readIndex和writeIndex保存读取和写入的索引/*** 创建一个ByteBuf */ ByteBuf buffer = Unpooled.buffer(); for (int i = 0; i < 10; i++) {

2021-01-04 20:35:39 149

原创 [Netty] ChannelHandlerContext详解

ChannelHandlerContext组件ChannelHandlerContext常叫ctx。ChannelHandlerContext里就包含着ChannelHandler中的上下文信息,每一个ChannelHandler被添加都ChannelPipeline中都会创建一个与其对应的ChannelHandlerContext。ChannelHandlerContext的功能就是用来管理它所关联的ChannelHandler和在同一个ChannelPipeline中ChannelHandler的

2020-12-30 17:32:14 2526

原创 [Netty] Netty案例——基于Netty的HTTP请求

使用Netty实现HTTP请求使用Netty编写服务端,使用浏览器模拟HTTP请求,访问服务端。服务端返回的数据在浏览器显示。服务端代码import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.EventLoopGroup;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.

2020-12-28 21:49:38 1765

原创 [Netty] Netty的Task及Future机制

Netty的Task的3中典型应用场景用户程序自定义的普通任务用户自定义定时任务非当前Reactor线程调用Channel的各种方法Netty框架中NIOEventGroup中的EventLoop中的TaskQueue中处理任务1. 用户程序自定义的普通任务ctx.channel().eventLoop().execute(new Runnable(){ @Override public void run(){ // 用户定义的特定任务 }})对于队列中的多个任务,顺序执行。

2020-12-28 08:52:50 263

原创 [Netty] Netty入门案例TCP连接

通过简单的例子演示Netty进行TCP请求,解释Netty运行的过程使用Maven环境引入Netty依赖<dependencies> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.43.Final</version>

2020-12-26 12:36:11 339

原创 [Netty] Netty概述

原生NIO问题NIO的类库的API繁杂,使用麻烦。开发工作量大,需要if判断不同的情况,如网络断开等情况需要重复处理。NIO存在Epoll Bug 导致选择器空轮空Nettynetty是一个异步的基于事件驱动的网络应用框架,快速的开发高性能的service和clientsNetty支撑多种协议https://netty.io/index.html建构设计线程模型目前存在的线程模型:传统阻塞IO模型Reactor模式根据Reactor的数量和处理资源池线程的数量的不同又

2020-12-21 21:08:10 169

原创 [Netty] NIO和零拷贝

零拷贝指不发生CPU拷贝传统IO经历了4次拷贝、三次上下文切换4次拷贝:DMA(直接内存拷贝)拷贝到内核bufferCPU拷贝到用户Buffer—用户进行修改操作—CPU拷贝到SocketBufferDMA拷贝到协议栈mmap内存映射优化经历了3次拷贝、3次上下文切换(内核缓冲和User缓冲共享数据)三次拷贝DMA(直接内存拷贝)CPU拷贝—用户进行修改操作—DMA拷贝到协议栈sendFile优化(Linux 2.1)经历了3次拷贝、2次上下文切换(数据不经过用

2020-12-20 22:18:10 259

原创 [Netty] 基于NIO的简单群聊系统

介绍基于Netty的后端群聊系统,实现的功能有监听客户端的上线和下线、监听客户端的消息的发送代码服务端package com.gxd.nio.groupchat;import jdk.nashorn.internal.ir.annotations.Ignore;import org.omg.CORBA.IRObject;import java.io.IOException;import java.net.InetSocketAddress;import java.net.So

2020-12-20 15:15:36 141

原创 [Netty] Selector选择器

选择器介绍Selector能够同时检测对个注册的通道上是否有事件发生多个Channel以事件的方式注册到同一个Selector。如果有事件发生,就获取事件,然后对事件进行处理,只使用一个线程就管理了多个通道。只有在一个通道真正有读写事件时,才会执行。Selector、SelectionKey、ServerSocketChannel和SocketChannel的关系当客户端连接时,会通过ServerSocketChannel得到SocketChannel将SocketChannel注

2020-12-17 22:44:43 394

原创 [Netty] MappedByteBuffer、Buffer的分散和聚集

MappedByteBuffer的使用介绍使用MappedByteBuffer可以不在内存中将文件修改,使用堆外内存,不需要将文件进行而外的拷贝。是一个操作系统级别的文件修改代码 public static void main(String[] args) throws Exception { RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt","rw"); // 获取对应通

2020-12-15 21:23:07 293

原创 [LeetCode-Java] 133.对于图的克隆的两种解法

133 克隆图题目给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node { public int val; public List<Node> neighbors;}测试用例格式:简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。

2020-08-12 12:23:35 190

原创 [LeetCode-Java] 696.计数二进制子串

696 计数二进制子串题目给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。重复出现的子串要计算它们出现的次数。示例 1 :输入: "00110011"输出: 6解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。请注意,一些重复出现的子串要计算它们出现的次数。另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起

2020-08-10 14:04:43 236

原创 [LeetCode-Java] 66.加一

66 加一题目给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1:输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123。示例 2:输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321。代码class Solution { public int[] plus

2020-08-06 20:26:38 161

原创 [LeetCode-Java] 337.打家劫舍 III

337 打家劫舍 III题目在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3

2020-08-05 09:36:33 156

原创 [LeetCode-Java] 415.字符串相加

415 字符串相加题目给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:1. num1 和num2 的长度都小于 5100.2. num1 和num2 都只包含数字 0-9.3. num1 和num2 都不包含任何前导零。4. 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。代码class Solution { public String addStrings(St

2020-08-03 09:02:04 145

原创 [LeetCode-Java] 114.二叉树展开为链表

114 二叉树展开为链表题目给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6代码(前序遍历)/** * Definition for a binary tree node. * public class TreeNode { *

2020-08-02 23:57:05 183

原创 [LeetCode-Java] 58.最后一个单词的长度

58 最后一个单词的长度题目给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例:输入: "Hello World"输出: 5代码class Solution { public int lengthOfLastWord(String s) {

2020-08-02 23:44:40 190

原创 [Git] Git将项目上传到指定项目的指定分支

Git将项目上传到指定项目的指定分支本文讲述如何将项目上传到一个新的分支步骤1、新建文件夹想要上传的内容放入文件夹中2、Git初始化git init此时,默认分支为master分支,如图3、更换分支git checkout -b dev-GxD这里以dev-GxD为例,需要换成你自己的分支名。更换后,效果如图4、指定待上传仓库路径git remote add origin https://xxxxx指定你的项目地址,如:https://…5、选择项目git add .

2020-07-29 21:12:39 10180 1

原创 [LeetCode-Java] 38.外观数列

38 外观数列题目给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。注意:整数序列中的每一项将表示为一个字符串。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:1. 12. 113. 214. 12115. 111221第一项是数字 1描述前一项,这个数是 1 即 “一个 1 ”,记作 11描述前一项,这个数是 11 即 “两个 1 ” ,记作 21描述前

2020-07-27 16:15:19 145

原创 [LeetCode-Java] 35.搜索插入位置

35 搜索插入位置题目给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0代码(遍历查找)class Solution { public int

2020-07-27 13:21:07 265

原创 [LeetCode-Java] 392.判断子序列

392 判断子序列题目给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。示例 1:s = “abc”, t = “ahbgdc”返回 true.示例 2:s = “axc

2020-07-27 11:12:05 169

原创 [LeetCode-Java] 95.不同的二叉搜索树 II

95 不同的二叉搜索树 II题目给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。示例:输入:3输出:[ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \

2020-07-21 10:42:15 101

原创 [LeetCode-Java] 167.两数之和 II - 输入有序数组

有序两数之和题目给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], target = 9输出: [1,2]解释: 2 与 7 之和等于目标数 9 。因此 index

2020-07-20 10:49:47 118

原创 (八) 堆排序Java实现

堆排序核心:利用大顶堆进行进行排序,每次排序将最大数出去放入数组最后。动图代码public static void heapSort(int arr[]) { int temp = 0; for (int i = arr.length / 2 - 1; i >= 0; i--) { adjustHeap(arr, i, arr.length); } for (int j = arr.length - 1; j > 0; j--) {

2020-06-28 14:13:29 264

原创 [Java] 面试常考排序算法的Java实现

本文对常见、常用、面试中常考的排序算法,使用Java语言实现,并对个算法的时间复杂度进行了分析。排序算法,这一篇就够了

2020-06-24 15:01:33 415

原创 (七) 基数排序Java实现

基数排序核心:从元素的个位开始,按照数字放入0-19(不包含负数0-9)号桶,顺序取出,再按照倒数第二位排序动图(不考虑负数)代码(不考虑负数)public static void radixSort(int[] arr) { // 二维数组模拟桶 int[][] bucket = new int[10][arr.length]; // 一维数组模拟索引 int[] bucketCounts = new int[10]; // 确定数组最大数的位数

2020-06-24 14:51:03 281

原创 (六) 归并排序Java实现

归并排序核心:将数据分为单个数据,对单个数据进行不断组合并排序关键词:分治动图代码public static void mergeSort(int [] arr,int left,int right,int [] temp){ if (left<right){ int mid = (left+ right)/2; mergeSort(arr,left,mid,temp); mergeSort(arr,mid+1,right,tem

2020-06-24 14:43:15 276

原创 (五) 快速排序Java实现

快速排序核心:选定一个数作为中间数,比较其余元素,分别放在两边,对两边的数进行同样的的递归操作关键词:一个while循环、先定位后交换、递归、避免死循环动图代码public static void quicksort(int[] arr, int left, int right) { int l = left; int r = right; int pivot = arr[(left + right) / 2]; while (l < r) {

2020-06-24 14:39:32 237

原创 (四) 希尔排序Java实现与改进

希尔排序解决插入排序,位置靠后的元素需要对数组进行不断位移的问题核心: 分组插入排序关键词:步长、3个for循环(2个for一个while)动图(移动法)代码(交换法)public static void shellSort(int[] arr) { for (int gap = arr.length / 2; gap > 0; gap /= 2) { for (int i = gap; i < arr.length; i++) {

2020-06-24 14:37:00 259

Socket调制工具+操作手册

Socket调制工具 Sockettool v4 支持TCP、UDP连接 exe可执行文件,解压后双击即可运行

2020-12-17

HTML5+CCS3+JS实现简单的音乐播放

HTML5+CCS3+JS实现简单的音乐播放页面,自己添加音乐文件。

2019-09-03

图片至数组转化

实现图片至数组转化功能的vi 主要完成图形数字化的转化

2017-12-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除