一、导读
今年的就业环境不如往年,受疫情的影响许多大公司裁员,今年的毕业生人数也达到了1076万,被称为“最难毕业季”。我投的岗位是java开发,在经历了两个月的面试后,在面试过程中也学到了很多。现在我总结了一些当初面试遇到的不会的题,希望可以帮助到大家!
本文涵盖的科目有数据结构,java,计算机网络,Linux,数据库等等
好文章 记得 收藏+点赞+关注 !!!
二、Java面经
1.sleep()和wait()方法的区别
(1).这两个方法来自不同的类分别是Thread和object。
(2).最主要是sleep方法没有释放锁;而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
(3).wait, notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
(4).sleep必须捕获异常,wait,notity和notifyAll同样需要捕获异常
(之前看到网上很多博客都说wait方法不需要拋出异常这个观点是错误的,notify和notityAll方法确实可以不用拋出异常,不加抛异常处理的会编译不过)
2.编译过程中,语法分析器的任务是?
分析单词是怎样构成的 x
分析单词是如何构成语言和说明的 √
分析语句和说明是如何构成程序的 √
分析程序的结构 √
语法分析器(Parser)通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入。实际开发中,语法分析器可以手工编写,也可以使用工具(半)自动生成。
3.线程优先级问题
在应用程序中,如果要对线程进行调度,最直接的方式就是设置线程的优先级。
程序在运行期间,处于就绪状态的每个线程都有自己的优先级,例如 main 线程具有普通优先级。
然而线程优先级不是固定不变的,可以通过 Thread 类的 setPriority ( int newPriority )方法对其进行设置,该方法中的参数 newPriority 接收的是 1 ~10之间的整数或者 Thread 类的三个静态常量。
4.结构型模式中最体现扩展性的模式是?
装饰模式:为对象动态添加功能
装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。
5.用户不能调用构造方法,只能通过new关键字自动调用。(X)
- 在类的其他构造方法中可以用this()的方式调用其他构造方法;
- 在类的子类中则可以通过super调用父类中指定的构造方法;
- 在反射中可以使用newInstance()的方式调用。
6.内部类访问权限有几种
- 内部类中不能定义静态成员
- 内部类可以直接访问外部类中的成员变量,
- 内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中
- 在方法体外面定义的内部类的访问类型可以是public,protecte,默认的,private等4种类型,创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象
- 方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,但这种内部类的前面可以使用final或abstract修饰符。这种内部类对其他类是不可见的,其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。
- 在方法外部定义的内部类前面可以加上static关键字,从而成为Static Nested
Class,它不再具有内部类的特性,所有,从狭义上讲,它不是内部类
7.对于派生类的构造函数,在定义对象时构造函数的执行顺序为?
- 基类的构造函数
- 成员对象的构造函数
- 派生类本身的构造函数
8.抽象类和接口的默认修饰符
抽象类1.8默认是default 1.8之前是protected
接口 1.8接口可以是public 可以是default
1.8之前必须是public 1.9可以是private
9.SpringCloud有什么缺点
一般只知道优点,当问到我缺点时确实蒙住了
可以考虑这几个方面:
- 系统部署依赖
- 服务间通信成本
- 数据一致性
- 系统集成测试
- 重复工作
- 性能监控
10.重载和重写
重载:在同一个类中,只要方法的方法名相同,那么这几个方法就构成重载。重载方法的参数类型和参数个数可以不同,
返回值的类型也可以不同,无法根据返回值类型来判断一个方法是不是重载方法。重载方法的权限可以是是任意权限,这是没有要求的。
重写: 重写方法的方法名和方法参数(参数数量,参数类型)必须完全一致。在java 1.5版本之前,重写方法的返回值必须和原方法的返回值类型完全一样。而在1.5版本之后,java 放宽了这一要求,重写方法的返回值类型比原方法的返回值类型小即可。重写方法抛出的异常,不能大于原方法抛出的异常。重写方法的权限不能小于原方法的权限。重写方法只能发生在父类和子类之间。
参考链接:https://blog.csdn.net/qq_41160264/article/details/81196340
11.java跨平台性
Java跨平台性指一次编译 能在不同平台运行
JVM运行的是.class字节码文件
12.int fact(int n){ if(n<=1) return 1; return n*fact(n-1); }时间复杂度
当n<=1时执行return 1这一个语句
每次返回上一层都执行n*fact(n-1)这一个语句,共执行n-1次
因此共执行基本语句n次,时间复杂度为O(n)
三、计算机网络/组成原理
1.128.10.0.0是几类地址?
128.10.0.0
转化为2进制为 1000 0000.0000 1010.0000 0000.0000 00000
- a类地址 开头为0
- b类:10
- c:110
- d:1110
A类:0.0.0.0 - 127.255.255.255
B类:128.0.0.0 - 191.255.255.255
C类:192.0.0.0 - 223.255.255.255
2.冯・诺依曼计算机中指令和数据均以二进制形式存放在存储器中,CPU区分它们的依据是?
A.指令操作码的译码结果
B.指令和数据的寻址方式
C.指令周期的不同阶段
D.指令和数据所在的存储单元
冯诺依曼计算机是根据指令周期的不同阶段,来区分从内存中取出的是指令还是数据。
存储器中的每段存储空间都会有一个地址,每个指令都包括一段操作数和一段空间地址,cpu会根据操作数去处理地址所指的数据。
一般计算机先读取存储器最开始的内容(这一部分是指令),然后加载操作系统后由操作系统对硬盘文件系统结构(即是数据)以判断其他数据和指令的位置。
指令周期分为4个部分:
- 取指周期,这个周期取出的是指令{操作码,地址码}
- 间接寻址周期,找到有效地址(内存物理地址)
- 执行周期,这个周期取出的就是数据
- 中断周期,检查有没有中断信号
3.位示图(bitmap)可用于磁盘空间的管理。设某系统磁盘共有500块,块号从0到499,第0字的第0位表示第0块,第0字的第1位表示第1块,依次类推。若用位示图法管理这500块的盘空间,当字长为32位时,第i个字节第j位对应的块号是()。
0字0位到31位便是0-31块 1字 0到31位表示 32-63块 以此类推…
4.某一个子网的子网掩码为255.255.255.240,该子网中最多可以有多少主机?
答:255.255.255.240转换成二进制11111111 11111111 11111111 11110000
子网号里面的1代表网络号 0代表主机号,即表示最大主机数为2的4次方
又因为全0和全1不能分配给主机地址,所以主机数为2的4次方减去2
即为 16-2=14个
5.如果某系统15*4=112成立,则系统采用的是几进制?
设使用的是p进制,则15*4=112等价于:
(p + 5) * 4 = p^2 + p + 2
(1 * p^1 + 5 * p^0) * 4 * p^0 = P^2 * 1 + p^1 * 1 + p^0 *2
解出来p=-3(舍去)和p=6
6.某系统中有13 台磁带机,K 个进程共享这些设备,每个进程最多请求使用3 台,则系统不会死锁的K 值是()
最大资源申请数量 = 资源总数/线程数;(若不能整除则结果+1)
3 = 13/k;
k = 5
四、数据库
1.在MySQL中Replace在相同的主键或者唯一键的时候相当于以下以下哪个操作?
MYSQL中处理插入过程主键或唯一重复值的解决办法
- IGNORE:有则忽略,无则插入
- REPLACE:有则删除再插入,无则插入
- ON DUPLIACATE KEY UPDATE:有则更新,无则插入
2.desc能作为table的字段名吗
不能用desc等关键字作表字段,desc是保留关键字。
3.索引什么时候会失效
- 如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
- like查询是以%开头,可以是%结束,例如 name like ‘张%’,这种情况索引不会失效。
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。
- 在MYSQL使用不等于(<,>,!=)的时候无法使用索引,会导致索引失效。
- is null或者is not null 也会导致无法使用索引。
- 不在索引列上做任何操作(计算,函数,(自动或者手动)类型装换),会导致索引失效而导致全表扫描。
参考链接:https://blog.csdn.net/m0_37899908/article/details/113854822
五、数据结构
1.深度优先与广度优先的区别
(1)首先二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归做法是采用队列。
(2)深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次(二叉树的深度优先遍历比较特殊,可以细分为先序遍历,中序遍历,后序遍历)。
广度优先遍历:又叫层次遍历从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问节点,访问完一层就继续访问下一层,直到没有节点可以访问为止。
(3)深度优先搜索算法:不全部保留节点,占用空间少,有回溯操作(即有入栈,出栈操作),运行速度慢。
广度优先搜索算法:保留全部节点,占用空间大,无回溯操作(即无入栈,出栈操作),运行速度快。
(4)深度优先遍历:不全部保留节点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用的空间较少。
广度优先遍历:一般需要存储产生的所有的结点,占用的存储空间要比深度优先搜索大的多,因此在程序设计的过程中必须考虑溢出和节省内存空间的问题。
2.深度优先与广度优先的区别一个有n个顶点n条边的无向图一定是?
有环的
n个顶点组成无向连通图最少需要n-1条边,再加多一条边就会组成一个环,这是只有一个环的情况;当从n-1条边中拿出一条边来组成环,此时会有两个环,而n-2条边无法使n个顶点连通。
3.已知二叉树前序遍历是ADCEFGHB,中序遍历是CDFEGHAB,要求画出二叉树的结构或写出后序遍历
答案可以看这篇博客如何求后序遍历
4.缓存替换的LRU算法,假设缓存容量是3,初始为空,则访问1,2,3,3,2,1,4,3,2,1的失败次数是()
LRU是指最近最少使用的被替换
1 查找失败,因为此时是空的缓存,所以放入1,剩余容量为2
2 查找失败,此时缓存中只有1,所以放入2,剩余容量为1
3 查找失败,此时缓存中只有1、2,所以放入3,剩余容量为0
3 查找成功
2 查找成功
1 查找成功
4 查找失败,因为此时缓存中只有1、2、3,没有4,所以需要替换最近最少使用的数字,即替换3,放入4,此时缓存的数字为1、2、4,剩余容量为0
3 查找失败,因为此时缓存中只有1、2、4,没有3,所以需要替换最近最少使用的数字,即替换2,放入3,此时缓存的数字为1、3、4,剩余容量为0
2 查找失败,因为此时缓存中只有1、3、4,没有2,所以需要替换最近最少使用的数字,即替换1,放入2,此时缓存的数字为2、3、4,剩余容量为0
1 查找失败,因为此时缓存中只有2、3、4,没有1,所以需要替换最近最少使用的数字,即替换4,放入1,此时缓存的数字为2、3、1,剩余容量为0
共查找失败7次
参考链接:https://www.nowcoder.com/questionTerminal/82c61332aff0491d804cf97b24da02b8
六、Linux
1.Linux文件权限一共10位长度,分成四段,每段代表是什么含义?
Linux用户分为:拥有者、组群(Group)、其他(other)
linux中的文件属性过分四段,如 -rwxrwx—
第一段 - 是指文件类型 表示这是个普通文件
文件类型部分
- -为:表示文件
- d为:表示文件夹
- l为:表示链接文件,可以理解为 windows中的快捷方式(link file)
- b为:表示里面可以供存储周边设备
- c为:表示里面为一次性读取装置
第二段 rwx 是指拥有者具有可读可写可执行的权限
类似于windows中的所有者权限比如 administrator 对文件具有 修改、读取和执行权限
第三段 rwx 是指所属于这个组的成员对于这个文件具有,可读可写可执行的权限
类似于windows中的组权限比如administrators组,属于这个组的成员对于文件的都有 可读可写可执行权限
第四段 是指其他人对于这个文件没有任何权限
2.linux下两个进程可以同时打开同一个文件吗?返回的文件描述符一样吗?
- 两个进程中分别产生生成两个独立的fd
- 两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性
- 进程可以通过系统调用对文件加锁,从而实现对文件内容的保护
- 任何一个进程删除该文件时,另外一个进程不会立即出现读写失败
- 两个进程可以分别读取文件的不同部分而不会相互影响
- 一个进程对文件长度和内容的修改另外一个进程可以立即感知
OK,暂时写这么多!
推荐阅读: