Java开发高频问题总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值