avatar

Java面试题7

1.HashMap集合的特性

1
2
3
4
5
6
1.HashMap是可以序列化的,是线程不安全的
2.HashMap的底层主要是基于数组和链表实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储位置的
3.HashMap中主要是通过key的hashCode来计算hash值,然后通过hash值选择不同的数组来存储;只要hashCode相同,计算出来的hash值就一样,如果存储对象多了,就有可能不同的对象计算出来的hash值是相同的,这就出现了所谓的hash冲突,HashMap的底层是通过链表来解决hash冲突的;具体就是把相同hash值的HashMap,通过链表的形式进行存储,相当于存储的数组就是哈希表,数组的每个元素都是一个单链表的头结点,链表是用来解决hash冲突的,如果不同的key映射到了数组的同一位置,那么就将其放入单链表中
4.HashMap的遍历方式比较单一,一般分两步走:
1. 获得Entry或key或value的Set集合
2. 通过Iterator迭代器遍历此Set集合

2.int和Integer的区别

1
2
3
4
Integer是int提供的封装类,int是基本数据类型中的一种
Integer的默认值是null,int的默认值是0
Integer是一个对象,需要一个引用来指向这个对象,int是基本数据类型,直接存储在内存中
声明为Integer的变量需要实例化,声明为int的变量不需要实例化

3.数据结构中的栈和队列的区别

1
2
3
栈: 后进先出
队列: 先进先出
Queue: 先进先出

4.使用Redis有哪些好处?

1
2
3
4
速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
支持丰富数据类型,支持string,list,set,Zset,hash等
支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

5.数据结构中的栈和队列的区别

1
2
3
栈: 后进先出
队列: 先进先出
Queue: 先进先出

6.InnoDB和MyISAM的区别

1
2
3
4
5
MyISAM不支持事务
MyISAM不支持外键
MyISAM支持全文索引
InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
MyISAM可以没有主键

7.MySQL优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1.优化SQL语句
尽量避免全表扫描
尽量避免在where子句中使用!=或<>
尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描
尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
2.索引
Normal普通索引没有约束,Unique唯一索引,Full Text全文索引(大文本,长消息)
使用BTree B+Tree Hash索引
BTree:左子叶节点数<父节点数,右子叶节点数>父节点数 如果树的高度太高的话,会影响查询效率,所以使用B+Tree
3.建立索引的规则
表的主键、外键必须有索引
经常查询的字段
删除无用的索引,避免对执行计划造成负面影响
索引应该建在选择性高的字段上

8.InnoDB和MyISAM的区别

1
2
3
4
5
MyISAM不支持事务
MyISAM不支持外键
MyISAM支持全文索引
InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
MyISAM可以没有主键

9.转发和重定向的区别

1
2
3
4
5
6
7
8
9
10
转发: 
1.地址栏不发生变化,显示的是上一个页面的地址
2.请求次数: 只有1次请求
3.根目录:包含了项目的访问地址
4.请求域中数据不会丢失
重定向:
1.地址栏: 显示新的地址
2.请求次数: 2
3.根目录: 没有项目的名字
4.请求域中的数据会丢失,因为是2次请求

10.RabbitMQ如何保证消息不丢失?

1
2
3
4
5
1.消息持久化: RabbitMQ的消息默认存放在内存上面,如果不特别声明设置,消息不会持久化保存到硬盘上面的,如果节点重启或者意外crash掉,消息就会丢失
2.ACK确认机制: 这个使用就要使用Message acknowledgment机制,就是消费端消费完成要通知服务端,服务端才把消息从内存删除;这样就解决了,及时一个消费者出了问题,没有同步消息给服务端,还有其他的消费端去消费,保证了消息不丢的case
3.设置集群镜像模式: 单节点模式 普通模式 镜像模式
4.消息补偿机制: 比如:持久化的消息,保存到硬盘过程中,当前队列节点挂了,存储节点硬盘又坏了,消息丢了,怎么办?
产线网络环境太复杂,所以不知数太多,消息补偿机制需要建立在消息要写入DB日志,发送日志,接受日志,两者的状态必须记录;然后根据DB日志记录check消息发送消费是否成功,不成功,进行消息补偿措施,重新发送消息处理
文章作者: 123
文章链接: https://gao5805123.github.io/123/2020/05/23/Java%E9%9D%A2%E8%AF%95%E9%A2%987/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 123
打赏
  • 微信
    微信
  • 支付宝
    支付宝