2019年_BATJ大厂面试题总结-顺丰篇

1.Hashmap底层

答案:https://blog.csdn.net/suifeng629/article/details/82179996

2.hashmap和hashtable区别?

答案:https://blog.csdn.net/fxkcsdn/article/details/81487933

3.Hashmap是线程安全的吗为什么不安全?

答案:https://blog.csdn.net/weixin_43092168/article/details/89791106
https://blog.csdn.net/chisunhuang/article/details/79041656

4.MySQL 索引,引擎,主从读写分离

主从配置、读写分离
在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
主从复制原理:
主库(Master)开启二进制日志(binlog,记录所有数据库操作的日志);主库授权一个账号给从库(Slave),从库作为主库的一个客户端访问主库的二进制日志,记录到自己的中继日志(Relay Log)中;从库的SQL线程会检测自己的中继日志,并执行;

具体执行过程:
(1)在Slave服务器上执行start slave命令开启主从复制开关,开始进行主从复制。
(2)此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接Master服务器,并请求从执行binlog日志文件中的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。
(3)Master服务器接收来自Slave服务器的IO线程的请求后,其上负责复制的IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。
(4)当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容
(5)Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点

读写分离(主写从读)
从服务器只负责读,主服务器负责写操作、
实现方式:
1. 程序上判断(开发者自己写)
2. 使用中间件,MySQL- Proxy是实现"读写分离(Read/Write Splitting)"的一个软件。基本的原理是让主数据库处理写操作(insert、update、delete),而从数据库处理查询操作(select)。而数据库的一致性则通过主从复制来实现。所以说主从复制是读写分离的基础。
详解:https://blog.csdn.net/fsx2550553488/article/details/80575698

5.redis数据类型,自己用到了什么?

数据类型:
1.String(字符串)。
2.Hash(哈希),键值对结构。
3.list(列表),列表的值有序可重复。
4.set(集合),集合值无序不可重复。
5.sort set(有序集合),集合值有序不可重复。
redis使用场景:
会话缓存(Session Cache)
全页缓存(FPC)
排行榜/计数器
Redis在内存中对数字进行递增或递减的操作实现的非常好。
redis优点
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

6.给你三个线程a b c b依赖a的结果 c依赖b的结果,你怎么实现?

答案:https://www.cnblogs.com/scar1et/p/11900641.html

7.手撕算法 给定排序数组中找出第一个等于target值的索引,没有返回-1

答案:https://blog.csdn.net/weixin_42047723/article/details/93721826

8.子类重写父类抛出异常的方法,能否继承比父类更高级别的异常类?

见下方示例代码:

import java.io.*;
 
public class Father {
	public void father_function() throws IOException {
		new File("a.txt");
	}
}
 
class Son extends Father {
	@Override
	public void father_function() throws Exception {
		new File("b.txt");
	}
}
 
class Test {
	public static void main(String[] args) {
		Father fs = new Son();
		try {
			fs.father_function();
		}catch (IOException ie) {
			System.out.println("发生了异常");
		}
	}
}

代码说明:

定义了一个类,类名为Father,Father中包含一个普通实例方法,但是该方法会抛出IOException
定义了一个Father类的子类:Son,该类重写了父类Father的方法,但是子类重写方法后选择了抛出一个更大的异常
定义了一个Test类,包含一个main方法
Test类中创建了一个Son类对象(也即Father类的子类对象),然后使用try…catch…语句将fs.father_function();这条会抛出异常的语句包围,并使用了IOException对象对当前可能产生的异常进行捕

结果: 程序编译失败

原因分析:

1、在java多态机制中,对象引用fs在编译时期是属于父类类型也即Father类型,但是在运行时fs属于子类类型,也就是Son类型

2、也就是说在编译的时候,编译器发现catch中的IOException完全能将父类方法中抛出的异常捕获,因此编译通过,但是在运 行时期,由于fs变成了子类类型,子类重写的方法抛出的异常是Exception,显然IOException不能捕获这个比它更大的异 常,因此在运行时期也就出现失败

总结:这个示例也就演示了一个道理,在java中,子类重写父类的方法时,子类如果选择抛出异常,那么抛出的异常类型不能大于父类的异常类型

发布了53 篇原创文章 · 获赞 88 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43107323/article/details/104710793