大厂校招面试题目总结_1

  1. Java接口与抽象类

抽象方法:抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法必须使用abstract关键字进行修饰。
抽象类: 如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中无具体实现的方法,所以不能用抽象类创建对象。
接口:是抽象方法的集合,如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法,就像契约模式,如果实现了这个接口,那么就必须保证使用这些方法,并且实现这些方法,接口是一种形式,接口自身不能做任何事情,接口里面的方法默认都是abstract的。

  1. 抽象类和接口的区别

1.语法层面上的区别
(1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法。
(2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。
(3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法。
(4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.设计层面上的区别
(1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
(2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
3. JAVA中静态方法加载普通方法为何会报错

静态方法和静态变量是属于某一个类,而不属于类的对象。

类加载的生命周期
在这里插入图片描述
1.加载

”加载“是”类加机制”的第一个过程,在加载阶段,虚拟机主要完成三件事:
(1)通过一个类的全限定名来获取其定义的二进制字节流
(2)将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构
(3)在堆中生成一个代表这个类的Class对象,作为方法区中这些数据的访问入口。
注意此时会扫描到我们的代码中是否有静态变量或者是静态方法等等这些静态数据结构,还未分配内存。
2.验证
验证的主要作用就是确保被加载的类的正确性。
3.准备
准备阶段主要为类变量分配内存并设置初始值。这些内存都在方法区分配。注意此时就会为我们的类变量也就是静态变量分配内存,但是普通成员变量还没。
4.解析
解析阶段主要是虚拟机将常量池中的符号引用转化为直接引用的过程。
5.初始化
这是类加载机制的最后一步,在这个阶段,java程序代码才开始真正执行。我们知道,在准备阶段已经为类变量赋过一次值。在初始化阶端,程序员可以根据自己的需求来赋值了。初始化时候才会为我们的普通成员变量赋值。

静态方法是属于类的,动态方法属于实例对象,在类加载的时候就会分配内存,可以 通过类名直接去访问,非静态成员(变量和方法)属于类的对象,所以只有该对象初始化之后才存在,然后通过类的对象去访问。
4. 树,平衡二叉树,完全二叉树

树(Tree)是n(n≥0)个结点的有限集T,并且当n>0时满足下列条件:
(1)有且仅有一个特定的称为根(Root)的结点。
(2)当n>1时,其余结点可以划分为m(m>0)个互不相交的有限集T1、T2 、…、Tm,每个集Ti(1≤i≤m)均为树,且称为树T的子树(SubTree)。特别地,不含任何结点(即n=0)的树,称为空树。
在这里插入图片描述
平衡二叉树

平衡二叉树(Balanced Binary Tree)又被称为AVL树。
具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
在这里插入图片描述
这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间。

完全二叉树
对于一个树高为h的二叉树,如果其第0层至第h-1层的节点都满。如果最下面一层节点不满,则所有的节点在左边的连续排列,空位都在右边。这样的二叉树就是一棵完全二叉树。
在这里插入图片描述

  1. JAVA中如何从最里面循环跳到最外层

break默认是结束当前循环,有时我们在使用循环时,想通过内层循环里的语句直接跳出外层循环,java提供了使用break直接跳出外层循环,此时需要在break后通过标签指定外层循环。java中的标签是一个紧跟着英文冒号的标识符,与其他语言不同的是,java中的标签只有放在循环语句之前才有作用。需要注意的是,break后标签必须是一个有效的标签,即这个标签须在break语句所在循环的外层循环之前定义。
下面展示一些 内联代码片

package com;  
  
public class Test {  
      
    public static void main (String []args){  
        //外层循环,outer作为标识符  
        outer:  
        for(int i=0;i<<span class="number" style="color: rgb(192, 0, 0);">3;i++){  
            for(int j=0;j<<span class="number" style="color: rgb(192, 0, 0);">3;j++){  
                System.out.println(i+"---"+j);  
                //当j=2时结束outer标识符指定的循环  
                if(j==2){  
                    break outer;  
                }  
            }  
        }  
    }  
}  
  1. TCP流量控制和拥塞控制

TCP流量控制
流量控制:如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。

利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。

滑动窗口
滑动窗口是类似于一个窗口一样的东西,是用来告诉发送端可以发送数据的大小或者说是窗口标记了接收端缓冲区的大小,这样就可以实现流量控制。
为什么会出现滑动窗口
在确认应答策略中,对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段,这样做有一个比较大的缺点,就是性能比较差,尤其是数据往返的时间长的时候。使用滑动窗口,就可以一次发送多条数据,从而就提高了性能。
在这里插入图片描述
TCP拥塞控制
防止发送方发的太快,使得网络来不及处理,从而导致网络拥塞。
加法增加

是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个往返时间),就把拥塞窗口cwnd增加一个MSS大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞

乘法减少
出现一次超时(即出现一次网络拥塞),就把慢开始门限值ssthresh设置为当前的拥塞窗口值乘以0.5

发送端如何知道已经丢包
在这里插入图片描述
流量控制和拥塞控制的区别
1.相同点:
(1)现象都是丢包。
(2)实现机制都是让发送方发的慢一点,发的少一点。
2.不同点:
(1)丢包位置不同:
流量控制丢包位置是在接收端上。
拥塞控制丢包位置是在路由器上。
(2)作用的对象不同:
流量控制的对象是接收方,怕发送方发的太快,使得接收方来不及处理。
拥塞控制的对象是网络,怕发送发发的太快,造成网络拥塞,使得网络来不及处理。
3.联系:
(1)拥塞控制:
拥塞控制通常表示的是一个全局性的过程,它会涉及到网络中所有的主机所有的路由器和降低网络传输性能的所有因素。
(2)流量控制:
流量控制发生在发送端和接收端之间,只是点到点之间的控制。

  1. 操作系统时间片算法的具体实现

在算法中系统将所有的就绪进程按先来先服务的原则排成一个队列。每次调度时,把CPU分配给队首进程,并令其执行一个时间片。一直到程序运行完成,每个程序轮流享用CPU资源。

  1. 开机后系统发生了什么

1.单机开机,计算机通电。
2.BIOS(Basic Input Output System),它的功能就是检查和发现所有硬件和找到硬件的一个起点。说白了,你把系统装在硬盘上,BIOS就要先找到硬盘作为第一个启动设备,把硬盘作为起点。
3.MBR是硬盘被加载后第一个被读到的数据,它记录着硬盘的分区,让计算机大体了解硬盘的框架。
4.GRUB负责找到操作系统的准确位置,找到后Linux内核就会被启动。
5.Linux内核的工作就是启动第一个引导程序:init。
init就是平时所有命令、工具这些进程的起点,俗称第一个进程。

  1. 静态库与动态库的区别

在这里插入图片描述
静态库
静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
特点:
1.静态库对函数库的链接是放在编译时期完成的。
2.程序在运行时与函数库再无瓜葛,移植方便。
3.浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件.
缺点:
1.空间浪费。
2.静态库对程序的更新、部署和发布页会带来麻烦。
动态库
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
特点:
1.动态库把对一些库函数的链接载入推迟到程序运行的时期。
2.动态库可以实现进程之间的资源共享。
3.动态库可以将一些程序升级变得简单。
4.甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

  1. Java加载方法

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。

加载阶段虚拟机需要完成以下3件事情:
(1)通过一个类的全限定名来获取定义此类的二进制字节流。
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
(3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

  1. C++作为编译语言和PYTHON脚本语言的区别

编译型语言:
1.先将源代码编译成目标语言之后通过连接程序连接到生成的目标程序进行执行
2.编译程序工作时,先分析,后综合,从而得到目标程序。所谓分析,是指词法分析和语法分析;所谓综合是指代码优化,存储分配和代码生成。为了完成这些分析综合任务,编译程序采用对源程序进行多次扫描的办法,每次扫描集中完成一项或几项任务,也有一项任务分散到几次扫描去完成的。
解释型语言:
1.先将源代码编译成目标语言之后通过连接程序连接到生成的目标程序进行执行
2.编译程序工作时,先分析,后综合,从而得到目标程序。所谓分析,是指词法分析和语法分析;所谓综合是指代码优化,存储分配和代码生成。为了完成这些分析综合任务,编译程序采用对源程序进行多次扫描的办法,每次扫描集中完成一项或几项任务,也有一项任务分散到几次扫描去完成的。

1.强类型语言:强调数据类型。

2.弱类型语言:忽略数据类型。

区别:
1.可以将**C++和python都归类为强类型语言。**python变量无需声明并不意味着就是弱类型,弱类型是指能够进行隐式转换,python是不能这么转换的,每个实例类型是固定的,转换实例类实际上是重新创建一个内存空间。
2.C++为编译型语言;python为解释型的脚本语言。
3.C++效率高,编程难;python效率低,编程简单。同样的功能,或许python可以很快的写出代码,但运行所需的时间需要成倍于C++。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值