阿里二面

    1. object hashCode 和 equals 方法的作用
      equals 比较两个对象是否相等,hashcode计算对象的哈希值
    2. 重写equals需要重写hashCode吗
      根据不同的业务场景,我们需要根据实际情况来重写hashCode,涉及到子类继承的问题,当子类存在额外的属性时,必须重写子类的hashCode。
    3. RuntimeException和Exception有什么区别 常见的RunTimeException

      RuntimeException 是Exception子类。RunTimeException:运行时异常,又称不受检查异常继承Exception,比如NullPointerException,IndexOutOfBoundsException,
      RunTimeException:运行时异常,又称不受检查异常继承Exception

    4. 拆装箱 Integer a = new Integer(13); Integer b = new Integer(13); int c = 13; abc?

      当包装类型对象和基本数据类型通过==比较时,会进行拆装箱操作,相同包装类型比较比较的是内存地址,a==b false a==c true b==c ture

    5. String s = new String(“abc”) 会创建几个对象

      1. 两个: 设计到String变量初始化的原理,当我们使用=="abc"时,jvm会先检查常量池中是否存在一样的字符对象,如果存在则不再开辟内存,直接将该地址赋予对象,当使用new 方式创建对象,则会新开辟内存地址进行赋值,开发中通常推荐使用直接声明方式。
    6. ArrayList 和 LinkedList 区别 如何实现增删扩容 CopyOnWriteArrayList特点

      ArrayList底层是数组,查询快、增删慢;LinkedList底层是双向链表,查询慢、增删快。
      ArrayList增加时需要判断元素数量,决定是否进行扩容操作,扩容一般为数量个数的1.5倍,所以当知道数组长度时,应在列表初始化时,就声明对应的长度,减少扩容引发的时间损耗。删除时,分两种情况,一为直接根据下标进行删除,一为根据元素对象进行删除,底层都是使用了系统数组copy的方式,将删除元素置为null,然后进行元素移动。
      LinkedList增加删除时,直接修改对应节点的prev和next,不存在扩容操作。
      CopyOnWriteArrayList通常用于读多写少的高并发场景,CopyOnWriteList 只能保证数据的最终一致性,不能保证数据的实时一致性

    7. for循环和迭代器有什么区别

    都属于遍历集合数据的一种方案,在读取集合时,两者差别不大。当进行删除操作时,for循环调用集合的remove方法会导致集合产生变化导致错误,应使用迭代器的remove方法。

    1. hashmap相关 以及 hashMap1.8的变动 以及 concurrentHashMap

      hashmap 在1.7实现采用数组+链表,1.8之后采用数组+链表+红黑树实现<br />       hashmap 特点: 非线程安全无序集合,key,value可为null,当key重复时,会进行数据覆盖。<br />concurrentHashMap是线程安全的集合,采用分段锁的方式提供集合的并发性能。
      
    2. 类加载机制 双亲委派 以及优点 能否打破

       类加载机制两种:全盘负责委托机制和双亲委派机制<br />全盘负责委托机制:如果不指定类加载器,就会将该类以及所依赖的类都加载。<br />双亲委派机制:先加载BootstarpClassLoader,如果没有就加载ExtClassLoader拓展类加载器,还是没有的话加载ApplicationClassLoader系统类加载器,<br />优点:沙箱安全,防止jdk核心类库被修改破坏,避免加载重复类。
      
    3. jvm 内存模型 及 1.7 1.8 的优化 为什么这么优化

    JDK1.8与JDK1.7最大的区别是:JDK1.8将永久代取消,取而代之的是元空间,在JDK1.8中方法区是由元空间来实现,所以原来属于方法区的运行时常量池就属于元空间了。
    元空间属于本地内存,所以元空间的大小仅受本地内存限制,但是可以通过-XX:MaxMetaspaceSize进行增长上限的最大值设置,默认值为4G,元空间的初始空间大小可以通过-XX:MetaspaceSize进行设置,默认值为20.8M,还有一些其他参数可以进行设置,元空间大小会自动进行调整。

    1. 垃圾回收算法 以及 什么时候会提前进入老年代 CMS G1工作原理

    当对象为空或者长时间没有引用时,将被回收清除出内存。

    1. ThreadLocal 实现原理以及场景

    线程局部变量,变量在线程内部使用,与其他线程无关。

    1. 线程生命周期

    新建,就绪,运行,阻塞,死亡。

    1. 什么是守护线程

    守护线程是一种特殊的线程,当进程中不存在非守护线程时,则守护线程会自动销毁。

    1. 如何保证main方法在线程执行完毕后再退出 join 方法 及原理

    2. 线程池相关 以及 cpu密集和io密集型线程池大小设置
      cpu密集会压榨CPU 减少线程数 减少上下文切换时间 Ncpu+1
      io密集型io操作较多可增加线程数 经验值 2*Ncpu

    3. synchronized 原理,修饰类 方法 静态方法 1.6之后的优化

    synchronized 可以修饰类 ,静态方法,代码块进行加锁,应用于多线程环境下。
    1.6之后的优化: 锁膨胀,从偏向锁-轻量级锁—重量级锁。
    轻量级锁通过CAS(自旋锁)实现,当出现两个线程争抢锁资源时,将会升级成重量级锁。

    1. Lock和syncronized的区别

    Lock 是一个接口,syncronized属于关键字,syncronized在发生异时,会自动释放占有的锁,不会引发死锁问题,而Lock发生异常时,不会释放锁,必须手动释放锁,会导致死锁的发生。

    1. volatile特性 能保证线程安全码

    volatile 关键字是用来保证数据的可见性,特性:可见性,有序性,线程不安全性

    1. 单例模式 以及 实现方式

    懒汉式,饿汉式 采用声明静态方法获取实例,或者采用双重锁+原子性,枚举方式。

    1. 常用设计模式

    单例模式,工厂模式,代理模式

    1. mysql varchar和char 的区别 及什么场景进行选择 存储货币使用什么类型 decimal

    varchar 属于不定长字符,char定长字符。当确定数据长度时,使用char,可以节省空间。

    1. 介绍一下mysql存储引擎

    innodb ,myisam,innodb支持事务,使用于较高并发读取的应用使用innodb,当创建对事务不敏感以及大量查询的场景下使用myisam。

    1. 聚簇索引和非聚簇索引区别 什么是覆盖索引聚簇索引的特点是叶子节点包含了完整的记录行,而非聚簇索引的叶子节点只有所以字段和主键ID。
    2. 事务隔离级别 以及 每个级别会出现的问题
    3. innodb如何实现事务
    4. mvcc聊一下 以及实现方式
    5. mysql 高可用方案
    6. mysql binLog的格式有哪几种
    7. redis 有哪几种数据格式 及 使用场景
    8. redis持久化方式
    9. redis如何保证高可用
    10. redis集群模式和哨兵模式 如何实现
    11. redis内存满了怎么办 (淘汰策略) 有哪些淘汰策略
    12. 缓存热点问题如何解决
    13. 为什么要使用xspring 以及 IOC AOP (bean生命周期)
    14. 什么是循环依赖 spring 如何检测循环依赖
    15. Autowired 和 resource 区别
    16. spring 事务传播机制 默认是哪种
    17. spring 创建bean的过程, 如何实现依赖注入
    18. springboot比spring的优势 以及 自动配置原理
    19. bio和nio区别 以及 nio执行原理
    20. 什么是堆外内存
    21. tcp粘包和拆包原因及解决方案
    22. 微服务的 cap 和 base 理论
    23. linux常用命令 例:查找文件 find命令 排查性能 top 关心哪些指标
    24. 快速删除数组中重复的元素 如何实现
    25. 合并两个链表并排序 如何实现
    26. 如何快速检测到链表死链