sql
From->Where->Group By->Having->Select
Where语句是过滤符合条件的数据。
Having是对Group By的结果进行过滤。
页式存储
把进程的逻辑空间等分为若干页面
把物理内存空间分成与页面大小相同的物理块
把以页面为单位的进程分配到物理内存的分散物理块中
缺点:把一段连续的逻辑分布在不同页面中,会大大降低执行效率。
优点:提高内存利用率
段式存储
把进程按照连续的逻辑分成不同大小的若干段
缺点:会产生内存碎片
优点:提高效率满足用户需求
段页式存储
将进程按照段式管理,把进程按照连续逻辑分成若干段
再将每段按照页式管理,等分成若干页面存储进内存
地址构成为 段号 段内页号 页内偏移量
rest风格
https://blog.csdn.net/qq_34582693/article/details/79981742
补码原码反码
原码,8位二进制数,最高位为符号位,正数为0,负数为1
反码
除符号位,其他位对原码取反
补码
对反码加1
计算机网络
tcp四次挥手
四次挥手中,先发起的一方是主动关闭,被发起的一方是被动关闭,在四次挥手结束后,主动方进入time-wait状态,保证最后一个ack到达被动方,如果在2msl中未到达,则重传直至到达,否则被动方将无法正常关闭。
https://blog.csdn.net/tuobicui6522/article/details/80379428
java中对象新建的过程
https://www.cnblogs.com/chenyangyao/p/5296807.html
ThreadLocal
https://baijiahao.baidu.com/s?id=1653790035315010634&wfr=spider&for=pc
输入网址按下回车后发生了什么
第一步:浏览器查找该域名的IP地址
第二步:浏览器根据解析得到的IP地址向web服务器发送一个HTTP请求
第三步:服务器收到请求并进行处理
第四步:服务器返回一个响应
第五步:浏览器对该响应进行解码,渲染显示
第六步:页面显示完成后,浏览器发送异步请求
事务
https://blog.csdn.net/dengjili/article/details/82468576
悲观锁与乐观锁
悲观锁假设每次对数据读取后都会修改,所以每次都上锁,即共享资源一次只能提供给一个线程使用,其他线程阻塞,数据库中写锁和java中synchronized是悲观锁,用于多写场景,效率慢
乐观锁假设每次拿数据都不会修改,所以不上锁,但是会在更新时候判断是否数据发生改变,配合版本号机制和cas算法来实现,多读场景
https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/essential-content-for-interview/%E9%9D%A2%E8%AF%95%E5%BF%85%E5%A4%87%E4%B9%8B%E4%B9%90%E8%A7%82%E9%94%81%E4%B8%8E%E6%82%B2%E8%A7%82%E9%94%81.md
自旋锁&&CAS
自旋锁:当一个线程想要获取锁,但该锁已经被其他线程占有,那么该线程就会循环等待,不断判断锁是否能够被获取,直到获取到才退出循环。
CAS算法 即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数

需要读写的内存值 V
进行比较的值 A
拟写入的新值 B

当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试。
jdk1.8新特性
新的日期API LocalDate | LocalTime | LocalDateTime
在数组+链表+红黑树来实现hashmap,当碰撞的元素个数大于8时 & 总容量大于64,会有红黑树的引入
java的类加载
加载的时机:
隐式加载 new 创建类的实例,
显式加载:loaderClass,forName等
访问类的静态变量,或者为静态变量赋值
调用类的静态方法
使用反射方式创建某个类或者接口对象的Class对象。
初始化某个类的子类
直接使用java.exe命令来运行某个主类
https://blog.csdn.net/ln152315/article/details/79223441?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
==&equals
基本类型只有==没有equals
引用类型 ==比较的是两个对象在内存中的地址即hashcode
equals原本也是比较地址,但是String重写了equals使其比较的是字符串内容即ASCAll码

String StringBuilder StringBuffer
String 不可变用finall声明 不可被继承如需要修改value会引入新的内存地址新得value 保证线程安全
StringBuilder 可变 线程不安全
StringBuffer 可变 线程安全 使用synchronized同步

操作少量的数据: 适用 String
单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer

重写hashcode和equals
在类中重写equals

@Override
    public boolean equals(Object object) {
        //如果hashcode地址相同那么元素相同
        if (this == object) {
            return true;
        }
        if (object instanceof Photo) {
            Photo photo = (Photo) object;
            if (this.getPhoto().equals(photo.getPhoto()) && this.getPhotoId() == photo.getPhotoId()) {
                return true;
            }
        }
        return false;
    }

重写完equals后一定要重写hashcode,因为hashcode规则必须满足 如果两个对象相等那么hashcode必须相等,否则会影响hashmap hashset等
重写hashcode

@Override
    public int hashCode() {
        int prime = 31;//权重
        int result = 1;
        result = prime * result + (this.getPhoto() == null ? 0 : this.getPhoto().hashCode());
        result = prime * result + (this.getPhotoDate() == null ? 0 : this.getPhotoDate().hashCode());
        return result;
    }
//31这个值是一个奇素数,只是一个默认的传统。并不一定要用31。
//但是这个数可以通过位移的方式来处理乘法,获得一些性能上的优化,
//虚拟机会自动做这些优化。

ACID事务的原子性:要么全部成功要么全部失败
一致性:事物的执行不能破坏数据库的一致性完整性。突然宕机,有些事务未完成,对数据库的修改不应写入
隔离性:在并发环境中,事务间相互隔离不***扰,四个级别:读未提交,不可重复读,可重复度,可串行化
持久性
hashMap
https://zhuanlan.zhihu.com/p/79507868
hashmap中计算hash值使用key.hashcode()^(key.hashcode()>>>16)通过右移16位让高位参与运算,与低16位进行异或运算,通过32全部参与运算的方式降低重复率,之后以hash&(数组长度-1)进行index的取值。
JVM
jvm结构:VM栈、堆、方法区、程序计数器、本地方法栈五个部分
jvm定义
JVM就是java虚拟机,它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。JVM有自己完善的硬件结构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。
2、jvm作用
JVM是java字节码执行的引擎,还能优化java字节码,使之转化成效率更高的机器指令。
JVM中类的装载是由类加载器和它的子类来实现的,类加载是java运行时一个重要的系统组件,负责在运行时查找和装入类文件的类。
不同的平台对应着不同的JVM,在执行字节码(class文件)时,JVM负责将每一条要执行的字节码送给解释器,解释器再将其翻译成特定平台换将的机器指令并执行,这样就实现了跨平台运行。
3、JVM工作原理
JVM在整个JDK中处于最底层,负责与操作系统的交互。操作系统装入jvm是通过JDK中的java.exe来实现的,具体步骤如下:
a、创建JVM装载环境和配置;
b、装载jvm.dll;
c、初始化jvm.dll;
d、调用JNIEnv实例装载并处理class类;
e、运行java程序
mysql索引
https://www.cnblogs.com/kungfupanda/p/12776674.html
B+树 所以要对查找的方式进行优化,熟悉的二分查找,二叉树可以把速度提升到O(log(n,2)),查询的瓶颈在于树的深度,最坏的情况要查找到二叉树的最深层,由于,每查找深一层,就要访问更深一层的索引文件。在多达数G的索引文件中,这将是很大的开销。所以,尽量把数据结构设计的更为‘矮胖’一点就可以减少访问的层数。在众多的解决方案中,B-/B+树很好的适合。B-树定义具体可以查阅,简而言之就是中间节点可以多余两个子节点,而且中间的元素可以是一个域。相比B-树,B+树的父节点也必须存在于子节点中,是其中最大或者最小元素,B+树的节点只存储索引key值,具体信息的地址存在于叶子节点的地址中。这就使以页为单位的索引中可以存放更多的节点。减少更多的I/O支出。因此,B+树成为了数据库比较优秀的数据结构,MySQL中MyIsAM和InnoDB都是采用的B+树结构。不同的是前者是非聚集索引,后者主键是聚集索引,所谓聚集索引是物理地址连续存放的索引,在取区间的时候,查找速度非常快,但同样的,插入的速度也会受到影响而降低。聚集索引的物理位置使用链表来进行存储。
线程间通信
无名管道 pipe
命名管道namepipe
高级管道通信popen
消息队列
信号量
线程
线程池五大参数
ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue)
corePoolSize 线程池大小
maximumPoolSize 线程池最大线程数
keepAliveTime 表示线程没有任务执行时最多保持多久时间会终止
unit 时间单位
workQueue 任务缓存队列及排队策略

待续
jvm结构及作用
如何实现多线程
start和run方法的关系
线程池(问了参数,这块不是特别清楚)
BIO,NIO,AIO
重载和重写(开始忘记重载是什么了,面试官提醒了一下)
lock和synchronized的区别
CAS怎么回事,自旋怎么回事,ABA如何处理

字节
. 类似于图,给n个点,和单向边。判断中心节点。中心节点:所有其余节点都指向中心节点,但是中心节点不指向任何节点。
2. 判断是否是二叉搜索树

下面问一些基础:
进程和线程介绍一下(补充了协程只是,但是协程记错说成管程)
TCP的特点(面向连接)
为什么需要第3次握手
HTTP报文格式是什么
HTTP状态码知道哪些
数据库ACID,可以解释一下各个特性吗
B+树结构
B+树是怎么保持平衡的
联合索引是什么,为什么需要索引(除了查找的时候快还有别的原因吗)
springboot+redis实现session登陆
hashmap的结构
JVm调优参数
JVM结构垃圾回收算法
springboot自动装配原理
redis与mysql的优缺点,是用作缓存还是数据库
数据库三范式
图片说明