[TOC]
Java基础
大端序小端序
1.小端法(Little-Endian)就是低位字节排放在内存的低地址端(即该值的起始地址),高位字节排放在内存的高地址端; 2.大端法(Big-Endian)就是高位字节排放在内存的低地址端(即该值的起始地址),低位字节排放在内存的高地址端;
枚举可以new吗 不行 私有构造
unicode与utf-8
- Unicode 是「字符集」
- UTF-8 是「编码规则」
UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示)UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号
UTF-8表示最小单位1字节
GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符
ASCII 主要用于显示现代英语和其他西欧语言
说说NIO是什么,为什么快
5.NIO的Buffer到底是啥
6.你提到NIO用到了直接内存,那直接内存在用户态还是内核态
NIO介绍一下(Selector、Channel、ByteBuffer,IO多路复用,底层的select、poll、epoll(这里我只是了解,不清楚具体实现))
面向对象和面向过程
String,StringBuffer,StringBuilder
Integer自动拆箱装箱(可能和字面量类型一块考,比如包装类的对象和字面量相加有几次拆箱装箱)什么类是final的(String,Integer等包装类)
\5. 类加载过程和机制(可能在原理的基础上,结合实际的例子考察,如各种地方加了各种修饰符后new一个子类或者父类输出什么)
\6. 对象死亡的条件
\7. OOM发生的位置和解决办法
Java的线程和操作系统的线程
1 | 而到了JDK1.2及以后,JVM选择了更加稳健且方便使用的操作系统原生的线程模型,通过系统调用,将程序的线程交给了操作系统内核进行调度 |
线程通信的机制
- volatile
- 等待/通知机制
- join方式
- threadLocal
TreeMap的结构
1 | static final class Entry<K,V> implements Map.Entry<K,V> { |
计算机网络
MTU 和 MSS 区别
MTU: Maximum Transmit Unit,最大传输单元,即物理接口(数据链路层)提供给其上层(通常是IP层)最大一次传输数据的大小;以普遍使用的以太网接口为例,缺省MTU=1500 Byte,这是以太网接口对IP层的约束,如果IP层有<=1500 byte 需要发送,只需要一个IP包就可以完成发送任务;如果IP层有> 1500 byte 数据需要发送,需要分片才能完成发送,这些分片有一个共同点,即IP Header ID相同。
MSS:Maximum Segment Size ,TCP提交给IP层最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP用来限制application层最大的发送字节数。如果底层物理接口MTU= 1500 byte,则 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte发送,需要两个segment才可以完成发送,第一个TCP segment = 1460,第二个TCP segment = 540。
http协议
http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
10.101.102.103是公网IP还是内网IP,如何区分公网内网?
//了解中间人攻击和跨域攻击吗?
//可以伪造证书吗?
// BBR 怎么快,怎么实现,和之前的有什么区别?
- TCP 是怎么判断一个包丢了?
- 客户端向服务器发送一个包,它一直都没有收到服务器返回的 ACK,该怎么处理?
滑动窗口大小如何确定
1.延迟应答
如果接受数据的主机立刻返回ACK应答,这时返回的窗口可能比较小
接收端处理数据的速度很快,可能很快就处理完缓冲区的数据,接收端稍微迟一会儿作出应答,完全可以给发送端返回一个更大的窗口发送数据。
窗口越大,网络吞吐量就越大,传输效率就会提高
为什么非对称加密比对称加密慢?
这是因为对称加密主要的运算是位运算,速度非常快,如果使用硬件计算,速度会更快。但是非对称加密计算一般都比较复杂,比如 RSA,它里面涉及到大数乘法、大数模等等运算
非对称加解密,私钥和公钥到底是谁来加密,谁来解密
第一种用法:公钥加密,私钥解密。—用于加解密
第二种用法:私钥签名,公钥验签。—用于签名
有点混乱,不要去硬记,总结一下:
你只要想:
既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;
既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。
短连接和长连接应用场景
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个 TCP 连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多, 所以每个操作完后都不断开,下次处理时直接发送数据包就 OK 了,不用建立 TCP 连接。例如: 数据库的连接用长连接, 如果用短连接频繁的通信会造成 socket 错误,而且频繁的 socket创建也是对资源的浪费。
而像 WEB 网站的 http 服务一般都用短链接,因为长连接对于服务端来说会耗费一定的 资源,而像 WEB 网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源, 如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连接。
心跳包的机制?
方法1:应用层自己实现的心跳包
方法2:TCP的KeepAlive保活机制
心跳检测步骤:
1客户端每隔一个时间间隔发生一个探测包给服务器
2客户端发包时启动一个超时定时器
3服务器端接收到检测包,应该回应一个包
4如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
5如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了
面向数据流和面向报文?
TCP面向字节流下
结合TCP的概念,水池就好比接收缓存,倒水就相当于发送数据,接水就相当于读取数据。好比你通过TCP连接给另一端发送数据,你 只调用了一次write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。(假设数据都能到达)但是,你发送的数据量不能大于对方的接收缓存(流量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。
UDP面向报文
UDP和TCP不同,发送端调用了几次write,接收端必须用相同次数的read读完。UPD是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定MSG_PEEK标志,每次读取操作将消耗一个报文。
原因
其实,这种不同是由TCP和UDP的特性决定的。TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。
而UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样的数据是没有意义的。
UDP最大包长多少?首部的字段和长度?为什么是1500字节呢?
1.链路层的最大传输单元MTU在以太网里是1500个字节;
2.IP包如果超过1500,在链路层就会对包进行分片;
3.UDP包分为包头和正文, 包头共有64位(8字节),分别是16位源端口,16位目的端口,16位UDP包长度和16位校验和.因此UDP包正文的 最大长度是2^16 - 1=65535字节.
UDP会分包吗?
UDP层 不拆分包,但IP层拆分包。若UDP报文长度,超过1472字节,则发送方的 IP层 分包),会将报文拆分成多个IP报文;接收方的IP层,会将报文进行重组。IP header中有总长度和片偏移。
操作系统
线程与协程。(协程不会)
64位地址的内存空间
64位系统的地址空间不是2^32, 也不是2^64,而一般是2^48。因为并不需要2^64那么大的寻址空间,过大的空间只会导致资源的浪费。
32位呢?
2^32
用户态和内核态的区别?
shell顾名思义,就是外壳的意思。就好像把内核包裹起来的外壳。它是一种特殊的应用程序,俗称命令行。为了方便用户和系统交互,一般一个shell对应一个终端,呈现给用户交互窗口。
内核:它是一种特殊的软件程序,特殊在哪儿呢?**控制计算机的硬件资源,例如协调CPU资源,分配内存资源。
用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。
算法
快排、冒泡、堆排序时间复杂度分布是多少?
快速排序怎么选择枢轴点,衡量指标是什么
你说一下递归的优缺点吧,如何优化?如何进行剪枝搜索?
冒泡和快排各有什么优缺点
说一下快排的最好和最坏的时间复杂度?稳定吗?
邻接表和邻接矩阵?
识别2的n次方
用int值表示ip如何做(刚好32位bit一对一映射),写个伪代码做transfer
跳表的优点是什么?为什么不用红黑树?
跳表范围查询容易写。
为什么用红黑树而不用跳表?
epoll里面没有范围查询的需求。epoll就只是红黑树建树 查询什么的
一亿个数怎么找最大的10万个,时间复杂度多少
10000个数,小顶堆思路 找前100个和找前1000个 的时间复杂度有什么区别?
有一个大文件,记录了每个人一个月每次开车的起始经纬度,问怎么找到每个人的住所的位置
快速排序的时间复杂度是多少?最好情况和最坏情况出现在什么地方?为什么选取最后一个元素作为key值?
对大量数据取前10大(讲了长度为10的堆排序、桶、基数以及时间fu复杂度),感觉不该说桶和基数的,计算读10遍复杂度也更低。但我觉得堆排序是最完美了,但是面试官并不满意,也可能我太慌了,没说清楚。
nlgn的算法有什么相同点?表示不大清楚堆排序和其他有什么区别,其他俩都是分而治之,而且没有重叠。
场景题:现在我有2T的文件数据,数据是 IP地址 + 时间 + 访问域名,统计在一定的时间内根据域名分类的IP访问数(IP去重)(说了一下分块读文件,然后根据时间或者域名切分,之后就乱答一通)
数据库
主键和唯一键
UNIQUED 可空,可以在一个表里的一个或多个字段定义;\PRIMARY KEY** 不可空不可重复,在一个表里可以定义联合主键;
简单的说,primary key = unique + not null
定义了 UNIQUE 约束的字段中不能包含重复值
mysql,可以在text类型的字段上加索引吗?
当然可以,如果直接建立是不可以的,只能在text类型字段上建立带长度的索引,比如这样:alter table test add index idx_text(aaa(10)); 其中,aaa字段类型为text
分库分表分别解决了什么问题?
分库:
高并发的环境下,分库才能将数据库部署在不同的机器上
单机的连接数受限
数据库文件会得很大,数据库备份和恢复需要耗时很长
当单表的数据量达到1000W或100G以后,读写的性能会下降,即使有索引,索引也会变得很大,性能同样会降下
https://blog.csdn.net/drdongshiye/article/details/100856475
模糊查询like语句该怎么写?
第1种:在Java代码中添加sql通配符。
一个线程在10:00:00(十点0分0秒)访问数据库进行查询操作,10:00:10(10点0分十秒)返回,但是另一个线程在10:00:01对数据库同一个元素进行了修改,问返回的结果是修改前的还是修改后的
1 | string wildcardname = “%smi%”;``list names = mapper.selectlike(wildcardname);` ` ``select * from foo where bar like #{value} |
第2种:在sql语句中拼接通配符,会引起sql注入
1 | string wildcardname = “smi”;``list names = mapper.selectlike(wildcardname);` ` ``select * from foo where bar like ``"%"``#{value}``"%" |
**
索引下推和索引覆盖
数据库中为什么不推荐使用外键约束
电商项目中数据库表不推荐外键关联,但是在被关联表中删除数据时会导致关联表中经常出现数据缺失的问题,但如果在删除数据时在业务层删除数据做关联查询来判断是否被关联使用,会导致业务层逻辑复杂,特别是被多个业务表关联,会导致多次关联查询操作,后面每次增加一个业务关联都得增加一次判断。
解决方案:
可以在关联表中增加一个被关联次数的字段,每次关联时都加1,每次取消关联都减一。
讲一下char和varchar的区别?优缺点?索引用char还是varchar好?
假如现在读写有10%的概率冲突,用什么隔离级别?
场景设计:url存储数据库就算设置了索引也会很慢,应该怎么设计存储?
我有了几种思路,想过切分,想过压缩,想过存md5,但我一个没说。。。最后他说要超时了,直接跟我说正解,我抱着反正要结束了的想法随便说了个切分和压缩的思路,然后面试官说你要是有思路一定要跟我说的啊,不然我不知道你有没有想法不知道怎么引导(对不起我真的交流能力巨差。。。
然后他讲了几种方法,而且是层层优化的:
1.存md5(恨自己没胆子说出口
2.md5也很长,只存前几个字符的话可能会冲突,所以可以同时存md5的前几个字符和原url,然后where md5 = ‘xxxx’ and url = ‘xxxxx’,让md5走索引。
3.自己构建哈希映射
drop delete truncate 区别
Mysql聚蔟索引和非聚簇索引的区别(讲了Innodb和Myisyam的区别,文件结构,和两种索引的区别)
要求建立学生、课程、选课、成绩四张表,要求设计字段及相应的数据类型并建立主键
Redis
redis的跳表要实现快速查找第k小的元素怎么做
为什么Redis单线程这么快?
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4、使用多路I/O复用模型,非阻塞IO;
并发
CAS怎么实现禁止指令重排?
Linux
linux 文件系统架构
inode 有什么信息
看tw状态的进程load average 是什么,怎么看,怎么分析
linux底层的零拷贝技术(经历4次 -》3次 -》2次拷贝的优化历程)
Linux中-aux是什么意思? a all u
参数 | 作用 |
---|---|
-a | 显示所有进程(包括其他用户的进程) |
-u | 用户以及其他详细信息 |
-x | 显示没有控制终端的进程 |
Linux中top命令是做什么的?
经常用来监控linux的系统状况
swap?
swap space是磁盘上的一块区域,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务
框架
tomcat如果有两个项目,两个项目里面如果有相同的class,那么tomcat是如何对其进行区别?
分布式系统如何实现数据一致性
虚拟机?
栈区内存会有垃圾回收吗?
在什么情况下,Java对象不需要垃圾回收也能回收掉?
类加载机制卸载条件
JVM调优了解吗,OOM了怎么排查(拷贝Dump文件,使用工具查看)
了解哪些工具(JvisualVM、Jprofiler、Jstack)
Jmap了解吗(no)
如果想把JVM内存固定为32M如何操作?(XMS、XMX同时设置)
怎么解决垃圾回收中的跨代引用问题
符号引用和直接引用
符号引用以一组符号来描述所引用的目标。符号引用可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可
设计模式
单例模式,懒汉,饿汉,双重校验的优缺点
Netty
- 如何保持长连接(Netty)
- 如何实现心跳保持(IDLE编解码器监听事件)
- Netty为什么快(基于NIO+零拷贝)
项目
怎么实现透明调用的(自定义一个注解,然后在BeanPostProcesser中拦截使用了这个注解的接口,然后使用Cglib动态代理进行远程调用)
如何实现异步调用的?(将Future储存起来,再新建一个线程去维护这个Future的状态)
定期删除怎么做的?(服务器事件循环)
你刚才说redis的所有定时器是用链表存储的,还知不知道别的处理方式(不确定对不对,答了quartz的定时任务是用两个队列保存的)
9.Kafka的消息模型是什么
10.Kafka的架构是怎样的
11.Kafka怎样保证消息消费不重复的
12.Kafka、RocketMQ、RabbitMQ的区别是什么
Spring
同一个类中一个没有事务的 A 方法调用有事务的 B 方法,会发生什么事?如果 B 异常了,会发生什么事?从动态代理的角度给我解释
其他
restful的设计理念、修改和删除资源的时候为什么要把id放在url里而不放在http的参数里
登录怎么做。判断用户是否登录。
高并发系统的限流如何实现
高并发秒杀系统的设计
负载均衡如何设计
怎么进行一个权限控制
linux字节码
linux代码对齐?
N个线程交替打印,怎么实现,写出来,跑一下
设计长短地址转换
汇编过程
tcp洪流知道吗
怎么设计一个日志系统
怎么提升系统的并发能力(从索引优化、读写分离、分库分表说到redis主从集群、分布式锁、mq解耦异步削峰、ngnix、限流)面试官补充说还要考虑网路传输、前端优化等等,
如果访问一个网页,发现超时了,是怎么去排查问题的
降级处理hystrix了解过么
CPU架构,控制器,寄存器,运算器,高速缓存?
NIO的原理,jdk中有哪些工具和类去实现,如何实现(selector和channel的用法),真的好用吗?还可以用什么?(面试官应该是想问netty,因为没有实际用过,只能给他讲了netty的原理)
那来说说AIO吧,和NIO什么区别(对异步的理解),AIO在工程中如何实现的?(大概说了下ajax的回调函数),又问回调函数具体是怎么实现的(传递函数指针)。
然后借着异步IO想问消息队列,讲了一下几种模型和原理。(面试中没有用过没关系,只要你懂原理还是可以跟面试官讲,起码可以证明你是爱学习的)
讲讲Spring中怎么对初始化的bean做其他操作。(这里有三种方式,@PostConstruct注解方式,init-method的XML配置方式,InitializingBean接口方式)
三种实现上有什么区别(还好看过点源码,其实前两种是一个意思,都是通过反射的方式用aop思想实现,可以消除对spring的依赖;接口方式是直接调用afterPropertiesSet方法,效率更高点。spring加载bean时先判断接口方式,再执行配置注解方式)
问卷发给1w个人,都是20-30岁之间的,怎么最快的按年龄排序?**
觉得要用好题目给的关键信息,最后说不出来,还想过双轴快排,因为我面试前还在复习Arrays.sort()的源码。。。,然后他说了实现,就是用一个大小为10的列表数组,遍历一次问卷就可以排好序了。其实我还是很迷惑,我以为他是要1w份全都严格排序,就是先按年龄后按问卷内容。。。
4kw个不重复的数,max不超过8kw,找小于max之后的不存在在数组中的4个数,如果内存只有10m怎么找?举例:1,2,3,8,答案是:7,6,5,4**
想了想分片,他说不对,最后答案是用位图。我直呼妙啊然后说你太有意思了 😂我真的全程就在卖傻你知道吗
1 | [海量数据](https://www.nowcoder.com/jump/super-jump/word?word=海量数据)库解决方案 》(而我看的技术内幕),jvm的题是来自JVM设计[算法] |
RSA 具体说说?
DES 和 AES 区别?
rpc 微服务? 怎么保证数据一致?
算法
看你一面也写了一个topk的算法,那我变一下,依然是这个场景,只不过我现在要统计字符出现的次数,拿两个or多个线程去统计,怎么做?
括号匹配
括号匹配变式:括号中有一个特殊符号,这个可以替代左括号或者右括号,也可以代表一个空,即什么也不代表,来做做?
阿里
分布式锁
并发情况下HashMap什么时候会修改失败
1 | put 同时覆盖 |
常见的设计模式
CountDownLatch 和 Barrier 的不同
1 | CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset() |
哪些情况下会回表
ORDER BY 避免回表
如果 ORDER BY 后面不能加索引呢
现在有个表,有个 create_time,如果 ORDER BY create_time 需不需要回表
线上业务,ORDER BY 不能加索引,可以改变 SQL 语句,如何保证
线上业务大表加索引会有什么问题
@Autowired 和 @Resource 是如何拿到对应的关系的
@Bean 注解是如何实现的
Redis怎么保证高可用
JVM
怎么查看gc使用
springmvc
springmvc的请求流程
spring自带的视图解析器(渲染解析器)是什么?
拦截器在请求流程中怎么体现的,拦截器异常,请求还能继续吗?
怎么查看gc使用?
IOC实例化bean的顺序,是根据xml读取的顺序去实例化的吗?不考虑懒加载。如:a依赖b,b依赖c这时候先初始化谁,spring是怎么知道依赖关系的?
动态代理在什么时候进行替换被代理对象的?
#和$符号的底层实现
- spring用注解的话,两个bean的id一样会怎么办
1 | 5.网页的一个方法只能一分钟有1000个访问,怎么实现? |
滑动窗口
8.你认为12306火车票的技术和业务的困难到底是什么?
自己讲了和淘宝双11的不同 双11只是网络端,12306要考虑手机 pc 人工窗口 自助售票机的保持数据的一致性。
为了抗高并发,火车票一般都是确定时间,比如13点准时售票,以确定的时间可以提前准备服务器扩容。
而且火车票一般不同的车型都不会一个时间售票,比如高铁13点 普通绿皮12点 ,进行分流。
熟悉得排序算法,选一个详细讲讲。堆排,归并、快排啥的,详细讲了堆排。
半连接攻击
1.hashmap的遍历方式有哪些,哪种性能更好? https://cloud.tencent.com/developer/article/1623343
2.key值重复了会怎么样?
3.用mybatis时JDBC做的是什么?
5.MySQL数据类型 char varchar text char比varchar的优势?
1 | 1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。 |
10.http请求如何传参?
11.介绍rest
12.http方法有哪些?(get post put delete)
JPA 和 MyBatis 做对象映射的区别?原理?
有中间人劫持则么办?
- 有一个线程要等待其他线程执行完再执行?
- 有一个线程要等待其他线程都就绪再执行?
海量数据取前 5.
Tomcat 的设计模式了解么?
方法区的大小怎么设置?
栈大小怎么设置?
程序运行的时候,怎么监控内存使用情况?
程序运行的时候,怎么看堆栈信息?
什么是”当前读”?
- 在生成 RDB 的过程当中,还能继续进行写入么?
- 为什么 AOF 是数据先落盘再写日志?而数据库是先写日志再落盘?
- 哨兵的选主策略?一个哨兵是怎么知道其他哨兵的存在的?
怎么解决垃圾回收中的跨代引用问题
HashMap底层数据结构
NIO底层实现原理
注解
11.介绍rest
SQL注入?避免措施?
try catch
你的项目在设计表的时候给哪些字段加索引