自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(141)
  • 收藏
  • 关注

原创 MySQL八股文面试

1.MySQL有哪些存储引擎(表类型)MyISAM成熟稳定、快速读取,不支持事务,有表锁InnoDB支持事务、外键、数据行锁,空间占用大,不支持全文索引HEAPBOBARCHIVECSV常用的就MyISAM和InnoDB2.myisam和innodb的区别最大的区别就在于事务和锁上myisam不支持事务,适合频繁查询、小数据量、小并发的应用。表锁,不会出现死锁。innodb支持事务,适合插入、更新操作比较多的应用,行锁。3.MySQL数据库,一天五万条左右的增量,预计运维

2022-05-24 15:58:53 370

原创 Java面试——Java本身基础篇(2022-02-15)

1.equals和==运算符的区别==运算符说明对于基本类型和引用类型,==运算符的效果不同,基本的数据类型与基本数据类型的包装体是可以使用==来直接判断值是否相等的,但是包装体与包装体之间的对比不能使用==。基本类型:比较的是值是否相同引用类型:比较的是引用是否相同(指向的内存是否一致)equals说明equals是Objact自带的方法(String与包装体都重写了这个方法),实现了引用类型的值比较2.HashMap 的实现原理JDK1.8之前HashMap使用的是【数组+链表】来实现的

2022-02-10 21:17:21 480

原创 二分搜索树前序遍历非递归写法

使用栈实现非递归的前序遍历二分搜索树,除了根节点root外先入栈右节点,后入栈左节点。package blacktv.tree;import java.util.Stack;/** * 二分搜索树,传入的泛型必须实现Comparable接口,保证具有可比较性 */public class BinarySearchTree<E extends Comparable<E>> { private Node root;//根节点 private Int..

2021-10-08 14:26:10 235

原创 深入理解二分搜索树前中后遍历

前中后序遍历二分搜索树如上图所示,本质是访问本节点的值的时机不一样。

2021-10-08 14:23:55 120

原创 前序、中序、后序遍历二分搜索树(遍历二分树)-java

之所以叫前序遍历是因为先访问左子树,之后遍历右子树,由于前序遍历的输出结果能完整的反应二分树的结构,所以一般使用前序遍历/** * 二分搜索树,传入的泛型必须实现Comparable接口,保证具有可比较性 */public class BinarySearchTree<E extends Comparable<E>> { private Node root;//根节点 private Integer size = 0; /** ...

2021-09-08 10:54:17 232

原创 深入理解二分搜索树前中后遍历-java

前中后序遍历二分搜索树如上图所示,本质是访问本节点的值的时机不一样。

2021-09-06 14:34:49 70

原创 MySQL update语句使用连表(join)

案例1:UPDATE store_out_odd AS a JOIN doc_store_position AS b ON a.`position` = b.`code` AND a.`store_id` = b.`store_id`SET a.`position` = b.id WHERE a.storage_id IS NULL;案例2:UPDATE store_storage AS ssJOIN doc_store_position AS dsp ON ss.`positio

2021-09-03 09:55:43 5282

原创 Java花里胡哨的深拷贝

方法一JSON序列化String json = JSONArray.toJSONString(this);DbValidator dbValidator = JSONArray.parseObject(json, this.getClass());方法二使用流输出并读取ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);o

2021-09-02 16:27:24 146

原创 二分搜索树添加、查询节点-java

叶子结点没有左右节点,有子节点不算叶子节点,根节点没有父节点28>22>16>13 28<29<30<42可以在泛型里添加一条规矩,必须实现Comparable接口,保证具有可比较性public class BST<E extends Comparable<E>> {}二分搜索树添加节点,如果小于根节点则添加到左子树,如果大于根节点添加到右子树。比如...

2021-09-01 10:44:40 231 1

原创 redis可视化客户端推荐-AnotherRedisDesktopManager

之前我用redis一直用黑窗进行连接,查询历史数据的时候,用黑窗查看很不直观。git地址:https://gitee.com/qishibo/AnotherRedisDesktopManager使用截图:

2021-08-31 10:16:51 163

原创 双向链表与双向循环链表

循环链表的末尾指向dummyHead第一个节点是66下面的1代表第二个节点在数组的索引为1的地方,而99这一个节点的下一个节点索引为-1则该节点为最后一个节点。

2021-08-25 10:32:25 78

原创 JAVA 线程中断究竟是个啥玩意

个人对中断的理解:线程中断就是一个信号,当有调用中断方法之后会发送一个中断信号,interrupted()或isInterrupted()的返回值会是true,没有中断信号时interrupted()或isInterrupted()的返回值是false。接收到信号之后,线程是进入执行状态、就绪状态、阻塞状态、还是死亡状态要看你程序怎么写了。你可以自己写一套判断机制,接收到中断信号之后再判断一下线程目前执行的任务到了什么地步,和线程的属性来决定将线程设置成什么状态。如果你自己不写的话,貌似是有系统默认

2021-08-20 10:46:43 367

原创 JAVA 线程Wati使用中出现的问题

首先先声明一点,wiat()方法必须释放CPU资源和锁资源,因此wiat()方法必须在锁里面调用,不在锁里面写就没有锁可释放,没锁资源可释放的话就会抛出异常。有了上述的铺垫我们来看以下代码:package test;/* 主线程测试类 */public class Thread3 extends Thread{ public static void main(String[] args) throws InterruptedException { //创建对象并且

2021-08-20 10:42:26 1082 1

原创 JAVA 不同情况下byte里存储的是什么编码格式

string转成byte[]存成什么?并不一定是ASCII码。1、 在java语言中,String 对象通过方法geBytes()可以获得byte[]对象,它实际上是把内部的char字符,按照平台默认的字符集编码成byte数组,2、 此外,也可以使用getBytes(Charset charset)指定字符集编码。3、 byte[] 既可以理解为数组,它本身也是个对象,在该数组中,每个数组成员都是基础数据类型byte,表达范围是-128 至 127。4、 所以,如果按照uinicode字.

2021-08-20 10:29:19 1858

原创 用单向链表实现队列-Java

本文档编写的队列用的是根据单向链表编写的单向链表改进后编写的。总效果和循环队列是一样的。接口:package blacktv.queue;/** * 实现队列需要完成的接口 */public interface Queue<E> { /** * 入队 * * @param e */ public void enqueue(E e); /** * 出队,并返回出队的元素,如果队列为空则返回n...

2021-08-20 10:25:23 177

原创 用单向链表实现栈-Java

链表的读取、添加、删除第一个节点的时间复杂度是O(1),所以我们可以用链表来实现一个栈,最关键的是不需要考虑栈的大小,所以链表栈会比数组栈时间复杂度会低。接口package blacktv.stack;/** * 栈需要实现的一些接口 */public interface Stack<E> { /** * 入栈 * * @param e */ public void push(E e); /** ...

2021-08-18 14:14:01 967

原创 单向链表-JAVA

如果某个节点的next是null则代表该节点是最后一个节点,属性名为head的为第一个节点。虚拟头结点(dummyHead)对于链表的使用者来说毫无意义,只是为了让头结点固定不改动、实现起来更方便而设计出来的一个概念。实现代码package blacktv.linkedlist;/** * 在008号文档编写的单向列表基础上,为提高在此基础上实现的队列的效率,牺牲了一些删除节点的速度, * 将从末尾添加节点的性能从O(n)提高到O(1)。 */publi...

2021-08-16 10:00:20 110

原创 效率更高的循环队列-Java

数组队列中的出队,在时间复杂度上是O(n)复杂度,因为你删除数组首端,后面的数据都要左移一位。我们可以记录一下队首的索引和队尾索引,入队时队尾索引+1,出队时队首索引-1,当队首索引与队尾索引相等时代表队列空了,完成一次循环。入队五个元素,队尾索引(tail)自增五次出队一个元素则队首索引(front)自增一次。当数组尾部填满的时候不着急扩充,先看看数组首部是不是还有空余,有空余则指向数组首部。此时才不能继续入队,若想要继续入队只能进行扩容,毕竟tail == front

2021-08-13 10:10:55 361

原创 什么是队列以及用数组实现队列-Java

就和我们现实生活中排队一样,队列就是先进先出,从队尾进,从队首出然后使用https://blog.csdn.net/test253506088/article/details/119538593编写的动态数组来实现一个队列ArrayQueuepublic class ArrayQueue<E> implements Queue<E> { private Array<E> array; /** * 传入队列容量上限 ...

2021-08-12 15:28:03 92

原创 什么是栈以及用数组实现一个栈-JAVA

虽然栈操作看起来比数组要简单的多,但对于计算机逻辑来说是非常重要的我们在执行程序的的时候,可能会如下列伪代码一样在方法1里调用方法2,在方法2里调用方法3,执行完毕后一层一层的返回,这就是借助程序调用的系统栈来实现的public void function1(){ System.out.println(function2());}public Integer function2(){ return function3();}public Integer function3...

2021-08-11 14:37:39 113

原创 简单的时间复杂度分析

n是数据规模,O是渐进时间复杂度,描述的是n趋近于无穷的时候的算法用时,所以忽略常数,毕竟在无穷的面前常数可以忽略不计。O(1):算法运行时间是一个常数与数据规模无关O(n):算法运行时间与数据规模是线性关系O(lgn):O(nlogn):O(n^2):算法运行时间与数据规模是平方关系下图第三个算法在数据量小的时候效率高于第二个算法的效率,但是在对复杂度分析时数据量n是趋近于无穷的,所以前两个算法都比第三个算法的效率高。可以利用很多高阶算法的常数比较小的特性,将较小的数据量传给他,这...

2021-08-09 15:17:49 233

原创 JAVA-实现动态数组

数组最大的优点︰快速查询。scores[2]。数组最好应用于“索引有语意”的情况,但是如果索引比较长就还是不要用数组了,比如身份证号,太长了。Java提供给我们的数组是静态数组,大小在一开始就定下来了,所以我们要创建一个动态数组,来满足我们的需求。其实原理挺简单,初次创建的时候赋予一个初始大小,当容量不够用时进行扩容,下列代码最关键的是resize方法public class Array<E> { private E[] data; private Int...

2021-08-09 15:15:24 263

原创 Jsoup清除危险元素和脚本

org.jsoup.safety.Whitelist是个白名单, 定义了什么html元素或者属性可以通过, 而其他的所有内容都将被删除。org.jsoup.safety.Cleaner是清理器,在创建Cleaner对象时告诉他白名单是什么,然后就可以用于请理危险元素和脚本了。如下所示,清理document里的危险元素和脚本。Cleaner cleaner = new Cleaner(Whitelist.relaxed());document = cleaner.clean(document)

2021-08-09 15:06:34 1145 2

原创 JAVA爬虫-Jsoup + JsoupXPath

JsoupXPath是基于Jsoup的拓展,使用路径的形式解析XML和HTML文档。核心类为JXDocument。JsoupXPath的节点对象JXNode不仅可以获取标签节点,还可以获取属性节点。需要在引入Jsoup依赖之后引入JsoupXpath依赖<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <versi

2021-08-09 15:03:09 847 3

原创 Java爬虫-jsoup

jsoup是一款Java的HTML解析器,主要用来对HTML解析。在爬虫的时候,当我们用HttpClient之类的框架,获取到网页源码之后,需要从网页源码中取出我们想要的内容,就可以使用jsoup这类HTML解析器了。可以非常轻松的实现。虽然jsoup也支持从某个地址直接去爬取网页源码,但是只支持HTTP,HTTPS协议,支持不够丰富。所以,主要还是用来对HTML进行解析。#Jsoup地址https://www.open-open.com/jsoup/#在maven中央仓库的地址https:

2021-08-09 14:58:50 695

原创 MySQL触发器

先来看看触发器的创建语法CREATETRIGGER `数据库名`.`表名` BEFORE/AFTER INSERT/UPDATE/DELETEON `qrcode`.`<Table Name>`FOR EACH ROW BEGIN#写你的业务逻辑END看语法,可以知道,触发器是针对某一个表,的新增、更新、删除操作进行提前或者结束的监听,并且做出相应的处理。先来看我写的一个触发器,监听的是insert动作,并且是该insert结束时进行,我统计了本次新增后goods_typ

2021-08-05 11:35:38 94

原创 Mycat根据字符串分库分表

在开发IT610项目的时候遇到了一个需求,Tag表要根据TagName的首字母进行分表分库(如果首字母不是字母则视其首字母为0),一个首字母占一个分片,26个字母+1个其他类型总共27个分片。这里我选择使用枚举分片,rule.xml里应当如下配置(tableRule标签的原名是“sharding-by-intfile”,functin标签的原名是“hash-int”)<tableRule name="tag"> <rule> <columns>letter

2021-07-22 16:31:02 589

原创 水平分表+ER分片

在复杂业务逻辑的时候,会出现B表依赖于A表的情况(B表的外键是A表的主键),比如文章详情表(content_ext)依赖于文章表(content)。当我们对文章表进行水平分表的时候,join操作文章表和文章详情表就会很困难。所以将文章详情表(子表)的记录与所关联的文章表(父表)的记录放在同一个数据分片上,这样在同一个分片上join操作就会容易的多。文章表(content)文章详情表(content_ext)注:content_id为外键文章图片表(content_picture)

2021-07-21 10:14:37 152

原创 Mycat根据取模水平分表

这里使用的是Mycat的取模规则,对主键进行取模,根据取模的结果决定该数据存储到哪个dataNode中。我这里有两个MySQL,一个是本地的,一个是服务器上的,这俩有一张一模一样的user表,如图所示:这里是有两个dataNode,所以取模结果最高是2,在rule.xml里要配置count属性的值为2。这里直接上结果演示,配置文件的内容见案例文件先插入十条数据:然后查询一下,很明显2、4、8、10是一个数据节点里的,1、3、5、7、9是一个数据节点里的。然后去本.

2021-07-19 14:11:57 271

原创 Mycat配置读写分离

Mycat有三个关键的配置文件手头有两个mysql数据库,一个在服务器,一个在本机,都有一个名为mycat2的数据库,里面只有一张user表,本地的mysql里没有数据。先配置schema.xml文件:然后配置server.xml文件:然后启动mycat,在SQLyon里连接mycat,可以看到有一个逻辑库和一张逻辑表,从表里查出的数据正是配置为读操作的服务器上的数据库里的内容。我们往逻辑表user里写入点数据:INSERT INTO `us

2021-07-19 14:07:21 146 1

原创 Mycat的基本概念和主要特性

在APP(应用)里调用的User_DB就是逻辑库,逻辑库是由一个或多个物理库组成,图中分库分表的规则是根据User_id的值取模来决定存入哪个物理库的。在逻辑库里的数据库表叫逻辑表,逻辑库User_DB里有一张逻辑表user_inf,user_inf也是由一个或多个物理库里的数据库表组成。 ...

2021-07-19 14:04:05 74

原创 安装MyCat

MyCat是一直支持分库分表的数据库中间件打开MyCat下载地址,这里选择下载1.6-RELEASE的Windows环境版本。https://github.com/MyCATApache/Mycat-Server #github地址,里面有具体怎么用http://dl.mycat.io #下载地址解压后打开bin目录,双击startup_nowrap.bat后启动mycat,如果没报错就说明启动成功。启动后用数据库连接工具连接一下:默认端口8066默认用户和密码在serve

2021-07-19 14:02:12 72

原创 mysql事务锁

一般来说TRUNCATE TABLE是毫秒级的命令,不会受到数据量的影响,但是当你要TRUNCATE TABLE的表还有事务锁未提交的时候,就会出现TRUNCATE TABLE执行太慢(其实就是无尽的执行,永远不会结束)。#查询当前未提交的事务锁SELECT * FROM information_schema.INNODB_TRX#根据这个事务的线程ID(trx_mysql_thread_id),用kill命里杀死kill 94362之后你再执行TRUNCATE TABLE就立马成功了。

2021-07-19 10:16:40 149 1

原创 解决MySQL不能存储emoji

ALTER TABLE `你的表` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin这其实就是字符集问题,用上述sql将你的表改为utf8mb4,这牵扯到MySQL的utf8并不是真正的utf8,而utf8mb4才是真正的utf8

2021-07-17 17:37:10 61

原创 Java 断点续传以及在线视频播放可选择任一时间播放原理

其实断点续传和视频选择从任一时间开始播放都很简单,本质上都是服务端读取文件的某一个范围返回给客户端,而服务端怎么知道客户端要从哪读到哪,客户端如何知道服务端是否支持断点续传,这就需要了解HTTP的“Range”约定。客户端首次访问资源时,在请求头中携带range:#意味读取从0到文件尾的范围range: bytes=0-Range头域可以请求实体的一个或者多个子范围,例如:表示头500个字节:bytes=0-499 表示第二个500字节:bytes=500-999 表示最后5

2021-07-15 10:42:19 1832 1

原创 SHA256加密

SHA256,是sha家族的一种,还有sha512等等,SHA256算法使用的哈希值长度是256位,其实就是哈希函数package org.wuancake.common.util;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * SHA256 摘要算法工具类 * * @au

2021-07-08 11:40:58 2955

原创 RSA非对称加密

对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算

2021-07-08 11:35:18 105

原创 MD5加密(编码)

MD5加密(编码)做java的太熟悉了,直接丢工具类吧package tool;import java.math.BigInteger;import java.security.MessageDigest;/** * MD5加密的类 * * @author BlackTV * */public class GetMd5 { /** * MD5加密 * * @param password * @return */ public String md5(St

2021-07-08 11:31:36 800

原创 BCrypt加密

BCrypt加密<dependency> <groupId>org.mindrot</groupId> <artifactId>jbcrypt</artifactId> <version>0.4</version></dependency>public static void main(String[] args) throws IOException, URISyntax

2021-07-08 11:30:20 75

原创 Java使用AtomicInteger来实现原子性自增

最近工作比较忙,没啥时间写笔记,丢一个老笔记上来吧。先放出工具类代码:package com.example.demo;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;/** * 使用AtomicI

2021-07-08 11:28:29 9289

空空如也

空空如也

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

TA关注的人

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