学习笔记
内容有点混乱
- Intern()方法会把首次遇到的字符串实例复制到永久代中,返回的是永久代中这个字符串实例的引用。在jdk1.7中intern()实现不会再复制实例,只是在常量池中记录首次出现的实例。
- 数组没有length()方法。有length属性。String 有length()方法;
- 在最外层循环前添加一个标记A 使用break A;可以跳出多重循环。
- instanceof可以检查参数是否为正确类型
- java语言方法调用只支持值传递
- 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?
- String s = “abc” + “ddd”; 这种方法效率最高,没有疑问的。反编译看也根本没有用到builder,JVM直接把s = “abcddd”。当+连接出现对象的时候才会新建builder,而且几行+号就有几个builder,当然分号结尾才算一行。https://blog.csdn.net/chang384915878/article/details/79535708
- String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。
字符串的+操作其本质是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理成String对象,这一点可以用javap -c StringEqualTest.class命令获得class文件对应的JVM字节码指令就可以看出来。
要想获取对象的内存地址应使用System.identityHashCode()方法。
- 类加载原理:JVM中类的加载是由类加载器和他的子类实现的,java中的类加载器是一个重要的java运行时系统组件,他负责在运行时查找和装入类文件中
- 类加载器包括根加载器、扩展加载器、系统加载器、和用户自定义类加载器classLoader的子类
- Tcp四次挥手为什么要等待2MSl
- 要保证TCp协议的全双功链接能够可靠关闭
- 要保证这次链接中重复的数据段能从网络中消失,防止端口被重用的时候发生数据混淆
- 断链的时候,两个方向的数据停止时间可能不相同,不能合并 FIn ack
-
设计模式
- 单利模式线程安全实现
- 工厂模式:Spring如何创建BEan
- 代理模式:matan服务的动态代理
- 责任链模式 :netty消息处理方式
- 适配器模式 SLF4j 如何支持Log 4j
- 观察者模式 GRPC 支持流式请求
- 构造者模式 PB序列化中的Builder
-
对象引用
- 强引用 不会被 GC回收
- 弱引用 每次GC都会回收
- 软引用 当内存空间不足时回收
- 虚引用 必须和队列一起使用 主要用于跟踪一个对象被垃圾回收的过程
-
JVM
1. 内存模型
* 线程独占 : 栈 本地方法栈 程序计数栈:当前线程字节码位置 只为java方法服务 不为native方法提供服务 为空
* 线程共享: 堆 :存放对象实例 方法区:被虚拟机加载的类信息,常量,变量,永久代也在方法区中
2. JMM
- 类的加载与卸载
由java虚拟机自带的类加载器加载的类,在整个生命周期是不会被卸载的
-
三种自带的类加载器 双亲委派模式
双亲委派模式:避免类重复加载 java核心API被串改- Bootstrap <JAVA_HOME>/lib
- ExtClassLoader <java_home>/lib/ext
- APpClassLoader java -classpath
- Custom ClassLoader 自定义类加载器
-
分代回收
年轻代
老年代
永久代 -
CMS算法
优点:并发收集 停顿小 -
G1算法 1.9以后默认算法 逻辑分代 非物理分代
保持高回收率的同时,减少停顿 -
ZGC 针对大内存堆的低延迟垃圾回收算法
1. 着色指针
2. 读屏障
3. 并发处理
4. 基于Region 动态
5. 内存压缩(整理 ) -
考察点:
深入理解jvm内存模型
了解类加载机制
了解内存可见性
了解常用的GC算法实现和使用场景
能够根据业务场景选择合适JVM参数GC算法 -
加分项:
1. 编译器优化
2. 问题排查经验与思路
3. JVM调优经验和调优思路
4. 了解最新的技术趋势( 列如 ZGC Graalvm) -
JVM面试题
- 描述一下JVM的内存模型?
- 什么情况下会触发FUllGC?
* 年轻代晋身为老年代 老年代内存空间不足 永久代空间不足 - Java类加载器有几种 关系是怎样的?
- 双亲委派机制的加载流程是怎样的,有什么好处
- 1.8 为什么用Metaspace 替换掉 PermGen ? Metaspace 保存在哪里
- 编译期会对指令做哪些优化 (简单描述编译器的指令重排)
- 简单描述一下volatile可以解觉什么问题? 如何做到的?
- 强制主内存读写同步 防止指令重排序
- 简单描述一下GC的分代回收
- G1垃圾回收算法与CMS的区别有哪些
- 对象引用有哪几种方式 有什么特点
- 使用过哪些JVM调试工具 ,主要分析哪些内容
并发与多线程
- 产生死锁的四个条件
互斥
请求并持有
非剥夺
循环等待 - 线程状态的转换
- CAS与ABA问题
4. Synchronized
5. AQS yu与lock
6. 线程池适用场景
7. JUC常用工具
8. 考察点
9. 加分项
10.面试题
数据结构与算法
- 介绍
- B 树
- 字符串匹配问题
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class Test {
public static void main(String[] args) {
String str = " {{{asdfasd}}}";
System.out.println("isMatch(str) = " + isMatch(str));
}
private static final Map<Character, Character> brackets = new HashMap<>();
static {
brackets.put(')','(');
brackets.put('}','{');
brackets.put(']','[');
brackets.put('>','<');
}
public static boolean isMatch(String str) {
if (str == null) {
return false;
}
Stack<Character> stack = new Stack();
for (char ch : str.toCharArray()) {
if (brackets.containsValue(ch)) {
stack.push(ch);
} else if (brackets.containsKey(ch)) {
System.out.println("stack = " + stack.empty());
System.out.println("stack = " + stack.pop());
if (stack.empty() || stack.pop() != brackets.get(ch)) {
return false;
}
}
}
return stack.isEmpty();
}
}
6. topk 热门排行
7. 常用算法介绍
8. 考察点
9. 面试题
Spring全家桶
- 知识点汇总
- spring中的基本概念
- spring content 初始化流程
- spring 生命周期
- spring 扩展接口
- spring boot
- netty
- rpc远程过程调用
- mybatis
10.考察点 - 面试题
缓存
- 知识点
- mc
- redis
- 考察点
- 面试题
MySQL
- 知识点
- mysql索引
- mysql优化
- 考察点
- 面试
- 单架构
- 微服务架构