自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 最长重复子数组

给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。public class Solution { public int findLength(int[] A,int[] B){ int[][] dp = new int[A.length][B.length]; int max = Integer

2021-07-13 17:23:26 593

原创 复原IP地址

给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。示例 1:输入:s = "2552551113

2021-05-18 16:30:09 224

原创 买卖股票的最佳时间

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不

2021-05-04 20:05:57 370

原创 线程池ThreadPoolExecutor

一.为什么要使用线程池?两个方面:1. 减少开销 2. 方便管理Java作为高级语言建立在操作系统之上,通过Java程序创建出的用户线程最终其实就是映射到操作系统内核上的内核线程,即每次创建回收线程都需要通过内核调用,开销较大,通过线程池就不必频繁创建回收线程,而是将已创建的线程重复利用起来,也可以防止开发人员无意识的频繁创建线程浪费资源。其次线程池可以维护线程ID、线程状态、任务执行状态等信息,便于管理。二.线程池七大参数corePoolSize 核心线程数,默认情况下一直存活的线程且在

2021-04-28 22:15:04 145

原创 滑动窗口专题

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是

2021-04-20 19:45:37 125

原创 树的代码套路总结

文章开始我先再默念一下口诀,关于树一切的基础你一定要直到:先序:根左右中序:左根右后序:左右根还有更为重要的路线图,如果脑子对遍历路线很清除那递归什么的各种代码也迎刃而解://闲了用手画算了,自己画的太抽象了二叉树的遍历:递归://先序遍历public void preOrder() { System.out.println(this); // 先输出根 if (this.left != null) { //先向左 this.left.preOrder(); } if

2021-04-19 15:40:31 171

原创 二叉树的深度和广度优先

深度优先(借助栈):Depth First Search,对每一个分支路径深入到不能再深入为止,如图所示的二叉树遍历结果为:ABDECFHGprivate static void dfs(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); stack.push(root); while (!stack.isEmpty()) { TreeNode p

2021-04-18 17:14:59 335

原创 最小的K个数

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]解法一:最简单最傻瓜,直接调用库函数排序取前K个class Solution { public int[] getLeastNumbers(int[] arr, int k) {

2021-04-18 16:35:44 291

原创 ReentrantLock详解

1.什么是ReentrantLock?ReentrantLock基于AQS,在并发编程中可以实现公平锁和非公平锁来对资源进行同步,同时,和synchronized一样,ReentrantLock支持可重入,ReentrantLock在调度上更灵活,支持更多丰富的功能。2.Lock接口ReentrantLock实现了lock接口,则它必然具有lock所具有的抽象意义,而在lock的源码注释里,lock的意义在于提供了区别于synchronized的另一种具有更多广泛操作的同步方式,它能支持更多灵活的结构

2021-04-11 18:28:29 1359

原创 常用的十种算法

1.分治与二分查找1.1分治算法介绍分治法即“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……分治算法可以求解的一些经典问题二分搜索大整数乘法棋盘覆盖合并排序快速排序线性时间选择最接近点对问题循环赛日程表汉诺塔1.2分治算法基本步骤分治法在每一层递归上都有三个步骤:

2021-04-11 15:49:39 4959 1

原创 Netty源码分析

从maven导入netty的源码包后,其中example包下的echo包下有一些源码示例,把这些源码拿到自己包下进行运行调试可以探究netty的运行奥秘1.Netty启动过程server端的源码如下:/* * Copyright 2012 The Netty Project * * The Netty Project licenses this file to you under the Apache License, * version 2.0 (the "License"); you ma

2021-04-11 15:49:02 184

原创 Netty核心组件分析

1.Bootstrap和ServerBootstrapBootstrap 即引导,一个 Netty 程序通常由 Bootstrap 开始去配置整个 Netty 程序,串联各个组件,Bootstrap是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类常用方法:方法名称方法介绍public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup)该方法用于服务器

2021-04-11 15:48:45 181

原创 为什么要用Netty以及Netty编程入门

1.原生NIO存在的问题原生NIO有一个最大的问题就是epoll bug,它会导致Selector空轮询,最终导致CPU 占用率100%,直到JDK1.7该问题都没有完全解决,其次NIO模型开发的工作量比较大,需要考虑很多问题如客户端断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理2.Netty的优点netty是JBoss公司出品的一个开源的java网络应用框架,它是基于NIO的主从Reactor模型的同步非阻塞IO1.更安全可靠:支持SSL/TLS协议2.更高效:支持NIO的零拷贝

2021-04-11 15:48:25 163

原创 一.Java支持的三种IO模型

IO 模型1.I/O 模型基本说明I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程 序通信的性能Java共支持3种网络编程模型/IO模式:BIO、NIO、AIO2.I/O模型使用场景分析BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序简单易理解。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。编程比较复杂,JDK1.4开始支持。

2021-04-11 15:47:57 555

原创 HashMap与ConcurrentHashMap

1.HashMap三大重点1.1基本结构HashMap存储的是存在映射关系的键值对,通过计算key的hashCode再对其取模,来确定键值对在数组中的位置,假如产生碰撞则使用链表或红黑树,key最好使用不可变类型的对象,否则对象产生变化时重新计算的hashCode值会与之前不一样导致查找错误。如果采用比较好的哈希算法来运算出的hashCode是比较分散均匀的则查找效率能达到O(1),如果哈希冲突比较强烈,数组将会退化成链表查找效率则会变为O(n),JDK8中做了红黑树的优化,当链表节点大于8个时则会转

2021-04-11 15:46:21 157

原创 Java锁机制

1.什么是锁在并发情况下多个线程会对同一资源进行抢夺从而导致数据不一致性的问题,很多编程语言都会引入锁机制,锁是一种抽象的概念,目的是对资源进行锁定从而达到线程同步的目的2.原始锁synchronized为什么把synchronized叫原始锁,因为它是Java一开始就提供的关键字,它是建立在JVM指令的层命来实现的,我知道很多人也在用lock锁,lock锁是在JDK5后由Doug Lea大师伴随着concurrent包引入的,synchronized的底层实现关键点在于monitor监视及配合mon

2021-04-11 15:44:11 407

原创 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0分三种情况:第一种情况:数组:[1, 2, 3, 4, 5] 1和2旋转后数组尾部,旋转后为:[3, 4, 5, 1, 2]第二种情况:数组:[1, 2, 3, 4, 5

2020-12-14 18:27:09 117

原创 二叉树的深度

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。提示:节点总数 <= 10000其实之前在学习平衡二叉树的时候就已经研究过这个问题了,平衡二叉树其子树的高度是其一个重要信息变量,两个子树的高度差是否超过1决定其是否要进行旋转调整,当时写的

2020-12-13 21:20:12 144

原创 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7即返回 [3,9,20,null,null,15,7]解题是次要的,首先我想说的是,如何确定一颗唯一的二叉树?先序+中序 or 中序+后序 都是可以的,但是先序

2020-12-05 20:13:45 109

原创 青蛙跳台阶以及斐波那契数列

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21示例 3:输入:n = 0输出:1提示:0 <= n <= 100呜呜呜,我只是一只思维简单的青蛙,为什么要问我这么复杂的问题呢,我只直到如果只有1个台阶我直接跳一下就好了,2个台阶我跳两个一下

2020-12-05 20:01:05 536

原创 不用+ - * / 实现加法运算

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2提示:a, b 均可能是负数或 0结果不会溢出 32 位整数我觉得写这个题一定要对原反补码的机制非常熟悉,其实加减乘除本身就是我们人自己的思维,在硬件底层笨猪CPU是没有这么复杂的想法的,首先CPU只有加法,移位和取反三个法则,而计算机底层都是用补码来进行运算的,为什么是补码呢?以减法为例:你可以任意举例,因为我说过CPU没有设计专门的减法运

2020-12-04 17:54:37 274

原创 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6 解释: 节点 2

2020-12-04 16:19:22 243

原创

1.图基本介绍1.1为什么要有图线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时, 这里我们就用到了图1.2图的常用概念顶点(vertex)边(edge)路径无向图(右图)无向图: 顶点之间的连接没有方向,比如A-B,即可以是 A-> B 也可以 B->A路径:比如从 D -> C 的路径有D->B->C 和D->A->B->C有向图:顶点之间的连接有方向,比如A-B,只能是

2020-11-23 18:22:24 469

原创 顺序存储二叉树和线索二叉树

1.顺序存储二叉树1.1顺序存储二叉树的概念1.1.1顺序存储二叉树与数组的转换基本说明:从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。要求:右图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]要求在遍历数组 arr时,仍然可以用前序遍历,中序遍历和后序遍历的方式完成结点的遍历1.2顺序存储二叉树的特点顺序存储二叉树特点:顺序二叉树通常只考虑完全二叉树顺序存储二叉树中第 n 个元素的左子

2020-11-23 18:18:05 365

原创 多叉树(多路查找树)

1.二叉树与 B 树1.1二叉树存在的问题二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题:问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度1.2多叉树的基本介绍在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更

2020-11-23 18:17:30 1601 1

原创 实现strStr()函数

实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needle = "bba"输出: -1说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

2020-11-23 18:16:50 819

原创 BST与AVL

树形结构的实际应用介绍两种树形结构的实际应用,BST和AVL可能相对比较重要,单独放在这里,其实哈夫曼树,堆排序都算树形结构的实际应用1.BST二叉排序树(左小右大的树)1.1二叉排序树需求需求分析:给你一个数列 { 7, 3, 10, 12, 5, 1, 9 } ,要求能够高效的完成对数据的查询和添加。解决方案:1.使用数组1).数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢2).数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到

2020-11-23 18:16:07 1268

原创 MD5与SHA

不管是MD5还是SHA,这一切的根本都是哈希算法,即单向函数MD5全称为 消息摘要算法版本5 (Message Digest Algorithm 5)首先我要强调的是,MD5并不是加密算法,它是一种哈希散列算法。但是其往往可以应用于信息安全方面。MD5其实就是把一串不定长的信息变为定长的信息,实际应用中MD5的值是128bit,也就是任何长度的信息经过MD5的哈希算法最终都会变为128bit的数据。这点与CRC是类似的。例如我以奇偶检验的方式作为哈希算法进行hash:我由原始数据进行分组散列

2020-11-23 18:15:21 2301

原创 二叉树

一.树的常用术语节点根节点父节点子节点叶子节点 (没有子节点的节点)节点的权(节点值)路径(从 root 节点找到该节点的路线)层子树树的高度(最大层数)森林 :多颗子树构成森林二.满二叉树与完全二叉树如果该二叉树的所有叶子节点都在最后一层, 并且结点总数= 2^n -1, n 为层数, 则我们称为满二叉树如果该二叉树的所有叶子节点都在最后一层或者倒数第二层, 而且最后一层的叶子节点在左边连续, 倒数第二层的叶子节点在右边连续, 我们称为完全二叉树三.二叉树的遍历代码思路

2020-11-23 18:14:48 260

原创 JVM垃圾回收

JVM垃圾回收GC原理GC(Barbage Collection )垃圾回收原理:将内存中不在被使用的对象进行回收,GC中回收方法称之为收集器,GC过程是需要消耗一些资源和时间的,考虑GC问题,为了竟可能的缩短GC对应用造成的停顿• 对新生代的对象的收集称为minor GC• 对老年代的对象的收集Full GC• 用户通过System.gc()强制执行的GC为Full GC不同的对象引用类型,GC会采用不同的方法进行会后,JVM对象的引用类型分为四种类型强引用:默认情况,对象采用的均为强引用

2020-11-23 18:14:12 131

原创 JVM参数配置以及Java命令

JVM参数配置JVM参数配置,主要是3种表示方法标准参数(-):所有的JVM实现都必须要实现这些功能的参数,存在向后兼容非标准参数(-X):默认JVM实现这些功能参数,不能保证所有的JVM实现都满足。不能保证兼容非stable参数(-XX):各个居民实现上会有不同,将来可能会随时取消,谨慎使用Java命令Java命令被存放在JDK安装目录的bin目录中JPS:显示所有的java进程pidJPS(Java Virtual Machine Process Status Tool)是JDK1.5提

2020-11-23 18:13:43 864

原创 Spring学习一

Spring的介绍Spring是一个企业级的Java应用开发的框架Spring是一个开源框架,轻量级,基础版本只有2M大小Spring主要使用开发Java应用程序,该框架的目标是使开发的应用更加容易使用Spring的优势:简化Java的开发基于轻量级和最小侵入式开发通过依赖注入和面向接口实现松耦合基于切面进行声明式开发通过切面和模板减少样式代码学习要点:Spring的介绍Spring的IOC介绍(控制反转)Spring的DI介绍(依赖注入)Spring的AOP介绍(横向切面技术)

2020-11-23 18:13:08 265

原创 Spring中的设计模式

Spring中涉及的设计模式Spring中涉及的设计模式主要有:• 简单工厂模式(不算23种之一,只是一种简单的思想8)• 工厂方法模式• 单例模式• 适配器模式• 包装类模式• 代理模式• 观察者模式• 策略模式• 模板模式代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的方法,代理类在运行时创建的代理称之为动态代理在Spring中,AOP就是代理模式的一种实现,在扩展新的功能和方法时不需要去改变类,在SPring中使用JdkDynamicAopProxy(基于JD

2020-11-23 18:12:45 584

原创 JVM

学习内容JVM的基础知识跨平台性、JVM概念、JDK/JVM/JRE、JVM的生命周期JVM的工作过程类装载子系统、运行时数据区域(JMM)、执行引擎内存模型JVM的参数配置Java命令 java javacJVM的调优两个实际问题进行排查JVM垃圾回收垃圾回收算法(4种)、垃圾回收器(7种)JVM的基础知识Java的跨平台性ava中提到跨平台,想到的是JVM,但是能跨平台的是Java程序,而不是JVM。JVM是用C/C++开发的,是编译后的机器码,是不能跨平台,不同的平台需要

2020-11-23 18:09:21 137

原创 Spring MVC学习

目录大纲• Spring MVC的介绍• Spring MVC的运行原理• 各个组件介绍:前端控制器,处理器适配器,处理器映射器,视图解析器• Spring MVC的使用Demo• 处理器和映射器的配置(xml配置和注解)• Spring MVC和Mybatis的整合(SSM整合)• 方法入参和返回值的详解• 图片上传功能(大文件处理的问题:图片,视频,音频)• JSON格式的数据传输• 异常处理机制• RESTFul风格的接口• 拦截器Spring MVC的介绍Java EE体

2020-11-23 18:08:59 577

原创 Mybatis学习二

动态代理Mybatis调用结构:首先在我们的测试代码中创建sqlSession,即SqlSession sqlSession = sqlSessionFactory.openSession();SqlSession是进行CRUD操作需要的会话,接着并没有直接用sqlSession进行操作,而是先去得到一个mapper对象StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);然后再用mapper.操作方法进行操作值得一提的是这

2020-11-23 18:07:59 127

原创 Mybatis学习一

一.Mybatis与其他持久层框架的对比:从最基本的数据库连接框架JDBC说起,JDBC大致五步:编写sql、预编译、设置参数、执行sql、封装结果。JDBC的特点就是功能简单,但sql语句编写在java代码里,是一种硬编码高耦合的方式。对于Hibernte来说,相当于把这5步进行了自动化,消除sql,对于开发者来说相当于黑箱操作,不需要学会JDBC以及Sql操作,只需要把javaBean对象和数据库表的关系处理好就行,但是省心的同时,所有大型项目最后都要牵扯定制Sql,优化Sql,最终要把Sql交给开

2020-11-23 18:07:34 382

原创 SSM整合

回顾mybatis:创建mybatis的全局配置文件,配置数据源信息,配置映射通过读取mybatis的全局配置文件创建sqlSessionFactory实例(会话工厂是需要创建一份就可以了)通过会话工厂创建会话,SQLSession。## 整合思想Spring通过单例方式管理SQLSessionFactoryspring和mybatis整合生成代理对象,使用SQLSessionFactory创建SQLSession,整合自动完成持久侧的Mapper都需要交给Spring管理在mybatis中

2020-11-23 18:06:20 162

原创 JDBC原理详解

JDBC中用到的几个对象:1.DriverManager:驱动管理对象(为什么不说是类呢,因为其中大部分是接口)功能:(1).注册驱动在原码中注册驱动的方法是static void registerDriver(Driver driver),当然也有deregisterDriver用来删除驱动,而实际的代码使用是Class.forName(“com.mysql.jdbc.Driver”),Class.forName方法的作用是初始化给定的类,从JDBC jar包中顺着这个路径可以看到Driver类的

2020-11-23 18:04:22 528

原创 Java多线程—Synchronized关键字底层原理

在说synchronized的相关底层实现我们就简单聊一聊synchronized的用法,其实最常用的就两种方式,直接去修饰一个方法,我们把这个方法叫做同步方法,或者用大括号去修饰一个代码块,当然代码块里的内容就叫做同步代码块 public synchronized void fun(){ //同步方法 //to do } public void...

2020-02-19 19:05:32 1443

空空如也

空空如也

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

TA关注的人

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