最后
我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。
if(head1.data<head2.data){
reHead=head1;
temp=head1;
head1=head1.next;
}else{
reHead=head2;
temp=head2;
head2=head2.next;
}
//两个链表逐个结点开始比较,
while(head1!=null&&head2!=null){
if(head1.data<head2.data){
temp.next=head1;
head1=head1.next;
temp=temp.next;
}else{
temp.next=head2;
head2=head2.next;
temp=temp.next;
}
}
//如果两个链表中的任意一个没有被比较完,直接被接在新链表的后面
if(head1!=null)
temp.next=head1;
if(head2!=null)
temp.next=head2;
return reHead;
}
4、手写快排算法,快排的时间复杂度是多少?最差情况是多少?为什么?
我的回答:快排的时间复杂度是O(logn),最差是O(n*n),对有序的数组进行快排的时候会出现最差情况,近似是冒泡排序,因为基数的移动每次都向后移动一位
public void quickSort (int[] array, int start, int end) {
if (array == null || array.length == 0) {
return;
}
int i = start, j = end;
int temp = array[start];
while (i < j) {
while(array[j] > temp && i < j) {
–j;
}
while(array[i] <= temp && i < j) {
++i;
}
int x = array[i];
array[i] = array[j];
array[j] = x;
}
array[start] = array[i];
array[start] = temp;
quickSort(array, start, i-1);
quickSort(array, i+1, end);
}
- “ == ”和equals的区别
== 是比较两个引用之间是否指向同一个对象,也就是比较两个引用存储的地址是否相等
equals在Object中比较的是两个对象的hashcode,日常我们实现基类时覆盖Object的equals方法,
例如User时,在equals中对属性name,age进行比较
- Hash算法你知道哪些?
我只知道一致性hash算法,然后拓展的说了下自己在项目中如何用到一致性哈希
算法的(Dubbo的一致性哈希算法实现负载均衡算法)
- 哈希碰撞的解决方案有哪些?说说开放定址法原理
-
HashMap应用的链表法
-
开放定制法:感兴趣自行百度下,太多了,博主就不啰嗦了
- TreeMap和HashMap 的区别
看过源码,了解TreeMap是基于红黑树的,所以元素是有序的
HashMap是基于哈希算法的,元素是乱序存放
- 说说红黑树和Avl树
读者自行百度?
- 缓存淘汰算法
我的第一想法是Redis的LRU算法,之前看过Redis的源码,所以直接说了Redis几种常用的淘汰算法,
包括随机淘汰算法,FIFO淘汰算法,以及默认算法:删除不常用的key,使用双向链表维护所有被
使用的key,频繁使用的key存放在链表的表头附近,淘汰机制只需要淘汰表尾的元素
-
TCP三次握手、四次挥手
-
HTTP、HTTPS的区别
有必要和读者说说这儿:
-
HTTPS相对于HTTP的文本传输变换为二进制传输,安全快捷
-
HTTPS添加SSL协议,保障传输安全
-
HTTPS默认支持长连接,采用多路复用机制
-
HTTPS服务端支持反馈更多信息给应用端
- SSL过程
读者自行百度,博主建议挖透式学习
- 进程和线程的共同点和区别
共同点:拥有CPU的执行权、切换
区别:
-
进程可包含多个线程
-
进程管理资源,线程不能
-
进程之间的切换消耗比线程之间的切换大
-
线程之间共享进程的公共资源
- 进程之间的通信,线程之间的通信
进程之间可以通过RPC、消息中间件、Socket,全局变量等通信
线程之间可以通过共享变量、管道、wait/notify机制
- 你知道协程吧?
不知道?
- 你知道系统中的大小端吧?
不知道?
- 你用过BIO、NIO、AIO,说说他们之间的区别吧
BIO:同步阻塞式,一个socket请求对应一个线程处理,耗时耗资源
NIO:同步非阻塞,socket请求由线程池来处理(boss、worker线程池原理)
AIO:异步化
我另外解释了下系统底层的实现select、poll、epoll的区别:
-
select每次执行select方法,都会从用户态拷贝所有的fd文件到内核态中,存储在内核态的数组中,数组大小默认1024个,存放的fd文件数量受限制
-
select采用轮训的方式寻找有事件的fd文件
-
对有事件的fd文件再次拷贝到用户态做相应的处理
-
epoll有三个函数:epoll_create、epoll_ctl、epoll_wait,epoll_create在内核态启动时创建红黑树和就绪队列,红黑树相对于select的数组所容纳的fd文件数量更多,效率更高
-
epoll_ctl负责将用户态的fd文件符拷贝到内核的红黑树中,并且制定相应的回调接口,当fd文件符有事件时,回调接口,将fd文件移动到就绪队列中
-
epoll_wait负责监听就绪队列是否有就绪的fd文件,有的话拷贝到用户态,否则,继续睡眠,等待被唤醒
- 内核态与用户态的交互过程
我按照自己理解说了下线程之间的上下文切换,进程之间的切换,主要是一些信息的拷贝,比较耗时,
如果切换次数过多的话,会对CPU的性能带来影响。
- 怎么看系统的CPU信息
我说到常用的TOP命令会看到系统的CPU使用率,内存等信息;还有vmstat查看上下文切换信息
- 给了我一段代码
String a = “aaaaaa”;
int b;
int test (int i) {
b = i;
}
int main () {
int temp = 0;
int c = test(temp);
return c;
}
问在进程中这些信息的布局
我的回答:
变量a:首先字符串在JVM中是常量,所以a变量肯定存放在常量池中,而常量池存放在JVM中的永久代中。
变量i、b、temp、c:基本变量类型和临时变量都是存放在JVM栈的栈桢中,每个栈桢包含临时变量,变量值等信息
方法test:方法是被线程调用的,所以方法存在于栈中,调用方法的过程进栈,返回方法的过程是出栈
- 给了一段代码,问我char和int各占几个字节,这几个变量一共占了多少字节,JVM内存对齐知道吗?
代码
struct {
char a;
int b;
char c;
}
回答:
-
char和int分别各占2、4个字节
-
这几个变量共占了8个字节(这是我的回答,是错误的)
面试官问我知道JVM内存对齐知道吗?我第一反应想到的是JVM内存中的对象布局,
里面有一块内存叫对齐填充,意思是JVM对象头占用最少8个字节,
实例数据和对象头+内存填充的内存必须是8字节的整数倍
面试官纠正:三个变量共占用24个字节,因为这一块需要内存对齐,意思是按照内存分配最大的变量分配其
他变量的内存
- 用过什么数据库?在MySQL中使用什么引擎?
-
之前使用的MySQL,在阿里实习转正期间使用了Oracle
-
在MySQL中使用InnoDB引擎,还有一个叫MyISAM引擎
- 说说InnoDB和MyISAM的区别
写在最后
为了这次面试,也收集了很多的面试题!
以下是部分面试题截图
这一块需要内存对齐,意思是按照内存分配最大的变量分配其
他变量的内存
- 用过什么数据库?在MySQL中使用什么引擎?
-
之前使用的MySQL,在阿里实习转正期间使用了Oracle
-
在MySQL中使用InnoDB引擎,还有一个叫MyISAM引擎
- 说说InnoDB和MyISAM的区别
写在最后
为了这次面试,也收集了很多的面试题!
以下是部分面试题截图
[外链图片转存中…(img-48SBFpER-1715119633813)]