Java开发高频问题总结
看了大佬的博文热血沸腾,自己也想来总结一波,加深印象,方便自己,也方便大家。不对之处也欢迎大佬指正,祝愿大家都能找到合适的工作。
1.进程和线程的区别?
进程:进程是程序的一次执行过程,是系统运行程序的基本单位。直白地讲,进程就是应用程序的启动实例。比如 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。
线程:线程(英语:thread)是操作系统能够进行运算调度的最小单位。线程是独立调度和分派的基本单位。
区别:参考知乎博主的解答
做个简单的比喻:进程=火车,线程=车厢
线程在进程下行进
(单纯的车厢无法运行)
-一个进程可以包含多个线程
(一辆火车可以有多个车厢)不同进程间数据很难共享
(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)同一进程下不同线程间数据很易共享
(A车厢换到B车厢很容易)进程要比线程消耗更多的计算机资源
(采用多列火车相比多个车厢更耗资源)进程间不会相互影响,一个线程挂掉将导致整个进程挂掉
(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)进程可以拓展到多机,进程最多适合多核
(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
2.进程的调度算法有哪些?
常见五种:FCFS、RR、SPN、SRT、HRRN
先来先服务调度算法-FCFS
先来先服务是最简单的策略,也成为先进先出FIFO。首先它是一个非抢占的。如字面的意思,它根据进程到达时间决定先运行哪一个进程。
时间片轮转调度法-RR
轮转也称时间片技术(time slicing,SL),对于轮转法,最重要的是时间片的长度。轮转算法以一个周期(q)产生中断,当中断发生时,当前运行的程序置于就绪队列(队尾)中,然后基于FCFS选择下一个就绪作业运行。
短作业优先调度算法-SJF
也叫最短进程优先-SPN 它也是一个非抢占的。是根据服务的时间经行选择。在这里要注意下到达时间的顺序。
最短剩余时间优先-SRT
SRT是针对SPN(SJF)增加了抢占机制的版本,就好比例子中B运行时间非常长,在这期间其他所有的进程都在等待,如果将其中断,先处理所需时间少的,运行效率会有显著提升。一定要先明确SRT是抢占的。
高响应比优先调度算法-HRRN
高响应比优先调度算法主要用于作业调度,该算法是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑每个作业的等待时间和估计的运行时间。在每次进行作业调度时,先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行。
先级调度算法 多级反馈队列调度算法
3.常用IO模型
同步阻塞IO(Blocking IO):即传统的IO模型。
同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。
IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。
异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。
4.进程的通信方式有哪些?线程呢?
1、无名管道通信
无名管道( pipe
):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
2、高级管道通信
高级管道(popen):
将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
3、有名管道通信
有名管道 (named pipe) :
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
4、消息队列通信
消息队列( message queue ) :
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
5、信号量通信
信号量( semophore ) :
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6、信号
信号 ( sinal ) :
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
7、共享内存通信
共享内存( shared memory )
:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
8、套接字通信
套接字( socket ) :
套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
5.fork函数的作用?
作用:从已经存在的进程中创建一个子进程
,而原进程称为父进程。
调用fork(),当控制转移到内核中的fork代码后,内核开始做:
1.分配新的内存块和内核数据结构给子进程。
2.将父进程部分数据结构内容拷贝至子进程。
3.将子进程添加到系统进程列表。
4.fork返回开始调度器,调度。
6.协程的概念?
协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
7.linux进程和线程?
8.通过进程id查看占用的端口?通过端口号查看占用的进程id?
windows:
netstat -ano | findstr pid
netstat -ano | findstr portNo
linux:
netstat -nap | grep pid
netstat -nap | grep portNo
9.如何查看占用内存较多的进程?
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
10.僵尸进程产生的原因?
一个进程使用fork创建子进程,
如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
11.孤儿进程产生的原因?
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。
孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
12.讲下虚拟内存?虚拟内存和物理内存的关系?
13.分段和分页讲下?对应的场景?
14.讲下用户态和内核态?所有的系统调用都会进入到内核态吗?
15.平常用的linux命令?如何打开文件并查找某个单词?怎么在某个目录下找到包含txt的文件?
ll、ls、pwd、less、grep、ps -ef
cat server.log | grep word
16.简单介绍下ping命令?TTL是什么意思?
17.怎么判断一个主机是不是开放某个端口?
18.说下你用的比较多的设计模式?实现一个单例模式
单例模式、工厂模式、建造者模式、代理模式
实现单例模式:懒汉式、饿汉式
区别: 懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建
19.排序算法哪些是稳定的,为什么直接插入排序是稳定的?各种排序算法的时间、空间复杂度
20.简要讲述二叉树的各种遍历的非递归算法实现?
21.中断的分类?
22.软中断和硬中断?
23.红黑树和平衡二叉树?
24.哈弗曼树?
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。
哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
PS:哈夫曼树的构造并不是唯一的。
25.前序、中序、后续遍历
前序遍历:也叫做先根遍历,可记做根左右
中序遍历:也叫做中根遍历,可记做左根右
后续遍历:也叫做后根遍历,可记做左右根
通过前序遍历和后续遍历可以确定根节点(前序第一个,后续最后一个)
26.StringBuffer和StringBuilder区别
StringBuffer所有方法都加了synchronized锁,所以StringBuffer是线程安全的,但是同样因为它加了锁,所以它的性能是不如StringBuilder的。
StringBuffer和StringBuilder相对String(不可变)加了append方法(建造者模式)和reverse方法(用于字符串反转),string底层数组是finnal所以不存在线程安全问题
27.java实现连续空间的内存分配?
28.创建对象的方式有哪几种?
1.new
2.反射
3.clone()
4.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法.
29.抽象类和接口有什么区别?
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。
30.深拷贝和浅拷贝的区别?
31.讲下封装、继承、多态?什么是编译时多态、运行时多态?
32.什么是泛型?什么是类型擦除?
33.如何实现静态代理?有什么缺陷?
…
参考来源:
题目出自大佬:花名提莫 https://blog.csdn.net/qq_41770757/article/details/112852371
解答参考:
https://www.zhihu.com/question/25532384/answer/81152571
https://blog.csdn.net/xieminyao123/article/details/79116985
https://www.cnblogs.com/szitcast/p/10927375.html
http://www.xitongzhijia.net/xtjc/20171024/109869.html
https://blog.csdn.net/zheng199172/article/details/88800275