java学习笔记--面试题

学习笔记

内容有点混乱

  1. Intern()方法会把首次遇到的字符串实例复制到永久代中,返回的是永久代中这个字符串实例的引用。在jdk1.7中intern()实现不会再复制实例,只是在常量池中记录首次出现的实例。
  2. 数组没有length()方法。有length属性。String 有length()方法;
  3. 在最外层循环前添加一个标记A 使用break A;可以跳出多重循环。
  4. instanceof可以检查参数是否为正确类型
  5. java语言方法调用只支持值传递
  6. 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?
  1. String s = “abc” + “ddd”; 这种方法效率最高,没有疑问的。反编译看也根本没有用到builder,JVM直接把s = “abcddd”。当+连接出现对象的时候才会新建builder,而且几行+号就有几个builder,当然分号结尾才算一行。https://blog.csdn.net/chang384915878/article/details/79535708
  1. String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。
    字符串的+操作其本质是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理成String对象,这一点可以用javap -c StringEqualTest.class命令获得class文件对应的JVM字节码指令就可以看出来。
    要想获取对象的内存地址应使用System.identityHashCode()方法。
  1. 类加载原理:JVM中类的加载是由类加载器和他的子类实现的,java中的类加载器是一个重要的java运行时系统组件,他负责在运行时查找和装入类文件中
  1. 类加载器包括根加载器、扩展加载器、系统加载器、和用户自定义类加载器classLoader的子类
  1. Tcp四次挥手为什么要等待2MSl
  1. 要保证TCp协议的全双功链接能够可靠关闭
  2. 要保证这次链接中重复的数据段能从网络中消失,防止端口被重用的时候发生数据混淆
  3. 断链的时候,两个方向的数据停止时间可能不相同,不能合并 FIn ack
  1. 设计模式

    • 单利模式线程安全实现
    • 工厂模式:Spring如何创建BEan
    • 代理模式:matan服务的动态代理
    • 责任链模式 :netty消息处理方式
    • 适配器模式 SLF4j 如何支持Log 4j
    • 观察者模式 GRPC 支持流式请求
    • 构造者模式 PB序列化中的Builder
  2. 对象引用

    • 强引用 不会被 GC回收
    • 弱引用 每次GC都会回收
    • 软引用 当内存空间不足时回收
    • 虚引用 必须和队列一起使用 主要用于跟踪一个对象被垃圾回收的过程
  3. JVM
    1. 内存模型
    * 线程独占 : 栈 本地方法栈 程序计数栈:当前线程字节码位置 只为java方法服务 不为native方法提供服务 为空
    * 线程共享: 堆 :存放对象实例 方法区:被虚拟机加载的类信息,常量,变量,永久代也在方法区中
    2. JMM

基本数据类型读或写long double 除外
原子性
synchronized
可见性
volatile
有序性
happens-before 原则
  1. 类的加载与卸载
    由java虚拟机自带的类加载器加载的类,在整个生命周期是不会被卸载的

类的加载与卸载

  1. 三种自带的类加载器 双亲委派模式
    双亲委派模式:避免类重复加载 java核心API被串改

    1. Bootstrap <JAVA_HOME>/lib
    2. ExtClassLoader <java_home>/lib/ext
    3. APpClassLoader java -classpath
    4. Custom ClassLoader 自定义类加载器
  2. 分代回收
    年轻代
    老年代
    永久代

  3. CMS算法
    优点:并发收集 停顿小

  4. G1算法 1.9以后默认算法 逻辑分代 非物理分代
    保持高回收率的同时,减少停顿

  5. ZGC 针对大内存堆的低延迟垃圾回收算法
    1. 着色指针
    2. 读屏障
    3. 并发处理
    4. 基于Region 动态
    5. 内存压缩(整理 )

  6. 考察点:
    深入理解jvm内存模型
    了解类加载机制
    了解内存可见性
    了解常用的GC算法实现和使用场景
    能够根据业务场景选择合适JVM参数GC算法

  7. 加分项:
    1. 编译器优化
    2. 问题排查经验与思路
    3. JVM调优经验和调优思路
    4. 了解最新的技术趋势( 列如 ZGC Graalvm)

  8. JVM面试题

    1. 描述一下JVM的内存模型?
    2. 什么情况下会触发FUllGC?
      * 年轻代晋身为老年代 老年代内存空间不足 永久代空间不足
    3. Java类加载器有几种 关系是怎样的?
    4. 双亲委派机制的加载流程是怎样的,有什么好处
    5. 1.8 为什么用Metaspace 替换掉 PermGen ? Metaspace 保存在哪里
    6. 编译期会对指令做哪些优化 (简单描述编译器的指令重排)
    7. 简单描述一下volatile可以解觉什么问题? 如何做到的?
      1. 强制主内存读写同步 防止指令重排序
    8. 简单描述一下GC的分代回收
    9. G1垃圾回收算法与CMS的区别有哪些
    10. 对象引用有哪几种方式 有什么特点
    11. 使用过哪些JVM调试工具 ,主要分析哪些内容

    并发与多线程

    1. 产生死锁的四个条件
      互斥
      请求并持有
      非剥夺
      循环等待
    2. 线程状态的转换 线程的转态转换
    3. CAS与ABA问题

在这里插入图片描述
4. Synchronized在这里插入图片描述
5. AQS yu与lock在这里插入图片描述
6. 线程池适用场景
在这里插入图片描述
7.
在这里插入图片描述
7. JUC常用工具在这里插入图片描述

在这里插入图片描述
8. 考察点在这里插入图片描述
9. 加分项在这里插入图片描述
10.面试题

在这里插入图片描述
在这里插入图片描述

数据结构与算法

  1. 介绍在这里插入图片描述在这里插入图片描述
  2. B 树在这里插入图片描述在这里插入图片描述
  3. 字符串匹配问题在这里插入图片描述
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全家桶

  1. 知识点汇总在这里插入图片描述
  2. spring中的基本概念
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  3. spring content 初始化流程在这里插入图片描述
  4. spring 生命周期在这里插入图片描述
  5. spring 扩展接口在这里插入图片描述
  6. spring boot在这里插入图片描述
  7. netty在这里插入图片描述在这里插入图片描述
  8. rpc远程过程调用在这里插入图片描述在这里插入图片描述
  9. mybatis在这里插入图片描述在这里插入图片描述
    10.考察点在这里插入图片描述在这里插入图片描述
  10. 面试题在这里插入图片描述在这里插入图片描述

缓存

  1. 知识点在这里插入图片描述
  2. mc在这里插入图片描述
  3. redis在这里插入图片描述在这里插入图片描述在这里插入图片描述
  4. 考察点在这里插入图片描述在这里插入图片描述
  5. 面试题在这里插入图片描述

MySQL

  1. 知识点在这里插入图片描述
  2. mysql索引在这里插入图片描述
  3. mysql优化在这里插入图片描述在这里插入图片描述
  4. 考察点在这里插入图片描述在这里插入图片描述
  5. 面试在这里插入图片描述
  6. 单架构在这里插入图片描述
  7. 微服务架构在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值