一次面试题总结

1、  equals方法与hashcode的区别是什么?为什么一般重写equals都会重写hashcode方法?不重写hashcode会有什么影响?

Ø  对象在没有重写equals方法的时候是用的==一样的方式(比较内存地址)

Hashcode是用来计算对象hash值的,equals是用来比较两个对象的值是否一样;

Ø  Equals相等一定要有相同的hashcode相等,hashcode不同equals一定不同,而hashcode相等的不一定equals相等。

2、  为什么说HashTable是线程安全而HashMap是线程不安全的?这两个类的hash算法一样吗?

Ø  在HashMap中计算hash值:(key ==null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);在HashTable中计算hash值:int hash =key.hashCode(); //直接使用object中的hashcode

Ø  在HashMap或hashTable中重写equals方法的时候一定需要重写hashcode,两个相同的值会不同的hashcode会导致有两个重复的值存入

Ø  HashTable中的put方法是同步的,而HashMap中不是;

Ø  HashMap中key可以允许为空值 HashTable不行,因为key.hascode会报空指针

3、  HashMap中的冲突链是怎样存储数据的?

冲突链表其内部是一个单向链表,如果多次存入key相同直接覆盖掉原来的值。如果存入的key hashcode相同但是key不相等这时候就产生了hash冲突;

Hashcode

Equals(值)

Result

不同

Hash冲突

不同

不同

存入

覆盖原有数据

不同

不存在

 

4、  HashTable与HashMap之间的区别?

 

HashMap

HashTable

K,V是否为空

方法是否同步

效率

Key的Hash值经过计算

 

5、  HashMap 并发问题的标志或产生异常是什么?

HashMap产生并发问题之后会抛出ConcurrentModificationException异常

6、  String、StringBuilder、StringBuffer之间的区别?

Ø  String内部的存储结构:private final char value[];

StringBuilder/StringBuffer是继承自AbstractStringBuilder的char[]value;

Ø  String、StringBuidler、StringBuffer都是final修饰的类,为什么String是不可变对象呢?

由于内部存储结构的原因,并不是因为final修饰了类

Ø  String 线程安全,因为是不可变的操作(修改等)都是不同的对象

StringBuffer线程安全 加了synchronized关键字修饰

StringBuilder线程不安全

Ø  StringBuilder与StringBuffer共同继承自AbstractStringBuilder(抽象类)

7、  Synchronized与ReentrantLock之间的区别?

Ø  ReetrantLock与synchronized(隐式监控器锁)相比具有相同的语义和行为,但功能更强大;

Ø  Sychronized一个线程获取锁之后,另外的线程就只能一直等待下去,不能中断;

Ø  ReetrantLock获取锁的方式:

lock():如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁

tryLock(): 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;

tryLock(long timeout,TimeUnit unit),   如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;

lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断

Ø  Synchronized是在JVM层面上实现的,Lock通过代码实现加锁的,需要手动释放unlock

Ø  并发量小的情况使用synchronized并发量大的情况使用ReetrantLock

 

8、  ConcurrentHashMap中锁实现机制?

Ø  ConcurrentHashMap采用分片式锁,segment extends ReetrantLock;每个分片对应一个 hash table;

 

ConcurrentHashMap结构

Ø  ConcurrentHashMap类中包含了两个静态内部类HashEntry和Segment;

Segment用于充当锁的角色,HashEntry用来封装映射表的Key-Value; 每个 Segment 对象守护整个散列映射表的若干个桶。每个桶是由若干个 HashEntry 对象链接起来的链表。一个 ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。

Ø  ConcurrentHashMap读取操作是没有加锁的,新增和删除操作是同segment来是实现加锁的

9、  分布式锁的实现原理?

ZooKeeper的应用场景之一就是实现分布式锁

10、JVM内存模型以及优化?

JVM运行时分为:程序计数器(ProgramCounter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。

详细内容参考《Java虚拟机规范》

11、ClassLoader的工作原理

         JVM加载类时默认采用的是双亲委派机制。

       类加载器分为:BootStrapClassLoader、ExtensionClassLoader、AppClassLoader(SystemClassLoader)、ClassLoader(自定义)

12、GC原理

分为:Young Generation 、Old Generation 、Perm Generation

13、简述NIO工作原理

         NIO有三个重要部分组成Buffer/Channel/Selector

         传统IO是靠字节或字符进行传输,NIO是靠Buffer进行传输一次可以传输一个Buffer

         非阻塞式IO

         Buffer中三个重要属性: position 、limit、capacity

         Buffer模式转换:flip(): 写模式转换成读模式; clear() :清空 buffer ,准备再次被写入;

       rewind() :将 position重置为 0,一般用于重复读

14、自己实现一个高并发处理的服务端?Selector Reactor模型

 

15、简述SpringMVC工作原理?

 

 

16ActiveMQRabbitMQ的区别?

 

17RabbitMQ消息队列模型?

 

18、如何保证消息被顺序消费?

 

19、如何保证消息消费完成之后从队列里面去除?

 

20ZooKeeper集群架构

 

21Redis集群架构?

 

22、简述Redis分布式缓存?

 

23MySQL的索引是用什么数据结构?

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值