HashMap 实现原理 ConcurrentHashMap 怎么实现 线程安全的。
使用 一个 Entry 数组保存数据,Entry 对象中有四个属性,分别是 key,value,next[Entry 类型的](保存不同对象拥有相同hash值的value对象,也就是 hash冲突的解决方式(链表存储))
HashMap 的扩容标准是,达到了设置的哈希因子的临界值,2备扩充,扩充方式为新建一个 Entry 数组,然后重新计算key的hash值进行拷贝存储。
ConcurrentHashMap 是一个线程安全的 hashMap 线程安全是使用 Segment 实现的,并非 直接增加 synchronized关键字
Collections.synchronizedMap(Map) 创建的 线程安全的hashmap是通过 增加 synchronized 关键字 实现的线程安全。
hashMap 中解决 哈希冲突的方法为:重写equals 和 hashCode 函数(还有其他方法,我不会。)
为什么要重写 hashCode 函数减另一篇文章 http://www.jianshu.com/p/d8069b28bb40
volatile 关键字的作用。
volatitle 只能用来修饰 属性,被修饰的属性,在多线程环境中,总能保持最新的数据(不会出现脏数据)也就是实现了线程安全:原理是 被volatile修饰的属性,不允许线程保存私有拷贝。static 修饰的变量无需增加该关键字。volatile变量可以保证下一个读取操作会在前一个写操作之后发生
Integer 考题
Integer a=999; Integer b=999; System.out.print(a==b); 输出结果是
输出false 因为 Integer 是对象类型,对象类型得通过 equals 进行比较
如果换成
Integer a = 999; System.out.print(a == 999 ); 则输出结果是 true,因为 jdk 会自动进行拆箱操作,就相当于 二个基本数据类型 int 在比较,当然是 true。
如果换成
Integer a=9; Integer b=9; System.out.print(a==b); 输出结果是 true 因为 IntegerCache 会缓存 -128 到 127 之间的数据,所以 返回 true
线程池的实现原理 (我不会)
jvm 相关内容(我不会)
二个排序好的int 数组获取交集
Java中CyclicBarrier 和 CountDownLatch有什么不同?
CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程。与 CyclicBarrier 不同的是,CountdownLatch 不能重新使用
分布式 ID 生成策略
1、利用 mysql 自增长特效,设置不同的步长 (扩展数据库数量难度大)
2、使用 uuid (字符串类型,不利于存储和增加索引,无序)
3、使用 uuid 的变种 转换为 10进制的 数字。
4、使用像 Twitter的snowflake算法
5、使用 redis 或 MongoDB的ObjectId 或 zookeeper 等第三方中间件来做
Spring 注入的方式由几种?
三种、接口类型注入、construct 注入(构造器注入)、set 注入(通过调用属性的set 方法注入)
Spring 的 bean 生命周期?
创建 - 属性注入 - init-method - 销毁 - destroy-method 超详细讲解
Spring 事务的传播性
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED 类似的操作。
mysql 的事务隔离级别有几种?(四种)
1、读取未提交行 - 会有脏读、重复读、幻读
2、读取提交行 - 会 重复读、幻读 (mysql 的默认事务级别)
3、不可重复读 - 会幻读
4、串行化 --( 一个事务部结束,其他事务只能等待,不可同时执行,所以没有 脏读,重复读,幻读风险)
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
mysql 增加索引原则
简单说说 http 协议
更多 JAVA 面试题及答案,查看小程序
暂时就记得这么多,如果有错误,欢迎指正、补充。