阿里二面
- object hashCode 和 equals 方法的作用
equals 比较两个对象是否相等,hashcode计算对象的哈希值 - 重写equals需要重写hashCode吗
根据不同的业务场景,我们需要根据实际情况来重写hashCode,涉及到子类继承的问题,当子类存在额外的属性时,必须重写子类的hashCode。 RuntimeException和Exception有什么区别 常见的RunTimeException
RuntimeException 是Exception子类。RunTimeException:运行时异常,又称不受检查异常继承Exception,比如NullPointerException,IndexOutOfBoundsException,
RunTimeException:运行时异常,又称不受检查异常继承Exception拆装箱 Integer a = new Integer(13); Integer b = new Integer(13); int c = 13; abc?
当包装类型对象和基本数据类型通过==比较时,会进行拆装箱操作,相同包装类型比较比较的是内存地址,a==b false a==c true b==c ture
String s = new String(“abc”) 会创建几个对象
两个: 设计到String变量初始化的原理,当我们使用=="abc"时,jvm会先检查常量池中是否存在一样的字符对象,如果存在则不再开辟内存,直接将该地址赋予对象,当使用new 方式创建对象,则会新开辟内存地址进行赋值,开发中通常推荐使用直接声明方式。
ArrayList 和 LinkedList 区别 如何实现增删扩容 CopyOnWriteArrayList特点
ArrayList底层是数组,查询快、增删慢;LinkedList底层是双向链表,查询慢、增删快。
ArrayList增加时需要判断元素数量,决定是否进行扩容操作,扩容一般为数量个数的1.5倍,所以当知道数组长度时,应在列表初始化时,就声明对应的长度,减少扩容引发的时间损耗。删除时,分两种情况,一为直接根据下标进行删除,一为根据元素对象进行删除,底层都是使用了系统数组copy的方式,将删除元素置为null,然后进行元素移动。
LinkedList增加删除时,直接修改对应节点的prev和next,不存在扩容操作。
CopyOnWriteArrayList通常用于读多写少的高并发场景,CopyOnWriteList 只能保证数据的最终一致性,不能保证数据的实时一致性for循环和迭代器有什么区别
都属于遍历集合数据的一种方案,在读取集合时,两者差别不大。当进行删除操作时,for循环调用集合的remove方法会导致集合产生变化导致错误,应使用迭代器的remove方法。
hashmap相关 以及 hashMap1.8的变动 以及 concurrentHashMap
hashmap 在1.7实现采用数组+链表,1.8之后采用数组+链表+红黑树实现<br /> hashmap 特点: 非线程安全无序集合,key,value可为null,当key重复时,会进行数据覆盖。<br />concurrentHashMap是线程安全的集合,采用分段锁的方式提供集合的并发性能。
类加载机制 双亲委派 以及优点 能否打破
类加载机制两种:全盘负责委托机制和双亲委派机制<br />全盘负责委托机制:如果不指定类加载器,就会将该类以及所依赖的类都加载。<br />双亲委派机制:先加载BootstarpClassLoader,如果没有就加载ExtClassLoader拓展类加载器,还是没有的话加载ApplicationClassLoader系统类加载器,<br />优点:沙箱安全,防止jdk核心类库被修改破坏,避免加载重复类。
jvm 内存模型 及 1.7 1.8 的优化 为什么这么优化
JDK1.8与JDK1.7最大的区别是:JDK1.8将永久代取消,取而代之的是元空间,在JDK1.8中方法区是由元空间来实现,所以原来属于方法区的运行时常量池就属于元空间了。
元空间属于本地内存,所以元空间的大小仅受本地内存限制,但是可以通过-XX:MaxMetaspaceSize进行增长上限的最大值设置,默认值为4G,元空间的初始空间大小可以通过-XX:MetaspaceSize进行设置,默认值为20.8M,还有一些其他参数可以进行设置,元空间大小会自动进行调整。
- 垃圾回收算法 以及 什么时候会提前进入老年代 CMS G1工作原理
当对象为空或者长时间没有引用时,将被回收清除出内存。
- ThreadLocal 实现原理以及场景
线程局部变量,变量在线程内部使用,与其他线程无关。
- 线程生命周期
新建,就绪,运行,阻塞,死亡。
- 什么是守护线程
守护线程是一种特殊的线程,当进程中不存在非守护线程时,则守护线程会自动销毁。
如何保证main方法在线程执行完毕后再退出 join 方法 及原理
线程池相关 以及 cpu密集和io密集型线程池大小设置
cpu密集会压榨CPU 减少线程数 减少上下文切换时间 Ncpu+1
io密集型io操作较多可增加线程数 经验值 2*Ncpu- synchronized 原理,修饰类 方法 静态方法 1.6之后的优化
synchronized 可以修饰类 ,静态方法,代码块进行加锁,应用于多线程环境下。
1.6之后的优化: 锁膨胀,从偏向锁-轻量级锁—重量级锁。
轻量级锁通过CAS(自旋锁)实现,当出现两个线程争抢锁资源时,将会升级成重量级锁。
- Lock和syncronized的区别
Lock 是一个接口,syncronized属于关键字,syncronized在发生异时,会自动释放占有的锁,不会引发死锁问题,而Lock发生异常时,不会释放锁,必须手动释放锁,会导致死锁的发生。
- volatile特性 能保证线程安全码
volatile 关键字是用来保证数据的可见性,特性:可见性,有序性,线程不安全性
- 单例模式 以及 实现方式
懒汉式,饿汉式 采用声明静态方法获取实例,或者采用双重锁+原子性,枚举方式。
- 常用设计模式
单例模式,工厂模式,代理模式
- mysql varchar和char 的区别 及什么场景进行选择 存储货币使用什么类型 decimal
varchar 属于不定长字符,char定长字符。当确定数据长度时,使用char,可以节省空间。
- 介绍一下mysql存储引擎
innodb ,myisam,innodb支持事务,使用于较高并发读取的应用使用innodb,当创建对事务不敏感以及大量查询的场景下使用myisam。
- 聚簇索引和非聚簇索引区别 什么是覆盖索引聚簇索引的特点是叶子节点包含了完整的记录行,而非聚簇索引的叶子节点只有所以字段和主键ID。
- 事务隔离级别 以及 每个级别会出现的问题
- innodb如何实现事务
- mvcc聊一下 以及实现方式
- mysql 高可用方案
- mysql binLog的格式有哪几种
- redis 有哪几种数据格式 及 使用场景
- redis持久化方式
- redis如何保证高可用
- redis集群模式和哨兵模式 如何实现
- redis内存满了怎么办 (淘汰策略) 有哪些淘汰策略
- 缓存热点问题如何解决
- 为什么要使用xspring 以及 IOC AOP (bean生命周期)
- 什么是循环依赖 spring 如何检测循环依赖
- Autowired 和 resource 区别
- spring 事务传播机制 默认是哪种
- spring 创建bean的过程, 如何实现依赖注入
- springboot比spring的优势 以及 自动配置原理
- bio和nio区别 以及 nio执行原理
- 什么是堆外内存
- tcp粘包和拆包原因及解决方案
- 微服务的 cap 和 base 理论
- linux常用命令 例:查找文件 find命令 排查性能 top 关心哪些指标
- 快速删除数组中重复的元素 如何实现
- 合并两个链表并排序 如何实现
- 如何快速检测到链表死链