1.java线程安全的数据类型
Vector:每个方法都有synchronized
hashttable:每个方法都有synchronized
stack:继承了vector
arrayblockingqueue:阻塞队列
concurrentHashMap:使用segment分段锁
concurrentLinkedQueue:无界队列
2.java类的生命周期
加载:class字节码载入jvm
验证:class文件不危害虚拟机
准备:为类静态变量分配内存设置初值
解析:符号引用改为直接饮用
初始化:类构造器之类的
使用:用功能
卸载:gc回收等;实例回收,classloader回收,class对象无引用
3.类加载机制
双亲委派机制
收到了类加载请求,会委托父类加载器执行,如果都没有就自己加载
4.java内存模型
jmm定义了了线程和主内存的关系
每个线程都有一个私有的本地内存。是cpu的寄存器和高速缓存
线程通信的话,要进行save和load两步操作得到共享变量
解决了线程读同步和可见性、原子性
有时候对没有数据依赖的操作进行指令重排序提高并行度,同时可以使用内存屏障防止冲排序
5.堆内存和栈内存的区别,分别存什么
栈主要存局部变量和对象的引用变量,每个线程有一个独立的栈空间
堆主要存实例化的对象数组,一个jvm只有一个堆内存
栈存取速度快,但大小和生存周期确定,缺少灵活
堆可以动态分配内存,生存期布丁,gc自动抽走;运行时动态分配,存取慢
6.一个类的静态变量实例化存在哪里
成员变量存在于堆内存中。 静态变量存在于方法区
方法区被线程共享,存储了每个类的信息和静态变量、常量池等
7.一个函数内部的局部变量存哪里
栈。
8.Springboot框架的生命周期
初始化阶段(构造、配置)
运行阶段(准备、applicationContext启动、启动后)
结束
退出
9.springboot和spring的区别
springboot使用约定优于配置原则,减少xml显式配置
springboot通过maven gradle管理依赖
springboot提供注解,更多默认配置和开箱即用功能,简化开发
springboot为服务支持,自动配置话快速启动
10.mysql的索引类型
存储方式:b+tree,哈希,全文索引:搜索文本关键字,char varcahr和text,fulltext配合match against,用倒排索引
逻辑方式:
普通索引:可以为空,加快查询
唯一索引:索引值必须唯一
主键索引:不允许空 唯一
组合索引:多字段,最左前缀匹配,用于组合搜索
物理方式:
聚簇索引:叶子结点放行记录
非聚簇索引:放主键,没有索引覆盖时要回表
11.四阶聚簇索引的存储结构?插入过程和查询过程?
四阶聚簇索引通常用于数据库系统,是一种多级索引结构,用于提高数据的检索效率。这种索引结构包含了多个级别,每个级别都存储部分数据的索引信息。以下是四阶聚簇索引的存储结构以及插入和查询过程的简要描述:
存储结构:
四阶聚簇索引通常由以下几个层次组成:
第一级索引: 第一级索引通常是一个 B+ 树或类似的数据结构,用于存储所有数据块的索引。每个索引项通常包括一个键值和一个指向对应数据块的指针。
第二级索引: 第二级索引也是一个 B+ 树,但它的每个叶节点指向第一级索引的某个节点,而不是数据块。这些第二级索引的叶节点按照键值的顺序排列,以支持范围查询。
第三级索引: 第三级索引同样是一个 B+ 树,但它的叶节点指向第二级索引的节点。
第四级索引: 第四级索引是最底层的索引,指向数据块。这些数据块包含了实际的数据记录。
插入过程:
插入新记录时,数据存储在第四级索引的数据块中。如果插入导致某个数据块超过了容量限制,可能需要进行分裂操作,将数据块分成两个。此时,需要更新第三级索引,以便找到新分裂出的数据块。如果第三级索引也需要更新,那么需要逐级更新直到第一级索引。
查询过程:
当执行查询操作时,数据库系统首先使用第一级索引来定位到包含查询键值的数据块。然后,它可以通过第二级、第三级索引依次定位到具体的数据块。最终,在数据块中进行线性查找或其他搜索操作,找到满足查询条件的数据记录。
四阶聚簇索引的优点是能够提高范围查询的性能,因为第二级和第三级索引可以有效地缩小搜索范围。但它也会增加索引的维护成本,因为插入、更新和删除操作可能需要更新多个级别的索引。因此,索引的设计需要根据具体的应用场景和查询需求来权衡性能和维护成本。
12.redis数据类型
String:常规kv缓存
hash:存储对象
list:消息队列,多个端点将日志写入redis;取最新n个数据
set:无序集合求共同关注、共同好友等
zset:权重参数score,跳表,排行榜,待权重的消息队列
13.java的String和redis的String对比,获取len的时间复杂度
redis的String用了简单动态字符串SDS,可以o1获得字符串长度,防止缓冲区溢出,减少修改时内存重分配次数,c字符串不可以出现\0导致不能存二进制数据
java时o1有length变量,c语言需要遍历获取所以是on
14.代码题
结果:
解释:
静态块:只执行一次
构造块:创建对象执行
执行顺序:静态块 > main > 构造块 > 构造方法
1.public static B t1 = new B();
2.public static B t2 = new B();
3.static
{
System.out.println(“静态块”);
}
4.B t = new B();
{
System.out.println(“构造块”);
}
在加载类的时候:
所以前两个static的对象作为当构造对象,输出构造块
然后输出静态块
最后创建对象t,再次输出构造块