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工作原理?
16、ActiveMQ与RabbitMQ的区别?
17、RabbitMQ消息队列模型?
18、如何保证消息被顺序消费?
19、如何保证消息消费完成之后从队列里面去除?
20、ZooKeeper集群架构
21、Redis集群架构?
22、简述Redis分布式缓存?
23、MySQL的索引是用什么数据结构?
16万+

被折叠的 条评论
为什么被折叠?



