数据结构
数据结构:提高搜索效率(索引)通常采用的数据结构: 二叉树/红黑树 B树/B+树 Hash 跳表 跳表: 二叉树,红黑树: B树,B+树: B+树只在叶子节点存储数据并且用双向链表链接,能更好的适应范围搜索 双向链表: 删除,还有移动元素到队头或队尾都是O(1) LRU怎么实现的: HashMap+双向链表 布隆过滤器:
JVM
引言:什么是jvm程序运行时,JVM 会对字节码文件进行逐行解释,翻译成机器码指令,并交给对应的操作系统去执行。 jvm的特性①、JVM 可以自动管理内存,通过垃圾回收器回收不再使用的对象并释放内存空间。 ②、JVM 包含一个即时编译器 JIT,它可以在运行时将热点代码缓存到 codeCache 中,下次执行的时候不用再一行一行的解释,而是直接执行缓存后的机器码,执行效率会大幅提高。 jvm的架构① 类加载器:负责从文件系统、网络或其他来源加载 Class 文件,将 Class 文件中的二进制数据读入到内存当中。 ② 运行时数据区:JVM 在执行 Java 程序时,需要在内存中分配空间来处理各种数据,这些内存区域按照 Java 虚拟机规范可以划分为方法区、堆、虚拟机栈、程序计数器和本地方法栈。 ③ 执行引擎:也是 JVM 的心脏,负责执行字节码。它包括一个虚拟处理器、即时编译器 JIT 和垃圾回收器。 内存管理java字节码文件: jvm运行时数据区: 有什么? 程序计数器:每个线程私有,记录当前程序执行的位置 Java虚拟机栈:主要存储的是局部变量和对象的引用;每个方法会产生一...
JUC
多线程:多线程要注意哪些问题:原子性:提供互斥访问 可见性:某个线程对主内存的修改可以及时被其他线程看到 有序性:由于指令重排 线程:创建线程的方式,怎样启动,怎样停止 创建: 继承Thread类 实现Runnable接口 实现Callable接口与FutureTask(有点不好用) 使用线程池 启动: Thread类的start()方法。 如何停止: sleep() interrupt() 线程的状态有哪些,blocked和waiting有什么区别: 状态有哪些: blocked和waiting有什么区别: 主要是触发条件和唤醒条件。 虽然最终表现都是“线程挂起”,但 挂起的理由不同、唤醒的源头不同、重新运行前还要不要抢锁也不同。 sleep和wait的区别,sleep会释放cpu吗: 区别: sleep()方法让出cpu进入阻塞队列 wait()方法释放掉当前同步块的锁并且让出cpu进入阻塞队列 notify和notifyAll的区别,notify选哪个线程: 都是object的方法 notify选择唤醒的一个线程是任意的,具体实现依赖JVM。 notifyAll唤...
java集合
List:List可以一遍遍历一边修改元素吗? fail-fast 机制决定了“结构修改”会抛异常,因此 **ArrayList** 等集合不允许在遍历过程中绕开迭代器去增删元素;但允许通过迭代器自身提供的 **set/add/remove** 安全地修改内容。 ArrayList和LinkedList有什么区别: ArrayList 是基于数组实现的,LinkedList 是基于链表实现的。 多数情况下,ArrayList 更利于查找,LinkedList 更利于增删。 ArrayList的扩容机制? 计算新容量 创建新数组,将原有数据复制 更新引用 Map:HashMap的底层数据结构: 数组+链表+红黑树 hash函数: HashMap的hash函数怎么设计的? 12345static final int hash(Object key) { int h; // 如果 key 为 null,返回 0;否则,使用 hashCode 并进行扰动 return (key == null) ? 0 : (h = key.hashCode()) ^ (h ...
java基础
java概述:什么是java? 同时,Java 又是一门平台无关的编程语言,即一次编译,处处运行。 Java 没有了指针的概念,实现了内存的自动管理,而 C 语言需要使用 malloc 和 free 来手动管理内存。 java的语言特性: ①、面向对象 ②、平台无关性 ③、支持多线程 ④、支持 JIT 编译,编译与解释并存 jvm,jdk,jre的区别: JVM:也就是 Java 虚拟机,是 Java 实现跨平台的关键所在,不同的操作系统有不同的 JVM 实现。JVM 负责将 Java 字节码转换为特定平台的机器码,并执行。 JRE:也就是 Java 运行时环境,包含了运行 Java 程序所必需的库,以及 JVM。 JDK:在JRE的基础上有了编译器,能将java源代码编译成字节码文件 简单来说,JDK 包含 JRE,JRE 包含 JVM。 数据类型:八种基本的数据类型: 基本数据类型的转换方式,会出什么问题? 低精度转高精度可以自动转换 高精度转低精度需要强制转换可能会发生数据溢出或精度损失 引用数据类型转换问题: 装箱拆箱: 弊端:创建多余对象 为什么用BigDemi...
spring
核心思想:spring的核心: IOC和AOP 用到了哪些设计模式: bean的创建: 单例模式 工厂模式 ioc:对ioc的理解? 用ioc容器来控制对象,控制就是对象的创建,初始化,销毁。解决了繁琐的对象生命周期操作。 ioc如何实现的? 依赖注入和容器实现 依赖注入,控制反转分别是什么? 控制反转:流程的控制权从程序员变成了框架 依赖注入:将依赖的类对象通过在外部创建好通过构造函数,函数参数等方式给类使用 如何实现依赖注入: 构造器注入 Setter方法注入 字段注入 spring容器里存储的是什么? Bean对象 Bean是单例的吗? 默认是单例,也可以通过修改作用域使Bean在每次请求都会创建一个实例。 单例Bean要考虑线程安全问题。 Bean的作用域: 可以通过scope注解自定义实现,默认都是单例,还有像prototype这样的。 Bean的生命周期 生命周期: 1:实例化 2:属性赋值 3:初始化方法: 初始化的前置方法 初始化方法 初始化的后置方法 4:使用 5:销毁 spring如何解决循环依赖?三级缓存结构是什么?为什么用三级缓存解决循环依赖问题? 1: ...
redis
数据结构:底层的数据结构: String:适用分布式锁,共享信息等 Hash:适用购物车场景 List:适用消息队列 Set:适用点赞场景 Zset:适用与排序场景 线程模型:redis为什么快: 1:redis大部分操作都是在内存中进行的 2:redis采用了单线程模型避免了多线程的竞争,省去了多线程切换带来时间和性能上的开销 3:采用了io多路复用机制处理大量的客户端请求 redis哪里使用了多线程: redis会启动后台线程进行【关闭文件,AOF刷盘,释放内存】 6.0以后多线程来处理网络I/O但是执行命令仍然是单线程 事务:如何实现redis的原子性: lua脚本 日志:redis的持久化方法: AOF日志+RDB快照 AOF日志:每次写操作都追加到日志中,缺点:消耗大 RDB快照:把某一时刻内存中的数据写到磁盘中,缺点:两次快照之间的数据读写会丢失 场景:内存淘汰和过期删除: 过期删除: redis选择【定期删除和惰性删除】,定期删除:每个一段时间检查一下删除过期数据,惰性删除:当请求访问数据时先判断是否过期,如果过期就删除并返回Null 内存淘汰: 不进行:...
mysql
SQL基础:联表查询: 用join比where效率高 group by: 通常和聚合函数一起使用 in和exact: in:左边的表达式在右边的列表中就返回true exact:子查询语句能查到数据就返回true varchar和char: char是定长的,效率高 varchar是变长的,节省空间 int(1)和int(10)有什么不同: 只是会在小于位数的时候有补零显示 索引:索引是为了提高搜索的效率,通过普通索引搜索会进行回表(这是最优的查询方式)。 要想提高效率只能提高回表效率,提高回表效率的方式有索引覆盖和索引下推。 索引覆盖:普通索引的B+树中信息涵盖了要查询的信息,直接不用回表了 索引下推:把 WHERE 里没用到索引的条件推到引擎层提前过滤,减少回表,变快。(没有索引下推的时候一般只会在引擎层查询一个字段) 什么时候索引会失效(因为写的条件使用索引的效率不高,优化器自动跳过索引进行全表扫描): 违反最左匹配原则:没有按照联合索引的顺序搜索 反向匹配:用!= 对索引列进行操作:函数操作,数值计算,类型转换 or查询:如果有列不在索引中 创建索引的原则: 发...
建站过程
使用 Hexo+GitHub 搭建个人免费博客教程(小白向) - 知乎 Butterfly主题的详细配置 | 梁圣磊の博客 域名配置加一条解析在根目录加个文件就可以了s