07 2023 档案
摘要:public int gcd (int a, int b) { int mode = a % b; if(mode == 0) { return b; } return gcd(b, mode); }
阅读全文
摘要:描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 数据范围:1 \leq n \leq 401≤n≤40要求:时间复杂度:O(n)O(n) ,空间复杂度: O(1)O(1)示例1输入:2返回值:2说明:青蛙要跳上两级台阶有
阅读全文
摘要:事务是一组操作,有四个特性(acid),原子性(一起成功,一起失败)、一致性(事务的执行结果符合串行执行的结果)、隔离性(事务之间互不影响)、持久性(要有持久存储数据的介质)。 一般任何包含事务操作的软件,操作日志有很重要的保证功能,通常数据写入和日志写入是多个线程执行的,如果数据写入时出错,可以通
阅读全文
摘要:有时候根据不同的要求,算法的目的可能是计算特定值,也可能是返回某个要求的全部可能的值。 递归就是完全不去控制执行过程的一种算法,如果返回全部可能的值,就极大可能重复执行之前的已有操作。 动态规划则是利用一种数据结构,通常可能是列表,保存中间运行的值,减少已经执行的运算,或者根据列表内容剔除将要执行的
阅读全文
摘要:通常关注时间复杂度, 对于常数阶和循环次数不变的时空复杂度,就不过多介绍了。 递归的时间复杂度: 对于只调用一次自身且递归次数程常数阶减少的递归,比如: void fun(int n) { if(n == 0) { return; } n--; return fun(n); } 它的时间复杂度是O(
阅读全文
摘要:Class.class 的形式会使 JVM 将使用类装载器将类装入内存(前提是类还没有装入内存),不做类的初始化工作,返回 Class 对象。Class.forName() 的形式会装入类并做类的静态初始化,返回 Class 对象。getClass() 的形式会对类进行静态初始化、动态初始化,返回引
阅读全文
摘要:使用的jdbc api是不一样的,#使用的是preparedStatement能一定程度防止sql注入 不能混用,否则会当成$拼写sql 不能杜绝sql注入,因为有些符号放在sql引擎那里执行还是会产生转义,依然 可以注入
阅读全文
摘要:java进行类加载时会先委托父类加载器进行加载 为什么这样 1、确保类唯一性,防止重复加载,因为从底层往上加载你肯定先使用父类加载器 2、保证核心api不被篡改,因为你写一个跟java核心api一摸一样的类,还使用自定义加载器,就会把java自己写的类改掉。(除非你连jvm一起改)
阅读全文
摘要:这种问题每个人经历不一样一般回答是不一样的, 通常要回答出两点,一个提现技术,二要提现设计上的优化思路,(其实这种问题已经有点想骗作业的嫌疑了,只不过没有指明具体场景)可以分两次回答两个不同场景,如果偏管理的话,还需要回答第三点对项目的总体设计及管理思想。 一般回答分布式的细节操作比较加分,比如我自
阅读全文
摘要:基本数据结构 数组、链表和红黑树,链表长度大于等于8转化红黑树,链表长度小于等于6退化成链表,中间隔一个7是为了防止数据结构频繁转化,扩容因子0.75 初始化方法 put方法 第一步封装Node节点,key和value都在里面 否则 直接hash运算得到数组下标,把值放进去 如果 达到扩容的阈值,先
阅读全文
摘要:qps 每秒查询数量 tps 每秒事务数量 吞吐量 runnerGo和metersphere
阅读全文
摘要:饿汉式 直接public static final SingleInstance instance = new SingleInstance 懒汉式 double check 加 volatile 延迟加载(属于懒汉式) 静态内部类的方式,这个也行且属于懒汉是因为java一定会等类加载并且这种加载本
阅读全文
摘要:1、它其实spring公布的微服务开发的一套模式或者说规范 2、比如通常来说,它规定包含 注册中心、网关、配置中心这套基本组件, 它还需要rpc远程调用组件包括feign、dubbo、grpc等等,以及他们的负载均衡策略和熔断措施 3、它还可以包含健康度监控、性能监控和链路追踪等等
阅读全文
摘要:这问题还真不是很好答,我准备几个大家可以去看看: 1、关于数据权限的统一配置和处理方式 第一种,简单方案,针对具体场景,比如项目成员配置,用的项目id加成员id的方式,再用拦截器经过对应controller都提前进行校验;然后为什么没用mybatis的插件修改实际执行sql,因为这个查询实在过于频繁
阅读全文
摘要:使用区别 stram流无法中断和跳过,可以抛异常中断但是不优雅,可以filter实现类似跳过,但其实是靠判断(判断还是会走完整个循环体),不是continue 引入外部变量必须是final的 实际上是逆反了面向对象思想的编码方式
阅读全文
摘要:1、快速可搭建的脚手架,少量配置,约定优于配置,不用像ssm那样增加复杂的配置文件 2、这种方式使程序员更加集中于业务代码的编写,而不用关注部署和容器配置的问题 3、约定优于配置也不是任何场景都适用,主要还是免去了servlet的配置 4、内置tomcat直接启动
阅读全文
摘要:核心线程数 初始化的时候不会创建,第一个任务过来才按照这个参数生成线程 最大线程数 阻塞队列满了才会使用它,超过它触发拒绝策略 空闲时间 超过空闲时间,线程数降低到核心数目 时间单位 空闲时间的单位 线程工厂 一般默认,可以指定线程名称、线程组之类的参数 阻塞队列 一般需要修改为有界队列,超过核心线
阅读全文
摘要:感觉网上很多博客对这个的解释实在太官方了,也没说为什么一定要实现序列化接口。 去看看rpc框架源码,或者java网络编程或者向磁盘进行序列化就知道了。 首先这是个标记接口,就是用来告诉程序某某对象是可序列化对象,像dubbo框架,要传输对象就必须序列化。 网络编程已经告诉你了,想要向另一个网络输出的
阅读全文
摘要:第一种,@EnbaleConfigurationProperties、@ConfigurationProperties组合 第二种,@Value 第三种,spring提供的Environment对象 第四种,直接读配置文件进行分析
阅读全文
摘要:有一篇讲了mvcc的基本原理:https://www.cnblogs.com/benjerry/p/17551031.html 这样就知道最简单的死锁产生原因,就是有两个并发事务,事务1先更新a表某行数据,再更新b表某行数据,事务2先更新b表同行数据,再更新a表同行数据,就非常有可能死锁了。这种易检
阅读全文
摘要:线程本地变量, 基本原理 底层维护一个ThreadLocalMap,key是线程引用,value是我们要设置的变量,使用时需要记得remove防止内存泄露
阅读全文
摘要:光谈论方式的话,太多了,数据库、jvm内存、redis、zookeeper都可以,最常用的是基于redis实现的redission框架 核心原理众多博客讲的很清楚,面试说个大概应该没问题了 第一点,用的reids的setex命令,因为这个命令是原子操作,不会在设置锁的过程中出现意外 第二点,锁过期问
阅读全文
摘要:使用同一把锁的同步代码块分布在两个方法,或者地方,其中一个一个方法调用另一个同步方法不会被阻塞
阅读全文
摘要:拿rabbitmq举例吧 它有两种方案,一个是开启事务,但这种会降低性能; 还有种异步confirm机制,在生产者这边,mq消息成功消费后会有一个异步回调,所以通常会用这个模式。 光做这个常规情况下够了,如果考虑宕机,还有其他极端情况,要开启持久化,和使用数据库记录消息流水。 另外mq自动的ack只
阅读全文
摘要:用法: synchronized修饰代码块或者方法,不需要手动释放,默认非公平 ReentrantLock需要手动调用,手动释放,能够控制公平机制,能够尝试获取和超时获取锁,能更好的控制锁行为,在需要通过线程提高性能的场景中,能比较好的操控 基本原理: synchronized是靠管程(monito
阅读全文
摘要:这种问题的话,肯定是要提前设置好缓存的 第二要有相对严格的双写一致策略,只要数据库数据发生变化,就要主动更新缓存,可以用binlog,代码层面可以用读写锁限制写的请求 第三要使用定时任务固定刷新 第四要有判空操作,一般的缓存使用,如果不存在的key,可能会前往db进行查询,可以打破这一规则,至于用什
阅读全文
摘要:常见操作系统的线程状态是五种 创建 --> 就绪 --> 运行 -> 阻塞 --> 终止 java中定义了六中,主要是依据锁的行为 create --> runnable --> waiting --> time_waiting --> blocked --> terminate java中的run
阅读全文
摘要:为什么不推荐stop 主要它不释放锁资源,尤其暴力终止,可能会导致业务执行到一半,出现各种问题。 为什么使用interrupt方法 通常使用自带的方法,而不是使用自定义的业务标识,是因为interrupt能修改线程状态,java线程的终止,需要从runnable终止。如果仅仅使用自定义的终止标志,有
阅读全文
摘要:1、默认是RDB方式,就是每隔1秒钟,直接把数据持久化到磁盘,数据量大的时候,可能就会卡顿,但是这种持久化实际上是异步的,但是也不能完全依赖系统性能 2、AOF记录命令的方式,这种在启动的时候可能导致cpu飙升 3、混合方式,在RDB的时候,有新数据进来就采用AOF方式记录 需要去调整nginx配置
阅读全文
摘要:问这种东西其实也算纯八股文了 数据库处理并发事务的普遍参考或者协议吧 及其类似 java 的读写锁 假设现在有多个请求并发来到数据库,请求如下:读、读、读、写、读、读、写、写、读、读 1、读-读:这个不存在任何问题 2、读-写:写会阻塞读 3、写-写:写也会阻塞写 4、写-读:读不会阻塞写 查询bi
阅读全文
摘要:1、最常用用来当缓存使用,最常见缓存的是用户数据,毕竟基于spring security开发的话,默认的用户缓存方式就是直接jvm内存和外部缓存两种 2、有些签到、排行榜功能会用, 签到使用位图,因为用户数据量极大的时候用数据库记录存不太合适,签到数据也是几何倍数增长,但是其实数据库也能实现这种位图
阅读全文
摘要:1、先使用一些集成测试插件(比如jmeter、metershpere)或者脚本定位到慢速接口,也可以通过日志分析cat | grep 2、使用sonar、findbugs之类的插件定位复杂度较高的代码,(分析一下算法复杂度和空间复杂度)以及sql调用部分的代码 3、先将调用的sql放到mysql上运
阅读全文
摘要:和udp的区别 定义上来说,tcp是面向连接的、安全的、可靠的协议;udp是面向数据报的、不可靠的协议。 从本质上来说,就是tcp每次建立和断开连接,都要进行握手和挥手,客户端每次传送数据包,都会收到服务端的ack确认,还有报文缺失、超时的重传机制。 udp是没有这些握手和确认机制的,所以udp不保
阅读全文
摘要:1、现在多数项目都是前后端分离,nginx代理静态资源的性能比tomcat之类的服务器要好 2、如果存在多实例的服务,nginx可以充当代理,进行负载均衡(轮询、ip_hash、最少连接数之类的) 3、如果静态网页需要调用多个服务,nginx可以设置多个代理服务且不会造成跨域
阅读全文
摘要:说实话,如果问这种问题,有点纯八股文面试的感觉了,因为原理完全不是java语言实现的,知道了也没什么用 首先得知道标量替换和逃逸分析,以及垃圾回收发生阶段 标量替换是需要开启的(jdk1.7之后标量替换和逃逸分析是自动开启),就是把一个对象分割成不可替换的基本类型,基本类型都在栈上创建,替换条件没深
阅读全文
摘要:1、使用Thread或其子类 2、实现Raunnable接口 3、实现Callable接口,它初始化时接收一个Feature对象 启动线程的方式一般两种,直接调用start(不推荐业务中使用,除非能很确定的预判创建数量),或者丢到线程池中
阅读全文
摘要:IoC控制反转,指spring有一个容器,帮助我们创建和管理bean的生命周期,不需要显示的进行new和编写控制这个bean状态的代码,效果就是很好地解耦了一些业务逻辑上的关联性。 DI依赖注入,其实和控制反转描述的是同一件事,只是从另一个角度上的描述,spring帮助我们管理bean之后,我们就可
阅读全文
摘要:1、面试官问,有没有什么方式线程执行完了主动通知主线程或者另一个线程? 观察者模式 java和spring配合,通过父子继承的方式还能实现一种奇怪的通知,关键点就是@PostConstruct这个注解,那么父类和子类都有注入spring容器的注解的话,父类中调用的方法也会触发子类调用 2、常用的设计
阅读全文
摘要:简单优化: 1、不要使用 select *,尽量避免回表查询 2、尽量避免 in语句,用exist语句代替 3、如果 like 语句前后模糊匹配导致索引失效,可以使用 SELECT * FROM table WHERE INSTR(name, 'keyword') > 0; 4、优先在where 、
阅读全文
摘要:目标文件: 请使用: InputStream is = this.getClass().getResourceAsStream("/application.yml"); 这种方式 原因其实是mvn的打包方式决定的,debug的时候getResource可以直接读取路径获取,打成jar则不行, 当然如
阅读全文
摘要:mvn install:install-file "-Dfile=(jar包的位置)" "-DgroupId=groupId(分组)" "-DartifactId=artifactId(jar名称)" "-Dversion=version(版本号)" "-Dpackaging=jar"
阅读全文
摘要:安装好之后tools里面打开
阅读全文
摘要:netstat -aon|findstr "8080" taskkill /T /F /PID 20508
阅读全文