自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于位运算的总结

基础:计算机中数据的存储是以二进制形式保存的,其中负数是以补码的形式存储。最高位表示符号位:0表示正,1表示负正数的原码、反码、补码相同;负数的反码为原码符号位不变,数值位按位取反,补码是反码加1.进制转换:十进制转 x 进制,直接除x取余。任何十进制都可以使用多个不同的2的x次幂组成,因为本身就可以用二进制表示。关于移位:<<:左移运算符,num << 1,相当于num乘以2>>:右移运算符,num >> 1,相当于num

2021-09-21 10:25:50 169

原创 绿盟Java面经

1、自我介绍2、项目相关账号激活实现为什么使用前缀树做敏感词过滤Redis持久化Kafka怎么保证消息不丢失和重复消费Elasticsearch使用线程池使用情景3、微服务理解4、注册中心5、服务调用6、实际情景中sql慢怎么排查和解决问题7、索引失效?8、为什么使用B+树不使用二叉树或其他数据结构?9、海量数据获取最大的前100个元素?除了最小堆还有什么方式?桶的思想,拆分成多个小组,每组排序得到最大的前100个元素,然后利用归并的思想。

2021-08-30 17:22:22 276

原创 IDEA设置文件编码格式

文件字符编码自定义异常状态码和提示信息时,创建的properties文件的字符集如果不是utf8,则返回的提示信息在测试时或者返回给前端就会出现乱码,此时可以更改idea的编码格式。

2021-08-30 11:48:14 1531

转载 一道题理解二进制子集枚举与状态压缩

相关理论1、二进制子集枚举对于一个二进制数,其子集指的是对于原二进制数中1的选择,如对于一个二进制数01101,有三个1,则有8个子集,分别为01101,01100,01001,00101,01000,00100,00001,00000。方法一:暴力枚举// m => 总状态数for (int i = 1; i < m; i++) { // 从 [1, i] 就可以了,后面的一定不会是 i 的子集 for (int j = 1; j <= i; j++)

2021-08-30 11:18:58 397

原创 远景Java面经

1、谈谈ThreadLocal2、线程池原理3、Java内存区域4、新生代、老年代设计新生代为什么设计成eden、survivor区?5、GCRoots6、Java的两种锁synchronized锁升级过程ReentrantLock底层。7、AQS8、Nacos基础架构9、分库分表逻辑10、Fegin的优势11、事务的隔离级别为什么现在公司一般把隔离级别设置成读取已提交。...

2021-08-27 22:28:25 154

原创 List和数组的相互转换

List转数组:List<Integer>list=new ArrayList<>();Integer[] arr=new Integer[list.size()];list.toArray(arr);数组转list:Integer[] num=new Integer[]{1,2,3};List<Integer> list=Arrays.asList(num);注意:因为集合里面的数据类型只能是包装数据类型,所以int类型数组先转为包装类型的数组

2021-08-11 22:00:12 663

原创 String类型、Integer类型的数组转为int类型数组

将String类型和Integer类型的数组转为int类型的数组,一种方法是通过for循环的方式,另一种就是利用java8的stream。String类型的数组转为int类型的数组:String[] numstr=new String[]{"1","2","3"};int[] num= Arrays.stream(numstr).mapToInt(Integer::valueOf).toArray();Integer类型的数组转为int类型的数组:Integer[] numIntege

2021-08-11 21:40:08 5969 1

原创 自动装箱和自动拆箱

基本数据类型转换为包装数据类型时,叫做装箱;包装数据类型转换为基本数据类型时,叫做拆箱;基本数据类型和包装类型的一个区别就是初始值不一样,如int的初始值为0,而Integer的初始值为null。自动装箱和自动拆箱:Integer total = 99; //自动装箱执行上面那句代码的时候,系统为我们执行了: Integer total = Integer.valueOf(99);int totalprim = total; //自动拆箱执行上面那句代码的时候,系统为我们执行了:

2021-08-11 21:23:35 114

原创 向上转型和向下转型

1、父类引用指向子类对象,而子类引用不能指向父类对象。2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换,如:Father f1 = new Son();3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换举例:// 父类引用指向子类对象Father f1 = new Son(); // 这就叫 upcasting (向上转型)// 指向子类对象的父类引用赋值给子类引用,此时父类引用f1还是指向子类对象So

2021-08-11 18:28:22 84

转载 一致性哈希算法原理及应用

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。.

2021-08-11 16:27:15 319

原创 Java输入输出

书籍:Java数据结构和算法(第二版) Robert Lalore著一、综述private关键字修饰的字段,只能在同一个类中访问,例如在main()中创建了对象,不能通过对象访问被private修饰的字段,只能访问对象中提供的public方法。赋值:对象2=对象1,表示对象2拷贝了对象1指向的存储地址,对象2和对象1实际上指的是同一个对象。参数传递:简单数据类型是值传递;对象是以引用的形式传递,即创建的对象和传递的参数都指向同一个对象。==和equals:==判断类的引用是否一致,equ

2021-08-11 16:24:00 66

原创 图解系统学习笔记

一、硬件结构1.1CPU是如何执行程序的?冯 诺伊曼模型:内存:存储程序和数据,存储区域是线性的,最小的存储单位是字节,1字节等于8位。中央处理器(CPU):32位和64位CPU最主要区别在于一次能计算多少字节数据。如32位CPU一次能计算4个字节,计算的最大整数是2^32;其次32位CPU最大只能操作4GB的内存,而64位CPU的寻址范围理论为2^64。CPU内部的一些组件,控制单元负责CPU工作,逻辑运算单元负责计算,寄存器主要存储计算时的数据(通用寄存器,用来存放需要进行运算的数据

2021-08-11 15:57:18 1246

原创 SQL union和union all操作符总结

union操作符用于合并两个或多个select语句的结果集。union内部的select语句查询字段的数量、数据类型以及顺序必须相同。union不允许值重复,输出的的不重复的值。SELECT column_name FROM table_name1UNIONSELECT column_name FROM table_name2union all和union命令几乎等效,union all会列出所有的值,允许重复。SELECT column_name FROM table_name

2021-08-11 11:01:39 137

原创 SQL查询优先输出某结果,其他正常输出

查询sutdent表中的学生信息(name、age),其中age在20到30之间的优先输出,其他正常输出。前置知识:case whenselect name,age, (case when age between 20 and 30 then 0 else 1 end)remarkfrom studentorder by remark;...

2021-08-10 20:57:03 2678

原创 一文弄懂拓扑排序

原理:在一个有向图中,对所有节点进行排序,要求没有一个节点指向它前面的节点。通过邻接矩阵或邻接表建图后,统计所有节点的入度,分离出入度为0的节点,然后把这个节点指向的节点的入度减1,直到所有节点都被分离。例如下面(a)图的一种拓扑排序过程:应用:思路:对队伍排名进行拓扑排序。import java.util.*;public class Main{ public static void main(String[] args){ Scanner ci..

2021-08-10 10:38:08 110

原创 @ControllerAdvice注解实现统一异常处理

@ControllerAdvice注解,可以对Controller中被 @RequestMapping注解的方法加一些逻辑处理。最常用的就是异常处理。具体使用1、定义异常处理类,可以返回json格式数据或者跳转到错误页面返回json数据:@ControllerAdvicepublic class CustomExceptionHandler { @ResponseBody @ExceptionHandler(value = Exception.class) pu

2021-08-05 18:20:23 388

原创 I/O模型详解

一、前置知识:为了确保操作系统的安全稳定运行,操作系统启动后,将会开启保护模式:将内存分为内核空间和用户空间,进行内存隔离。应用进程运行在用户空间;内核进程运行在内核空间。用户空间无法直接操作内核空间,只能通过操作系统向外提供的API,发起系统调用。所以应用进程并不能像操作系统内核一样直接进行I/O操作,而是通过向内核发起系统调用完成对I/O的间接访问,一次IO操作实际包含两个阶段:IO调用阶段:应用程序进程向内核发起系统调用 IO执行阶段:内核执行IO操作并返回 2.1. 准备数据

2021-08-05 11:48:33 245

原创 Dijkstra(迪杰斯特拉)算法求单源最短路径

算法思想:将所有节点分成两类:已确定从起点到当前点的最短路长度的节点,以及未确定从起点到当前点的最短路长度的节点(下面简称「未确定节点」和「已确定节点」)。每次从「未确定节点」中取一个与起点距离最短的点,将它归类为「已确定节点」,并用它「更新」从起点到其他所有「未确定节点」的距离。直到所有点都被归类为「已确定节点」。用节点 A「更新」节点 B 的意思是,用起点到节点 A 的最短路长度加上从节点 A 到节点 B 的边的长度,去比较起点到节点 B 的最短路长度,如果前者小于后者,就用前者更新后者。

2021-08-02 11:48:55 269

原创 一文搞懂回溯(Backtracking)

Backtracking(回溯)属于DFS。普通DFS主要用在可达性问题,这种问题只需要执行的特定位置然后返回即可。回溯主要用于求解排列组合问题,这种问题在执行到特定位置返回之后还会继续执行求解过程。实现:在访问一个新元素进入新的递归调用时,需要将新元素标记为已经访问,在递归返回时,需要将元素标记为未访问。应用:思路: 对于这类寻找所有可行解的问题,我们都可以尝试用 搜索回溯 来解决。class Solution { //存储结果 List<List&lt

2021-07-23 10:36:18 233

原创 Java日志框架SLF4j、logback、log4j区别

slf4j是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可。注意它只是一个几口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统如log4j、logback、java.util.logging等,他们实现了具体的日志系统的功能。使用slf4j可以做到多种日志工具的切换使用。logback:实现了slf4j的接口。使用时通常引入xm...

2021-07-22 21:53:11 174

原创 一文搞懂深度优先搜索(DFS)

一、原理深度优先搜索再得到一个新节点时立即对新节点进行遍历,从节点 0 出发开始遍历,得到到新节点 6 时,立马对新节点 6 进行遍历,得到新节点 4;如此反复以这种方式遍历新节点,直到没有新节点了,此时返回。返回到根节点 0 的情况是,继续对根节点 0 进行遍历,得到新节点 2,然后继续以上步骤。从一个节点出发,使用DFS对一个图进行遍历时,能够遍历到的节点都是从初始节点可达的,DFS常用来解决这种 可达性 问题。实现:递归栈(保存当前节点信息,当遍历新节点返回时能继续遍历当前节点)、标记

2021-07-22 12:25:53 414

原创 递归和迭代两种方式求二叉树遍历

二叉树的前序遍历:根 左 右递归class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer>res=new ArrayList<>(); preorder(root,res); return res; } public void preorder(TreeNode root,Lis

2021-07-21 19:30:19 80

原创 一文搞懂广度优先搜索(BFS)

1、原理:广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历地结果作为起点,遍历一个距离能访问地所有节点。遍历过的节点不能再次被遍历。每一层遍历的节点都与根节点的距离相同。设di表示第i个节点与根节点的距离,推导出一个结论,对于先遍历的节点i与后遍历的节点j,有di<=dj。利用这个结论,可以求解最短路径等最优解问题:第一次遍历到目的节点,其所经过的路径为最短路径。实现BFS:队列(用来存储每一轮遍历得到的节点);标记(对于遍历过的节点,应该将它标记,防止重复遍历)。2、

2021-07-21 11:39:39 1610

原创 线段树的原理和应用

一、原理简介:假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点。线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是O(log2(n))。线段树的原理就是,将[1,n]分解成若干特定的子区间(数量不超过4*n,),然后,将每个区间[L,R]都分解为少量特定的子区间,通过对这些少量子区间的修改或者统计,来实现快速对[L,R]的修改或者统计。结构:对于A[1:6] = {1,8,6,4,3,5}来说,线段树如下所示,红色代表每个

2021-07-20 11:17:52 392 2

原创 一道题理解DP优化

思路与算法:class Solution { public long maxPoints(int[][] points) { int m=points.length,n=points[0].length; int[][] record=new int[m][n]; for(int i=0;i<m;i++){ System.arraycopy(points[i],0,record[i],0,n); ...

2021-07-20 10:16:15 52

原创 树状数组的原理与应用

一、原理简介:「树状数组」是一种可以动态维护序列前缀和的数据结构,它的功能是:单点更新 update(i, v): 把序列 i 位置的数加上一个值 v区间查询 query(i): 查询序列 [1⋯i] 区间的区间和,即 i 位置的前缀和修改和查询的时间代价都是 O(logn),其中 nn 为需要维护前缀和的序列的长度。结构:上图中黑色数组是原来的数组,用A代替,红色数组是我们的树状数组,用C代替,由图可知C[1] = A[1]...

2021-07-16 14:26:33 80

原创 Java集合之TreeSet和TreeMap

一、TreeSetTreeSet和Collection:简介:TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, java.io.Serializable接口。TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。

2021-07-14 18:27:50 765

原创 Java中的拷贝

1、System.arraycopy()源码:public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);可以看出它是一个本地方法,所以效率比较高。src:源数组 srcPos:源数组要复制起始的位置 dest:目的数组 destPos: 目的数组放置的起始位置 lengt.

2021-07-14 16:06:36 1950

原创 快速幂问题

class Solution { public double myPow(double x, int n) { long N=n; if(N<0){ return pow(1/x,-N); } return pow(x,N); } public double pow(double x,long n){ double res=1.0; while(n&gt...

2021-07-13 12:43:11 78

原创 Xshell下载、安装和使用

1、下载进入Xshell官网点击Download后点击Download后选择XSHELL后,点击DOWNLOAD点击箭头处后输入相关信息后点击,DOWNLOAD,然后点击邮箱收到的链接下载。2、安装找到下载好的文件双击后选择自己的安装目录安装成功。3、使用新建会话确定后点击创建的会话输入用户名输入密码连接成功4、Xshell上传文件到服务器...

2021-07-12 17:25:23 451

原创 Arrays.sort()和Collections.sort()的比较

1、Arrays.sort()源码: public static <T> void sort(T[] a, Comparator<? super T> c) { if (c == null) { sort(a); } else { if (LegacyMergeSort.userRequested) legacyMergeSort(a, c);

2021-06-28 16:55:19 445 1

原创 Comparable接口和Comparator接口比较

1、Comparable接口Comparable定义在Person类的内部,实现了compareTo方法 private static class Person implements Comparable<Person>{ int age; String name; public Person(String name, int age) { this.name = name; this.age = age; } publ

2021-06-28 16:44:03 114

原创 linux实践

1、Linux命令连接符‘|’:在Linux中作为管道符,将‘|’命令前的输出作为‘|’命令后的输入。‘||’:用双竖线’||'分割的多条命令,代表的是或者,执行的时候遵循如下规则,如果前一条命令为假,则继续执行后面的命令,如果前一条命令为真,则后面的命令不会执行。‘&&’:可同时执行多条命令,代表的是且,当碰到执行错误的命令时,将不再执行后面的命令。如果一直没有错误的,则执行完毕。‘&’:同时执行多条命令,不管命令是否成功。通过命令连接符,我们就可以同时使用多条

2021-05-28 17:18:38 63

原创 Git学习与使用

1、Git

2021-05-28 17:18:00 55

原创 Java1.8新特性之流式计算

一、lambda表达式lambda表达式本质上是一个匿名方法。注:匿名方法时没有方法名的方法,如{ System.out.println("这是一个匿名方法");}组成:参数列表、箭头、表达式或语句块。二、函数式接口只包含一个抽象方法的接口。Java函数式接口:java.util.function.Consumer,包含有一个有输入而无输出的accept接口方法。还有一个andThen方法,指定在调用当前Consumer后是否还要调用其它的Consumer方法。

2021-05-28 17:17:29 237

原创 JavaSE基础概念总结

栈帧栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用至执行完成的过程,都对应着一个栈帧在虚拟机栈里从入栈到出栈的过程。JVM执行引擎运行的所有字节码指令都只针对当前栈帧(位于JVM虚拟机栈栈顶的元素)进行操作。如果当前方法调用了其他方法,或者当前方法执行结束,那这个方法的栈帧就不再是当前栈帧了。调用新的方法时,新的栈帧也会随之创建。并且随着程序控制权转移到新方法,新的栈帧成为了当前栈帧

2021-05-28 15:31:56 69

原创 算法思想:双指针

双指针:主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。class Solution { public int[] twoSum(int[] numbers, int target) { int i=0,j=numbers.length-1; while(i<j){ int temp=numbers[i]+numbers[j]; if(temp<target){

2021-05-25 22:15:11 104

原创 剑指 Offer 68. 二叉树的最近公共祖先

思路:二叉搜索树的性质,左子树中的值都小于根结点的值,右子树中的值都大于根结点的值,假设求p、q两个结点的最近公共祖先,首先判断当前结点值与p、q两个结点值的大小,如果当前节点的值都大于p、q两个结点值,则递归遍历当前节点的左子树,如果当前节点的值都小于p、q两个结点值,则递归遍历当前节点的右子树,否则,p、q两个结点值位于当前节点两侧,直接返回当前节点。class Solution { public TreeNode lowestCommonAncestor(TreeNode root...

2021-05-10 20:16:24 70 1

原创 前缀和+单调栈:5752、子数组最小乘积的最大值

思路: 理解一个概念,当最小值确定后,连续子数组要尽可能地长,得到的是指定连续数组最小值后最小乘积的最大值。首先求出数组的前缀和数组,用于计算任意两个索引之间元素的和,然后假设数组中的每一个元素都可以作为连续子数组中的最小值,维护left和right两个数组,分别存放左边比当前元素值小的第一个元素索引,右边比当前元素值小的第一个元素索引,该过程使用单调栈求解,最后以原数组中每个元素为最小值,通过left数组和right数组求得连续数组的最小乘积,取结果最大的即可。class Solution {..

2021-05-09 19:17:18 119 1

原创 桶排序:451、根据字符出现频率排序

思路:首先使用HashMap数据结构统计每个字符的频率,然后建立长度为字符串长度+1的桶,桶中的元素定义为List,用来存储相同频率的字符。最后从后往前遍历桶,返回排序后的字符串。class Solution { public String frequencySort(String s) { //统计每个字符的出现频率 Map<Character,Integer>hashmap=new HashMap<>(); for..

2021-05-07 10:42:01 100

空空如也

空空如也

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

TA关注的人

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