- 博客(135)
- 收藏
- 关注
原创 各种树总结
二叉查找树(BST)二叉查找树又叫二叉搜索树、二叉排序树,特点如下:左子树上所有结点值均小于根节点右子树上所有结点均大于根节点节点的左右子树又是一棵二叉查找树二叉查找树中序遍历得到结果是递增排序的节点序列查找从根节点出发,沿一条路径朝叶子节点前进,查找过程中数据比较次数与树的形态密切相关。当树中每个节点左右子树高度大致相同时,树高logN。则平均查找长度与logN成正比,查找的平均时间复杂度在O(logN)数量级上。当先后插入的关键字有序时,BST退化为单支树结构,此时树高n,平均查找
2021-08-30 16:30:10
327
原创 笔试题--醉汉走路
文章目录醉汉走路题目大意解题思路代码实现最少操作次数题目大意解题思路代码实现醉汉走路题目大意给出一个醉汉的初始位置和要走的步数,然后在每一个位置可以等概率的往左走或者右走,当他走到的位置小于0或者是大于60的时候就会掉下悬崖,问着醉汉不会掉下悬崖的概率。解题思路建立一个树结构,每一个节点都有两个子节点,利用树结构来解决。代码实现import java.util.*;class TreeNode { TreeNode left; TreeNode right; int
2021-08-30 14:47:48
588
原创 奇安信笔试题
一、挑选芭蕾舞演员题目大意大概意思就是在给定的一个序列中找出连续增长或者是降低的三个数组,类似于递增子序列,只不过是限定了长度为3,输入:1,5,3,2,4;输出:3。这三个满足条件的值分别是:{1,3,4}、{1,2,4}、{5,3,2}。解题思路代码实现class Solution { List<List<Integer>> ans=new ArrayList<>(); List<Integer> temp=new ArrayLi
2021-08-09 14:12:07
1516
1
原创 牛客(高频)--数组中的第K个最大元素
题目描述返回数组中的第K个最大的元素。解题思路快速排序:主要思想就是通过划分将待排序的序列分成前后两部分,前一部分数据都比后一部分数据小,然后再递归调用函数对两部分序列进行快速排序,以便使整个序列达到有序。划分函数需要一个分界值,然后再进行划分,可以采用随机的方式,即对于区间[l,r]中的数等概率随机一个作为主元,再将主元放到区间末尾,进行划分。整个划分过程主要涉及两个指针i和j,一开始i=l-1,j=l,需要实时维护两个指针,使得任意的时候,对于任意数组下标k都有以下条件成立:l≤k≤i 时
2021-08-06 16:00:04
188
原创 Java的输入输出
文章目录Scanner类常用方法代码Scanner类java.util.Scanner是一个用于扫描输入文本的类。常用方法next()查找并返回来自此扫描器的下一个完整的标记。只读取输入直到空格,他不能读取两个由空格或符号隔开的单词,此外,next()在读取输入后将光标放在同一行中,只读空格之前的数据,并且光标指向本行。nextInt()只读取int值,就是只能读取整数类型的数据,如果输入了非整数数据,就会报错。nextFloat()、nextDouble()也是类似,只能读取符合该类型的数
2021-08-06 11:04:30
113
原创 剑指offer--二进制数中的1的个数
题目大意解题思路一个数减1之后的二进制与该数的二进制区别是最低位1变为0,然后后面的数全部变为1。将这个两个数做与运算的结果是将原数的最低位1以及以后的二进制位都置为0,也就是说将最低位的1变成了0,原二进制数中就会少了一位1,利用这个原理来统计二进制数中1的个数。代码实现public class Solution { public int NumberOf1(int n) { int count=0; while(n!=0){ co
2021-06-04 19:47:48
193
原创 剑指offer--矩阵覆盖
题目大意解题思路动态规划代码实现递归实现:public class Solution { public int rectCover(int target) { if(target<=2){ return target; } return rectCover(target-1)+rectCover(target-2); }}动态规划:public class Solution { pub
2021-06-04 19:33:24
92
原创 Java并发--ThreadLocal详解
ThreadLocal应用最多的是session管理和数据库连接管理。如果我们希望通过某个类将状态与线程关联起来,那么通常在这个类中定义private static类型的ThreadLocal实例。ThreadLocal在每个线程中都创建了副本,所以会对资源造成消耗,内存的占用会比不使用ThreadLocal要大。实现线程隔离主要是用到了Thread对象中的一个ThreadLocalMap类型的变量threadLocals,该变量负责存储当前线程的关于Connection的对象。...
2021-06-02 20:43:32
315
4
原创 剑指offer--从尾到头打印链表
题目大意解题思路非递归(头插法)实现遍历链表,每次在取出一个元素插入ArrayList的0位置。递归实现代码实现非递归(头插法)实现import java.util.ArrayList;public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> arr=new ArrayList
2021-06-02 10:39:49
84
原创 剑指offer--替换空格
题目大意解题思路直接替换使用replaceAll()函数直接将空格替换为%20.分割字符串使用split()函数将字符串进行分割。对字符串中的每个字符进行遍历,如果是空格就使用append()连接一个%20,如果不是就append原来的字符。代码实现直接替换import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * *
2021-06-02 10:28:27
118
原创 剑指offer--二维数组中的查找
题目大意解题思路因为该数组的特点是每一行从左到右递增,每一列从上到下递增,所以我们可以从右上角开始查询,当右上角的数正好等于target的时候就直接返回true,如果是大于target,就去前面一行找小的数,抛弃该列,因为该列都是递增的,不会小于target;反之,如果小于target,就去找下一行,抛弃该行,因为该行前面的数都是比target小的,这样可以使得查询效率提高,时间复杂度是O(行高+列宽),空间复杂度为O(1)。代码实现public class Solution { publ
2021-06-02 09:19:50
74
原创 线程池相关知识总结
文章目录FutureTask简介FutureTask类关系Future接口构造函数Future表示一个任务的生命周期,是一个可取消的异步运算,可将其看做是一个异步操作的结果占位符,它在未来的某个时刻完成,并提供对结果的访问,在并发包中许多异步任务类都继承自Future,其中最典型的是FutureTask。FutureTask简介FutureTask为Future提供了基础实现,如获取任务执行结果(get)和取消任务(cancel)等。如果任务尚未完成,获取任务执行结果时将会阻塞。一旦执行结束,任务
2021-05-31 16:23:04
185
原创 面试题--java实现多线程的几种方式
java实现多线程有哪几种方式?1. 继承Thread用法:继承Thread,重写里面的run()方法,创建实例,执行start()方法。优点:代码编写最简单,直接操作缺点:没有返回值,继承一个类后没法继承其他的类,拓展性差。public class ThreadDemo1 extends Thread { @Override public void run() { System.out.println("继承Thread实现多线程,名称:"+Thread.cu
2021-05-30 11:08:12
206
原创 面试题--接口和抽象类的区别
接口和抽象类的区别抽象类中可以存在普通的成员函数,而接口中只能存在public abstract方法。抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public abstract final类型的。抽象类只能继承一个类,而接口可以实现多个。接口的设计目的是对类的行为进行约束,他只约束了行为的有无,但不对如何实现行为进行约束。抽象类的设计目的是代码复用,当不同的类具有相同的行为,且一部分行为的实现方式一致时,可以让这些类派生于一个抽象类,避免了让所有子类都来实现相同的行为,达到了代码复
2021-05-29 21:38:30
140
原创 面试题--为什么局部内部类和匿名内部类只能访问局部final变量
为什么局部内部类和匿名内部类只能访问局部final变量?首先需要明确一点:内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会随着方法的执行完毕而被销毁。当外部类的方法执行结束时,局部变量就会被销毁,但是内部类对象可能还存在(只有没有人再引用它时才会死亡)。这里就会有一个矛盾:内部类对象访问了一个不存在的变量,为了解决这个问题就将局部变量复制了一份作为内部类的成员变量,这样放局部变量死亡后,内部类仍可以访问它,实际访问的是局部变量的copy,这样就好像延长了局部变量的生命周期。将局部变量
2021-05-29 21:11:01
329
原创 面试题--从JVM角度谈谈staitc为什么不能调用实例方法
从JVM角度谈谈staitc为什么不能调用实例方法首先要了解一下Java的内存结构:静态变量存放在方法区中,并且是被所有线程所共享的。Java堆存放的是我们创建的一个个实例变量。堆区存储的全部是对象,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令)。JVM只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。栈区每个线程包含一个栈区,栈中只保存基本数据类型的对象和自定义对象的的引用,对象本身都存放在堆区中。每个栈中的数据都是私有的,其
2021-05-29 11:06:24
210
2
原创 面试题--集合相关面试题整理
集合整体框架1. List和Set区别List:有序的,按对象进入的顺序保存对象,可重复,允许多个为null的元素对象,可以使用Iterator取出所有元素,再逐一遍历,还可以使用get(int index)获取指定下标的元素。Set:无序的,不可重复,最多允许一个null元素对象,取元素时只能用Iterator接口取得所有元素,再逐一遍历各元素。2. ArrayList和LinkedList区别ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问);扩容机制:因为数组长
2021-05-28 20:28:38
309
3
原创 Cookie和Session详解
文章目录Cookie简介工作原理工作步骤作用缺陷Session简介工作原理Cookie和Session的区别Cookie和Session都是用来跟踪浏览器用户身份的会话方式。Cookie简介HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式web应用程序的实现。举个例子:在网购场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料,最后结账时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户买了什么。为了解决这个问题,就需要使用Cookie。服务器可以设置或读
2021-05-27 20:05:59
169
原创 面试题--String字符串相关
1.String str1="abc";和String str2=new String("abc");有什么区别?方式一是通过字面量的方式来定义字符串的,方式二是通过new+构造器方式。通过字面量的方式,此时数据声明在方法区的字符串常量池中;通过new+构造器的方式,此时数据的保存地址值是数据的堆空间中开辟空间以后对应的地址值。字符串常量存储在字符串常量池中,目的是共享,字符串非常量对象存储在堆中。2. String s=new String("abc");方式创建对象,在内存中创建了几个
2021-05-27 10:46:02
146
转载 数据库(八)--SQL执行过程详解
MySQL驱动在系统和 MySQL 进行交互之前,MySQL驱动在底层帮我们做了对数据库的连接,我们只需要发送 SQL 语句就可以执行 CRUD 了,只有建立了连接,才能有后面的交互。**一次 SQL 请求就会建立一个连接,多个请求就会建立多个连接。**系统中肯定不是一个人在使用的,换句话说肯定是存在多个请求同时去争抢连接的情况。我们的 web 系统一般都是部署在 tomcat 容器中的,而 tomcat 是可以并发处理多个请求的,这就会导致多个请求会去建立多个连接,然后使用完再都去关闭,如下图所
2021-05-26 16:03:52
1931
1
原创 数据库(七)--主从复制和读写分离
主从复制主要涉及三个线程:binlog 线程、I/O 线程和 SQL 线程。binlog线程:负责将主服务器上的数据更改写入二进制日志中。I/O线程:负责从主服务器上读取二进制日志,并切入从服务器的中继日志中。SQL线程:负责读取中继日志并重放其中的SQL语句。读写分离主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作。读写分离能提高性能的原因在于:主从服务器负责各自的读和写,极大程度缓解了锁的争用;从服务器可以使用 MyISAM,提升查询性能以及节约系统开销;
2021-05-26 14:43:53
154
原创 数据库(六)--分表分库
水平切分水平切分又称为Sharding,它是将同一个表中的记录拆分成多个结构相同的表中。当一个表的数据不断增多时,Sharding是必然的选择,他可以将数据分布到集群的不同节点上,从而缓存单个数据库的压力。垂直切分将一张表按列切分成多个表,通常是按照列的关系密集程度进行切分,也可以利用垂直切分将经常被使用的列和不经常被使用的列切分到不同的表中。在数据库的层面使用垂直切分将按数据库中表的密集程度部署到不同的库中,例如将原来的电商数据库垂直切分成商品数据库、用户数据库等Sharding策略哈
2021-05-26 14:27:38
144
转载 数据库(五)--性能优化
使用Explain进行分析Explain用来分析SELECT查询语句,开发人员可以通过分析Explain结果来优化查询语句。比较重要的字段有:select_type:查询类型,有简单查询、联合查询、子查询等。key:使用的索引。rows:扫描的行数。优化数据访问减少请求的数据量返回必要的列:最好不要使用SELECT *语句。只返回必要的行:使用LIMIT语句来限制返回的数据。缓存重复查询的数据:使用缓存可以避免在数据库中进行查询,特别在要查询的数据经常被重复查询时,缓存带来的查询性
2021-05-26 14:09:27
112
转载 数据库(四)--索引
B+Tree原理数据结构B Tree指的是平衡树,是一棵查找树,并且所有叶子节点位于同一层。B+ Tree是基于B Tree和叶子节点顺序访问指针进行实现,它具有B Tree的平衡性,并且通过顺序访问指针来提高区间查询的性能。在B+树中,一个节点中的key从左到右非递减排列。操作进行查找操作时,首先在根节点进行二分查找,找到一个key所在的指针,然后递归的在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子结点上进行二分查找,找出key所对应的data。插入删除操作记录会破坏平衡树的平
2021-05-26 13:59:31
129
转载 数据库(三)--MySQL存储引擎
InnoDB是MySQL默认的事务型存储引擎,只有在需要它不支持的特性的时候,才考虑使用其他的存储引擎。实现了四个标准的隔离级别,默认级别是可重复读,在可重复读的隔离级别下,通过多版本并发控制(MVCC)+间隙锁(Next-Key Locking)防止幻影读。主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。内部做了很多优化,包括从磁盘读取数据时采用可预测性读、能够加快读操作并且自动创建的自适应哈希索引、能够加速插入操作的插入缓冲区等。支持真正的在线热备份。其
2021-05-26 13:09:02
73
原创 面试题--hashCode与equals
hashCode介绍hashCode()的作用是获取哈希码,也被称为是散列码,实际是返回一个int整数,这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object.java中,Java中的任何类都包含有hashCode()函数。散列表存储的是键值对,他的特点是:能根据键快速的检索出对应的值,这其中就利用了散列码。可以快速的找到所需要的对象。为什么要有hashCode?以HashSet如何检查重复为例来说明为什么要有hashCode:对象加入HashSet时,H
2021-05-26 11:01:30
337
原创 面试题--抽象类与接口
区别1. 继承方面抽象类只能单继承;接口可以多实现。2. 成员属性方面:抽象类中可以有普通属性,也可以有常量;接口中的成员变量全部默认是常量,使用public static final修饰,这个可以省略不写。3. 代码块方面抽象类可以含有初始化块;接口不能含有初始化块。4. 构造函数方面抽象类可以有构造函数,但是这是的构造函数不是用来创建对象的,而是用来被实现类调用进行初始化操作的。接口不能有构造函数。5. 方法方面接口在JDK1.8之后可以定义抽象方法(无方法体)
2021-05-26 10:02:17
146
原创 面试题--Java半解释半编译的语言
为什么说Java是一种半解释半编译的程序设计语言?编译型语言:将源程序全部编译成二进制代码的可运行程序,然后,直接运行这个程序。执行效率高、速度快、依赖编译器,跨平台性稍差;但是编译器需要将代码编译成本地代码,需要一定的执行时间,编译成本地代码之后,执行效率高。解释型语言:把已经做好的源程序,翻译一句,执行一句,直到结束。响应速度快,省去编译的时间,立即执行,但是执行速度慢、效率低,依靠编译器,但是跨平台性稍好。Hotspot JVM的执行方式:当虚拟机启动的时候,解释器可以先发挥作用,而不必等
2021-05-26 09:45:58
197
原创 数据库(二)--SQL语法基础
文章目录数据库的创建与使用创建表修改表添加列删除列删除表插入普通插入插入检索出来的数据将一个表的内容插入到一个新表更新删除查询DISTINCTLIMIT排序过滤通配符计算字段函数文本处理日期和时间处理数值处理分组子查询连接内连接自连接自然连接外连接组合查询视图存储过程游标触发器事务管理权限管理创建账户修改账户名删除账户查看权限授予权限删除权限更改密码字符集模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。数据库的创建与使用CREATE DATABASE test;
2021-05-25 20:42:37
168
1
原创 数据库(一)--数据库系统的核心知识点
文章目录事务ACIDAUTOCOMMIT并发一致性丢失修改读脏数据不可重复读幻影读封锁封锁粒度封锁类型封锁协议MySQL隐式与显示锁定隔离级别未提交读提交读可重复读可串行化多版本并发控制版本号隐藏的列Undo日志实现过程1. SELECT2. INSERT3. DELETE4. UPDATE快照读和当前读快照读当前读Next-Key LocksRecord LocksGap LocksNext-Key Locks事务事务是满足ACID特性的一组操作,可以通过commit提交一个事务,也可以使用Roll
2021-05-25 17:21:40
1109
转载 springCloud(七)--Zull路由网关
文章目录入门案例Zull包含了对请求的路由(用来跳转的)和过滤两个主要的功能。路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。而过滤功能则负责对请求的处理过程进行干预,是实现请求校验。服务聚合等功能的基础。Zull和Eureka进行整合,将Zull自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得的。Zuul服务最终还是会注册进Eureka中。入门案例新建springcloud-zu
2021-05-23 18:14:18
131
转载 SpringCloud(六)--Hystrix服务熔断
文章目录服务雪崩HystrixHystrix的作用服务熔断入门案例服务降级服务降级需要考虑的问题自动降级分类入门案例服务熔断和服务降级的区别熔断、降级与限流Dashboard流监控复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免失败。服务雪崩多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的扇出,如果扇出的链路上某个微服务的调用响应时间过长,或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起
2021-05-23 17:00:33
136
转载 springCloud(五)--Feign负载均衡
文章目录使用方法Feign的功能Feign的使用步骤Feign和Ribbon如何选择Feign是声明式Web Service客户端,他让微服务之间的调用变得简单,类似controller调用service,SpringCloud集成了Ribbon和Eureka,可以使用Feigin提供负载均衡的http客户端。使用方法只需要创建一个接口,然后添加注解即可。调用微服务访问的两种方法:微服务名字【ribbon】接口和注解【feign】Feign的功能Feign的目标是使编写Java Ht
2021-05-23 15:58:21
132
转载 springCloud(四)--Ribbon负载均衡
文章目录Ribbon的作用集成Ribbon使用Ribbon实现负载均衡切换或者自定义规则的方法Ribbon是基于Netflix Ribbon实现的一套基于客户端的负载均衡工具。主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon 的客户端组件提供一系列完整的配置项,如:连接超时、重试等。简单的说,就是在配置文件中列出负载均衡后面所有的机器,Ribbon 会自动的帮助你基于某种规则 (如简单轮询,随机连接等等) 去连接这些机器。我们也容易使用 Ribbon 实现自定
2021-05-23 15:29:25
121
转载 SpringCloud(三)--Eureka服务注册中心
文章目录原理理解Eureka基本的架构和dubbo架构对比构建步骤eureka-servereureka-clientEureka自我保护机制注册进来的微服务,获取一些消息(团队开发会用到)Eureka:集群环境配置初始化集群成员相互关联对比和Zookeeper区别CAP原则ACID是什么?CAP是什么?CAP理论的核心作为分布式服务注册中心,Eureka比Zookeeper好在哪里?Zookeeper(CP)Eureka(AP)Eureka是基于REST的服务,用于定位服务,以实现云端中间件层服务发现
2021-05-23 14:48:59
108
转载 springClould(一)--微服务
文章目录微服务架构的四个核心问题解决方案常见面试题微服务架构的四个核心问题服务很多,客户端该怎么访问?这么多的服务,服务之间如何通信?这么多的服务,如何治理?服务挂了怎么办?现代化Java开发构建通过SpringCloud、SpringBoot,协调通过SpringCloud解决方案四个方面:API、HTTP,RPC、注册和发现、熔断机制。Spring Cloud NetFlix:一站式解决方案API:api网关、zuul组件Feign----HtppClient----
2021-05-23 13:27:18
276
转载 SpringCloud(二)--核心组件介绍
文章目录业务场景介绍SpringCloud核心组件:Eureka问题整体流程图过程解析总结Spring Cloud核心组件:Feign问题底层原理SpringCloud核心组件:Ribbon问题原理解析Spring Cloud核心组件:Hystrix问题Spring Cloud核心组件:Zuul总结SpringCloud是一个全家桶式的技术栈,包含了很多的组件,本文从最核心的几个组件入手,来剖析一下其底层的工作原理。业务场景介绍现在要开发一个电商网站,要实现支付订单的功能,流程如下:创建一个订
2021-05-23 13:11:16
84
转载 Spring--依赖注入方式详解
文章目录Spring依赖注入的四种方式构造器注入setter方法注入静态工厂方法注入实例工厂的方法注入总结Spring依赖注入的四种方式构造器注入setter方法注入静态工厂注入实例工厂构造器注入这种方式的注入是指带有参数的构造函数注入,在下面的例子中,创建了两个成员变量SpringDao和User,但是并未设置对象的set方法,所以不能支持setter方法注入方式,该注入方式是在SpringAction的构造函数中注入,也就是说在创建SpringAction对象时要将SpringDao和
2021-05-23 10:53:11
133
原创 Spring--ApplicationContext容器refresh过程
文章目录构造函数:设置配置路径扩展功能源码整体的步骤:具体分析prepareRefresh刷新上下文的准备工作obtainFreshBeanFactory(读取xml并初始化BeanFactory)BeanFactory的后处理激活注册的BeanFactoryPostProcessorBeanFactoryPostProcessor的典型应用:PropertyPlaceholderConfigurer自定义BeanFactoryPostProcessor激活BeanFactoryPostProcessor注
2021-05-20 21:44:11
579
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人