emmm……瞎几把画的一些总结





【基础】

  • int float short double long char 占字节数?
int 占 4 字节
short 占 2 字节
long 占 8 字节 
float 占 4 字节
double 占 8 字节
char 占 2 字节
  • int 范围?float 范围?
int 范围 -2^31~2^31-1
float 范围 -3.4E+38~3.4E+38
  • hashcode 和 equals 的关系
两个对象equals方法相等时hashCode方法一定相等,但hashCode方法相等时equals方法不一定相等
因为如果没有重写hashCode方法,无法保证两个对象equals时hashCode比逊相等的条件
  • 深拷贝、浅拷贝区别
浅拷贝: 值类型字段进行复制 引用类型字段复制引用不复制引用的对象
深拷贝: 不管值类型还是引用类型都复制独一份
  • java 异常体系?RuntimeException Exception Error 的区别,举常见的例子
异常的超类为Throwable 之下有error和Exception两个子类
erro: 错误程序不能运行本身没办法解决
Exception: 程序可以运行可以捕捉到的异常本身可以解决
RuntimeException: 运行时异常程序在运行时发生的异常可以捕获也可以不捕获

【集合】

集合这块关注一下 1.8 的实现吧,和 1.7 相比变化了很多

  • Collection 有什么子接口、有哪些具体的实现
Collection主要包括两个子接口Set和List
List: ArrayList LinkedList Vector 
Set: HashSet TreeSet 
  • 讲一下 hashMap 原理。hashMap 可以并发读么?并发写会有什么问题?
jdk7在实例化以后,底层创建了长度是16的一维数组Entry[] table。
...可能已经执行过多次put...
map. put(key1, value1):
首先,调用key1所在类的hashCode() 计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组 中的存放位置。
如果此位置上的数据为空,此时的key1-value1添加成功。---- 情况1
如果此位置上的数据不为空,(意味着此位置上存在一个或多个数据(以链表形式存在)),比较key1和已经存在的一个或多数据的哈希值:
    如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1 添加成功。----情况2
    如果key1的哈希值和已经存在的某一个数据(key2-value2)的哈希值相同,继续比较:调用key1 所在类的equals(key2)
        如果equals()返回false:此时key1-value1添加成功。---- 情况3
        如果equaLs()返回true:使用value1替换value2。
补充:关于情况2和情况3:此时key1 -value1和原来的数据以链表的方式存储。
jdk8相较于jdk7在底层实现方面的不同:
    1. new HashMap(): 底层没有创建-一个长度为16的数组
    2. jdk 8底层的数组是: Node[], 而非Entry[]
    3.首次调用put()方法时,底层创建长度为16的数组
    4. jdk7底层结构只有:数组+链表。jdk8 中底层结构:数组+链表+红黑树。
    当数组的某一个索引位置上的元素以链表形式存在的数据个数> 8且当前数组的长度> 64时,此时此索引位置上的所有        数据改为使用红黑树存储。
  • 集合在迭代的过程中,插入或删除数据会怎样?
会抛出java.util.ConcurrentModificationException的异常

【并发】

【线程】

  • 进程和线程的区别?并行和并发的区别?了解协程么?
进程: 通俗理解一个运行起来的程序或者软件叫做进程
线程:进程中独立、可调配的执行单位,最小的执行单位

普通解释:

  并发:交替做不同事情的能力

  并行:同时做不同事情的能力

专业术语:

  并发:不同的代码块交替执行

  并行:不同的代码块同时执行
  • 线程的生命周期有哪些状态?怎么转换?
New(初始化状态)
Runnable(可运行 / 运行状态)
Blocked(阻塞状态)
Waiting(无限时等待)
Timed_Waiting(有限时等待)
Terminated(终止状态)
  • wait 和 sleep 有什么区别?什么情况下会用到 sleep?
sleep是thread类的静态方法 wait是Object的动态方法 
sleep让出CPU资源,不释放锁 wait让出CPU资源,也释放锁
wait需要结合同步锁使用,sleep不需要
sleep必须传入时间参数,wait可以传也可以不传
  • 怎么停止线程?
interrupt()方法

volatile关键字
public class Demo1 {
    private static volatile boolean stop = false;
    public static void main(String[] args) throws InterruptedException{
        Thread thread = new Thread(()->{
            inti=0;
            while(!stop) {
                i++;
            }
        }) ;
        thread.start();
        System.out.println("线程开始”) ;
        Thread.sleep( millis: 1000) ;
        stop = true 
    }
}
  • 怎么控制多个线程按序执行?
使用join()方法
利用Executors线程池
  • volatile 关键字有什么用?怎么理解可见性,一般什么场景去用可见性
Volatile关键字的主要作用是使变量在多个线程之间可见,使得多线程之间可以进行变量的变更
  • 讲一下 threadLocal 原理,threadLocal 是存在 jvm 内存哪一块的
每个线程内部都有一个Map,我们每当定义一个ThreadLocal变量,就相当于往这个Map里放了一个key,并定义一个对应的value。每当使用ThreadLocal,就相当于get(key),寻找其对应的value

【线程池】

  • 常用的线程池有哪些?用的哪个线程池?什么情况下怎么选择?
newFixedThreadPool:创建固定大小的线程池
newCaChedTheadPool:创建可缓存的线程池
newScheduleThreadPool:创建大小无限的线程池
newSingleTreadExecutor:创建单线程的线程池
  • 什么是线程池? 为什么要使用它?
创建线程需要花费昂贵的时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程创建的线程数是有限的,为了避免这些问题,在启动程序的时候就创建若干线程来处理响应,他们被称为线程池

【JVM】

【内存与 GC】

  • jvm 内存区域分布?gc 发生在哪些部分?
程序计数器
栈
本地方法栈
堆
方法区
gc 发生在堆中
  • 垃圾回收算法的了解。现在用的什么回收算法?
标记-清除算法
复制算法
标记整理算法
分代收集算法

【异常与调优】

  • oom
OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。
当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error

最常见的OOM情况有以下三种:
    java.lang.OutOfMemoryError: Java heap space ------>java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。
    java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法区溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。
    java.lang.StackOverflowError ------> 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。

【类加载器】

  • 类加载过程?
1.加载是将class文件加载到虚拟机中,在jvm的方法区中生成该类的类信息.在jvm的堆中生成java.lang.class对象.
2.连接分为: 验证,准备,解析.
   验证-> class文件格式,元数据验证,字节码验证,符号引用验证.
   准备-> 为类变量分配内存并设置类变量初始值(赋0)的阶段.
   解析-> 符号引用转为直接引用
3.初始化
   执行类构造器 

【Spring】

  • spring 介绍一下
Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架
  • 讲一下 IOC、AOP
IOC(控制反转):Inverse of Control 
    将对象的创建权反转到Spring容器主要目的是用来解耦
AOP(面向切面):
    AOP是一种编程思想,是基于OOP基础之上更高级的一种编程思想,可以说是OOP的一种补充和完善
    AOP利用一种横切技术,将一些公共行为封装到一个可以重用的模块,并将其成为切面(Aspect)
AOP相关概念:     
    连接点joinpoint
    切入点pointcut
    通知advice
    目标对象target
    代理对象proxy
    织入weaving
    切面aspect
  • IOC怎么防止循环依赖
SpringIOC解决循环依赖的思路就是依靠缓存,当我们创建实例与属性注入实例这俩个步骤之间的时候,我们引入缓存,将这些已经创建好但是并没有注入属性的实例放到缓存里,而这些放在缓存里但是没有被注入属性的实例对象,就是解决循环依赖的方法,打个比方:A对象的创建需要引用到B对象,而B对象的创建也需要A对象,而此时当B对象创建的时候直接从缓存里引用A对象(虽然不是完全体A对象,毕竟没有赋值处理),当B对象完成创建以后再被A对象引用进去,则A对象也完成了创建。
  • AOP的实现原理、动态代理过程\
JDK动态代理 Cglib动态代理
  • Spring MVC处理请求的过程?
浏览器发送请求
前端控制器(DIspatcherServlet)拦截客户请求,根据指定的处理器映射器找到对应的处理器
根据不同的处理器,使用不同的处理器适配器转化后,执行处理器
处理器处理完请求后返回ModelAndView
前端控制器根据ModelAndView找到视图解析器对返回结果进行解析,解析完成后找到对应的view做出响应

【 MySQL】

  • 数据仓库与 mysql 区别?hive 和 mysql 有什么区别?spark 和 hadoop 区别?mapreduce 互相等待,怎么解决?
  • acid 含义?事务隔离级别?幻读怎么解决的?
  • 用过 mysql 的锁么?有哪些锁?
  • MyISAM、InnoDB 区别?为什么不用 MyISAM?
  • mvcc 原理?多版本数据存放在哪?
  • mysql 脏页?
  • redo log,undo log?
  • 索引
    • innodb 的索引结构是什么?什么是聚簇索引?
    • b+ 树与 b 树的区别?
    • b+ 树与二叉树区别,优点?为什么不用红黑树?
    • 多列索引的结构
    • 字符串类型和数字类型索引的效率?数据类型隐式转换
    • 主键与普通索引的联系?存储上的区别?
  • sql
    • join 和 in 怎么选择?有什么区别?
    • union 和 union all 有什么区别?怎么选择?
    • 怎么处理 sql 慢查询?
    • 索引用得不太正常怎么处理?同时有(a,b)和(a,c)的索引,查询 a 的时候,会选哪个索引?
  • 跨库分页的实现?
  • 分库分表有哪些策略?怎么保证 id 唯一?
  • 对 uuid 的理解?知道哪些 GUID、Random 算法?
  • 主键选随机 id、uuid 还是自增 id?为什么?主键有序无序对数据库的影响?
  • 主从复制的过程?复制原理?怎么保证强一致性?

【设计模式】

  • 工厂方法和抽象工厂的区别
  • 装饰器和代理区别
  • 单例
    • 对于单例,你知道哪些实现方法?
    • 实现一个懒加载单例
    • 双重校验锁为什么需要双重校验?

施工中...

您的喜欢是作者写作最大的动力!❤️
  • PayPal
  • AliPay
  • WeChatPay
  • QQPay
YAN