面试专栏
自己搜索整理的面试题专栏
Hai-Yang-code
这个作者很懒,什么都没留下…
展开
-
Redis底层原理实现
简单动态字符串Redis 是用 C 语言写的,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符’\0’结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple dynamic string,SDS)的抽象类型,并将 SDS 作为 Redis的默认字符串表示。SDS 定义:struct sdshdr{ //记录buf数组中已使用字节的数量 //等于 SDS 保存字符串的长度 int len; //记录 buf 数组中未使用字节的数量原创 2020-09-15 21:58:50 · 6728 阅读 · 1 评论 -
关联查询优化
建表CREATE TABLE IF NOT EXISTS `class` (`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT(10) UNSIGNED NOT NULL, PRIMARY KEY (`id`));CREATE TABLE IF NOT EXISTS `book` (`bookid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT(10) UNSIGNED NO原创 2020-08-30 14:40:35 · 1632 阅读 · 0 评论 -
单表查询优化
1、全值匹配很快捷基本表DROP TABLE IF EXISTS `t_emp`;CREATE TABLE `t_emp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `age` int(3) NULL DEFAULT NULL, `deptId` int(11) NULL DEFAULT原创 2020-08-30 11:43:47 · 1028 阅读 · 1 评论 -
Explain sql性能分析
概念使用 EXPLAIN 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理你的 SQL 语句的。分析你的查询语句或是表结构的性能瓶颈用法--EXPLAIN + SQL语句,如:EXPLAIN SELECT * FROM t_dept;分析准备工作CREATE TABLE t1(id INT(10) AUTO_INCREMENT,content VARCHAR(100) NULL , PRIMARY KEY (id));CREATE TABLE t2(id IN原创 2020-08-30 10:47:17 · 106 阅读 · 0 评论 -
索引
什么是索引MySQL 官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构。可以得到索引的本质: 索引是数据结构。可以简单理解为:排好序的快速查找数据结构索引的优缺点优点提高数据检索的效率,降低数据库的IO成本通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗缺点虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了原创 2020-08-30 10:06:38 · 129 阅读 · 0 评论 -
Java中的引用:强引用,软引用,弱引用,虚引用
Java中的引用前言在原来的时候,我们谈到一个类的实例化Person p = new Person()在等号的左边,就是一个对象的引用,存储在栈中而等号右边,就是实例化的对象,存储在堆中其实这样的一个引用关系,就被称为强引用整体架构强引用当内存不足的时候,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,打死也不回收~!强引用是我们最常见的普通对象引用,只要还有一个强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。在Java中最常见的原创 2020-08-21 15:21:12 · 696 阅读 · 0 评论 -
JVM参数调优
JVM参数调优前言请问如何盘点查看JVM系统默认值使用jps和jinfo进行查看-Xms:初始堆空间-Xmx:堆最大值-Xss:栈空间-Xms 和 -Xmx最好调整一致,防止JVM频繁进行收集和回收JVM参数类型标配参数(从JDK1.0开始一直存在,很稳定)-version-helpjava -showversionX参数(了解)-Xint:解释执行-Xcomp:第一次使用就编译成本地代码-Xmixed:混合模式XX参数(重点)Boolean类型公式原创 2020-08-21 14:55:02 · 220 阅读 · 0 评论 -
java的锁:公平锁,非公平锁,可重入锁,自旋锁,独占锁(写锁) / 共享锁(读锁) / 互斥锁
公平锁和非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁,类似于排队买饭,先来后到,先来先服务,就是公平的,也就是队列非公平锁是指多个线程获取锁的顺序,并不是按照申请锁的顺序,有可能申请的线程比先申请的线程优先获取锁,在高并发环境下,有可能造成优先级翻转,或者饥饿的线程(也就是某个线程一直得不到锁),类似于允许排队加塞。。。如何创建并发包中ReentrantLock的创建可以指定析构函数的boolean类型来得到公平锁或者非公平锁,默认是非公平锁synchronized修饰的也是非公平锁/原创 2020-08-19 11:09:51 · 336 阅读 · 0 评论 -
CAS底层原理和ABA问题
CAS底层原理概念CAS的全称是Compare-And-Swap,它是CPU并发原语它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的CAS并发原语体现在Java语言中就是sun.misc.Unsafe类的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于CAS是一种系统原语,原语属于操作系统用于范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续原创 2020-08-18 16:45:26 · 318 阅读 · 0 评论 -
Volatile禁止指令重排
Volatile禁止指令重排计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种:源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 -> 最终执行指令单线程环境里面确保最终执行结果和代码顺序的结果一致处理器在进行重排序时,必须要考虑指令之间的数据依赖性多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程中使用的变量能否保证一致性是无法确定的,结果无法预测。指令重排 - example 1public vo原创 2020-08-18 14:54:12 · 5722 阅读 · 4 评论 -
Volatile不保证原子性
Volatile不保证原子性前言可见性解析: 链接.通过前面对JMM的介绍,我们知道,各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后在写回到主内存中的。这就可能存在一个线程AAA修改了共享变量X的值,但是还未写入主内存时,另外一个线程BBB又对主内存中同一共享变量X进行操作,但此时A线程工作内存中共享变量X对线程B来说是不可见,这种工作内存与主内存同步延迟现象就造成了可见性问题。原子性不可分割,完整性,也就是说某个线程正在做某个具体业务时,中间不可以被加塞或者被分原创 2020-08-18 11:43:39 · 298 阅读 · 0 评论 -
谈谈对Volatile的理解
JUC(java.util.concurrent)进程和线程进程:后台运行的程序(我们打开的一个软件,就是进程)线程:轻量级的进程,并且一个进程包含多个线程(同在一个软件内,同时运行窗口,就是线程)并发和并行并发:同时访问某个东西,就是并发并行:一起做某些事情,就是并行JUC下的三个包java.util.concurrentjava.util.concurrent.atomicjava.util.concurrent.locks谈谈对Volatile的.原创 2020-08-18 10:54:54 · 117 阅读 · 0 评论 -
jvm虚拟机栈
虚拟机栈虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?为什么?首先栈是运行时的单位,而堆是存储的单位栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,原创 2020-07-29 09:59:16 · 261 阅读 · 0 评论 -
jvm程序计数器
程序计数器介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。在JVM规范中,每个线程都有它自原创 2020-07-28 15:49:12 · 989 阅读 · 0 评论 -
jvm类加载子系统和双亲委派机制
类加载子系统概述完整图如下如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎类加载器子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文原创 2020-07-28 14:47:14 · 281 阅读 · 0 评论 -
浅显分析一下springboot是怎么样扫描配置
主程序类,主入口类@SpringBootApplicationSpring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用;@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@原创 2020-07-26 15:39:41 · 1038 阅读 · 0 评论 -
spring中的事务实现
什么事务( 1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败(2)典型场景:银行转账lucy 转账 100 元 给 marylucy 少 100, mary 多 100事务四个特性(ACID)(1)原子性(2)一致性(3)隔离性(4)持久性环境准备搭建环境,先确保可以执行<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframe原创 2020-07-25 22:35:41 · 327 阅读 · 0 评论 -
Spring中JdbcTemplate
什么是JdbcTemplate不引入其它框架,Spring框架对jdbc操作的封装,使用JdbcTemplate对数据库的操作JdbcTemplate的使用导入依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"原创 2020-07-25 16:52:07 · 86 阅读 · 0 评论 -
Spring中的AOP
什么是AOPAspect Oriented Programming 的缩写,翻译为:面向切面编程。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。用一个例子解释下AOP,我们现在有一个完整的登录功能代码,但我们想在加入一个权限控制,在原始方式,我们需要去修改源代码,加入具体逻辑,不需要的时候还需要逐行修改,很麻烦。现在我们利用AOP,先写一个权限管理的模块,通过AOP的方式加入到源代码中,不需要的时候把,对该模块的使用删掉原创 2020-07-25 15:39:28 · 260 阅读 · 0 评论 -
spring 的IOC
什么是IOC控制反转,把对象创建和对象之间的调用过程,交给spring进行管理使用spring的目的:为了耦合度降低DI:依赖注入,注入属性,是IOC中的一种具体实现。对ioc的简单理解在平时的java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上原创 2020-07-24 18:15:34 · 148 阅读 · 0 评论 -
GC垃圾回收算法 和 GC回收器 (二)
垃圾回收算法.十种GC回收器Serial 回收器单线程收集针对新生代使用复制算法会产生较长时间的停顿(Stop the world),进行垃圾收集时,必须暂停所有工作线程,直到完成不会产生线程切换的开销Serial Old 回收器老年代单线程回收使用标记整理算法Parallel Scavenge回收器jdk 1.8默认的垃圾回收器多线程并行回收新生代回收器,采用复制算法追求高吞吐量,充分利用CPU资源【吞吐量优先】进行垃圾收集时,必须暂停所有工作线程,直到完成原创 2020-07-24 09:23:15 · 100 阅读 · 0 评论 -
GC垃圾回收算法 和 GC回收器 (一)
什么是垃圾?类比日常生活中,如果一个东西经常没被使用,那么就可以说是垃圾。同理,如果一个对象不可能再被引用,那么这个对象就是垃圾,应该被回收。垃圾:不可能再被引用的对象。finalize方法在对象没有被引用时调用在Object类里定义新生代与老年代新生代分为三个区域,一个Eden区和两个Survivor区,它们之间的比例为(8:1:1),这个比例也是可以修改的。通常情况下,对象主要分配在新生代的Eden区上,少数情况下也可能会直接分配在老年代中。Java虚拟机每次使用新生代中的Eden和其原创 2020-07-24 08:51:35 · 284 阅读 · 0 评论 -
深入理解Java中的final关键字
在Java中声明类、变量和方法时,可使用关键字final来修饰,表示“最终的”。final用来修饰一个类:被修饰的类不能再被其他类继承。- 例如:String类、StringBuffer类、System类等final用来修饰方法:表明被修饰的方法不能再被子类重写。- 例如:Object类中的getClass()方法final用来修饰变量:此时的“变量”就是一个常量,名称大写,且只能被赋值一次。final修饰属性:可以赋值的位置有:显示初始化、代码块中初始化、构造器中初始化。原创 2020-07-18 16:58:53 · 93 阅读 · 0 评论 -
java创建一个对象的过程以及对象的内存布局
进行判断java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载。加载并初始化类完成后,再进行对象的创建工作。第一次使用分为加载并初始化类和创建对象加载并初始化类java是使用双亲委派模型来进行类的加载的,所以在描述类加载过程前,我们先看一下它的工作过程:双亲委托模型的工作过程是:如果一个类加载器(ClassLoader)收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此原创 2020-07-18 08:29:10 · 670 阅读 · 0 评论 -
递归-八皇后问题(回溯算法)
八皇后问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。思路分析第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解原创 2020-07-12 11:42:50 · 221 阅读 · 0 评论 -
约瑟夫环问题
Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。package c原创 2020-07-08 21:17:07 · 307 阅读 · 0 评论 -
带头节点的单向链表反转
package com.qcby.bilbil;/** * @author HuangHaiyang * @date 2020/07/08 * @description: description * @version: 1.0.0 */public class ReversalList { private Node head=new Node(0,null);//带头节点 private Integer size=0; public void add(Node原创 2020-07-08 16:52:01 · 266 阅读 · 0 评论 -
单例模式,饿汉式,懒汉式,静态内部类,枚举式
单例模式介绍:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,**可以直接访问,不需要实例化该类的对象。**其实就是无论你调多少这对象,他就是同一个。例如,我们在系统的多个地方需要读取一个配置文件,我们并不需要每次都去new一个实例,然后去读文件,只需要维护一个全局的Config类,并且每次使用的时候校验下文件是否变更即可。依赖可以减少类的创建跟销毁的时候的开销,二来也减少了读取文件的次数。就像spring的ioc容器。默认就是单例原创 2020-07-07 21:53:51 · 410 阅读 · 0 评论 -
多线程的CPU密集型和IO密集型
线程是否越多越好? 分析如下:对于cpu密集型一个计算为主的程序(专业一点称为CPU密集型程序)。多线程跑的时候,可以充分利用起所有的cpu核心,比如说4个核心的cpu,开4个线程的时候,可以同时跑4个线程的运算任务,此时是最大效率。但是如果线程远远超出cpu核心数量 反而会使得任务效率下降,因为频繁的切换线程也是要消耗时间的。因此对于cpu密集型的任务来说,线程数等于cpu数是最好的了。对于IO密集型如果是一个磁盘或网络为主的程序(IO密集型)。一个线程处在IO等待的时候,另一个线程还可原创 2020-07-07 15:42:24 · 1893 阅读 · 0 评论 -
线程池:三大方法、7大参数、4种拒绝策略
池化技术:程序运行就是资源的占用,池化就是优化资源利用,线程池,连接池啥的,创建销毁很耗费时间空间,所以就提前准备好资源,你来那就行,用完换回来。减少资源消耗,速度提升,还有或就是方便管理,线程复用,就像sqlsession一样,查出数据存着,可控制最大并发三大方法:(不建议使用)package com.qcby.lock;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/原创 2020-07-07 15:23:34 · 726 阅读 · 1 评论 -
JUC包下的常用工具类CountDownLatch,cyclicBarrier,semaphore
CountDownLatch 减法计数器package com.qcby.lock;import java.util.concurrent.CountDownLatch;/** * @author HuangHaiyang * @date 2020/07/07 * @description: description * @version: 1.0.0 */public class CountDownLatchTest { public static void main(Stri原创 2020-07-07 11:01:41 · 119 阅读 · 0 评论 -
集合并发问题及解决方案
java.util.ConcurrentModificationExceptionpublic class ListTest { public static void main(String[] args) { List<String> list=new ArrayList<>(); for (int i = 1; i <=10 ; i++) { new Thread(()->{原创 2020-07-06 22:57:00 · 463 阅读 · 0 评论 -
理解一下synchronized锁的是什么
package com.qcby.lock;import java.util.concurrent.TimeUnit;/** * @author HuangHaiyang * @date 2020/07/06 * @description: description * @version: 1.0.0 *//** * @Date: 2020/7/6 * 两个普通同步方法 发短信 打电话 * @return: */public class SyncTest { pu原创 2020-07-06 22:00:16 · 326 阅读 · 0 评论 -
jdk1.8的HashMap中的红黑树插入,为什么是红黑树而不是AVL树
jdk1.8HashMap的源码树节点static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> { TreeNode<K,V> parent; // red-black tree links TreeNode<K,V> left; TreeNode<K,V> right; TreeNode<K,V&g原创 2020-06-19 14:01:19 · 1183 阅读 · 1 评论 -
理解一下红黑树
定义红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:性质1.每个节点或是红色或是黑色。性质2. 根节点是黑色。性质3.所有叶节点都是黑色。(叶子是NUIL节点)性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。下面是一棵简单的红黑树,可以到它就符合上述性质画一个红黑树我们规定新插入原创 2020-06-19 11:10:21 · 491 阅读 · 0 评论 -
详细分析jdk1.7的HashMap源码
先看一段代码public static void main(String[] args) { Map<String,Object> map=new HashMap<>(); map.put("key=1","value=100"); Object put = map.put("key=1", "value=200"); System.out.println(put); }结果//value=100我们知道map原创 2020-06-18 12:28:41 · 566 阅读 · 1 评论 -
mysql常见面试题之存储引擎
存储引擎存储引擎(Storage Engine)就是指表的类型以及表在计算机上的存储方式。存储引擎的概念是MySQL的特点,提供了存储引擎接口,有兴趣的开发者可以编写自己的存储引擎。在mysql客户端中,使用以下命令可以查看MySQL支持的引擎:mysql> show engines;mysql> show engines;+--------------------+---------+--------------------------------------------------原创 2020-06-17 20:24:50 · 804 阅读 · 1 评论 -
tcp三次握手四次挥手
https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc转载 2020-06-17 17:58:10 · 84 阅读 · 0 评论 -
String类型为什么被设置为finall
String为什么不可变?public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** String本质是个char数组. 而且用final关键字修饰.*/ private final char value[]; ... ...}首先String类是用final关键字修饰,这说明String不可继承。再看下面,String类的主力成员原创 2020-06-14 13:58:26 · 366 阅读 · 0 评论