刷题2022年5月15日

301 阅读16分钟

1、有关多线程,多进程的描述错误的是

正确答案: D   你的答案: B (错误)

子进程获得父进程的数据空间,堆和栈的复制品
线程可以与同进程的其他线程共享数据,但是它拥有自己的栈空间且拥有独立的执行序列
线程执行开销小,但是不利于资源管理和保护
进程适合在SMP机器上进行,而线程则可以跨机器迁移

SMP:Symmetrical Multi-Processing,对称性多核处理器,多进程可以在不同的核上运行,但是线程不可以跨机器迁移,因为线程是存在于单一的进程之中,只能在一个核上运行

2、有一个二维数组A[10][5],每个数据元素占1个字节,且A[0][0]的存储地址是1000,则A[i][j]的地址是多少 ?

1000+5i+j

3、下列对MD5的叙述不正确的是:

正确答案: C   你的答案: D (错误)

是一种散列算法
指纹(摘要)的长度为128
是一种对称加密算法
可用来校验数据的完整性

MD5 是摘要算法不是加密算法,两者的本质区别是:摘要算法是单向的,即明文可以通过摘要算法生成摘要结果,但反之则不能通过摘要结果还原成明文。而加密算法是双向的,即可以从明文通过加密算法生成密文,反之也可以通过解密算法将密文还原成明文。
所以,摘要算法主要用来检查明文是否发生过变动,而加密算法则用来传递不能让第三方知晓的内容。

4、下面关于并行和并发的区别,说法正确的是?

并发计算是一种程序计算的形式,在系统中,至少有两个以上的计算在同时运作,计算结果可能同时发生
并行计算指许多指令得以同时进行的计算模式。在同时进行的前提下,可以将计算的过程分解成小部份,之后以并发方式来加以解决
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。  

你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。  

并发的关键是你有处理多个任务的能力,不一定要同时。  

并行的关键是你有同时处理多个任务的能力。  

5、下面对于cookie的描述中正确的是?

Cookie的大小限制在4kb左右,对于复杂的存储需求来说是不够用的
如果在一台计算机中安装多个浏览器,每个浏览器都会以独立的空间存放cookie
由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题

cookie应该是由服务端发送到客户浏览器端并保存在浏览器端

6、若一进程有10个用户线程,则在系统调度执行时间上占用的时间片是()

1

由于用户线程不依赖于操作系统内核,因此,操作系统内核是不知道用户线程的存在的,用户线程是由用户来管理和调度的,用户利用线程库提供的API来创建、同步、调度和管理线程。所以,用户线程的调度在用户程序内部进行,通常采用非抢先式和更简单的规则,也无须用户态和核心态切换,所以速度很快。

由于操作系统不知道用户线程的存在,所以,操作系统把CPU的时间片分配给用户进程,再由用户进程的管理器将时间分配给用户线程。 那么,用户进程能得到的时间片即为所有用户线程共享。

7、多个线程可同时操作一个数据,为了保证该数据的准确性,可将操作该数据的部分改为:

同步
  1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。其中两种并发关系分别是同步和互斥

  2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。

  3. 同步: 进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。

  4. 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。

  5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行。

  6. 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。

   异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。

8、给定n个节点的平衡二叉搜索树,每个节点的值是整数。给定一个整数,在树中找出与该整数最接近的节点的最小算法复杂度是()

Θ(logn)

平衡二叉搜索树时间复杂度是log(n),找寻相邻三个结点,就是3log(n)

9、在一个含有group by的查询sql中,同时存在having和where,sql在解析执行的时候,先执行的是哪一个?

where

执行顺序:from,where,group by,having,select,order by

10、0.6332 的数据类型是()

正确答案: B   你的答案: A (错误)

double

double是八个字节,float是四个字节,题目中有5个数字和1个标点应该占6个字节 且默认是double类型,如果是float,需要显式声明。

11、http 协议中,状态码的意思为

1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

12、关于下列程序段的输出结果,说法正确的是

public class MyClass{
    static int i;
    public static void main(String argv[]){
        System.out.println(i);
    }
}
0

成员变量和局部变量的区别

1、成员变量是独立于方法外的变量,局部变量是类的方法中的变量

1)、成员变量:包括实例变量类变量,用static修饰的是类变量,不用static修饰的是实例变量,所有类的成员变量可以通过this来引用。
2)、局部变量:包括形参,方法局部变量,代码块局部变量,存在于方法的参数列表和方法定义中以及代码块中。
2、成员变量可以被public,protect,private,static等修饰符修饰,而局部变量不能被控制修饰符及 static修饰;两者都可以定义成final型。
3、成员变量存储在堆,局部变量存储在栈。局部变量的作用域仅限于定义它的方法,在该方法的外部无法访问它。成员变量的作用域在整个类内部都是可见的,所有成员方法都可以使用它。如果访问权限允许,还可以在类的外部使用成员变量。
4、局部变量的生存周期与方法的执行期相同。当方法执行到定义局部变量的语句时,局部变量被创建;执行到它所在的作用域的最后一条语句时,局部变量被销毁。类的成员变量,如果是实例成员变量,它和对象的生存期相同。而静态成员变量的生存期是整个程序运行期。
5、成员变量在累加载或实例被创建时,系统自动分配内存空间,并在分配空间后自动为成员变量指定初始化值,初始化值为默认值,基本类型的默认值为0,复合类型的默认值为null。(被final修饰且没有static的必须显式赋值),局部变量在定义后必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。\

6、局部变量可以和成员变量 同名,且在使用时,局部变量具有更高的优先级,直接使用同名访问,访问的是局部变量,如需要访问成员变量可以用this.变量名访问

本例中i为成员变量,有默认的初始值,如果定义在方法内部,就没有初始值

13、最坏情况下的时间复杂度最低的是

堆排序最坏的时间复杂度为O(nlog2n)

希尔排序最坏的时间复杂度为O(n1.5)

快排和冒泡最坏的时间复杂度为O(n2)

14、TCP的握手与分手,可能出现的情形有

握手需要3次通信
分手需要进行4次通信
FIN和ACK 在同一包里
ACK 和SYN 在同一包里

image.png

image.png

15、下面网络知识的阐述中,存在错误的是?

正确答案: A C   你的答案: A (错误)

ARP协议根据MAC地址查询其对应的IP地址,便于IP通信。
TCP协议是面向连接的,UDP协议时面向无连接的。
127.0.0.1属于私有地址。
IPV6协议是下一代IP协议。

A:arp是根据IP寻找MAC地址的协议

C:127.0.0.1是环回地址,而不是私有地址

环回地址是主机用于向自身发送通信的一个特殊地址。

环回地址为同一台设备上运行的 TCP/IP 应用程序和服务之间相互通信提供了一条捷径。同一台主机上的两项服务若使用环回地址而非分配的主机地址,就可以绕开 TCP/IP 协议栈的下层。通过 ping 环回地址,还可以测试本地主机上的 TCP/IP 配置。

IPv4 的环回地址是保留地址之一 127.0.0.1。尽管只使用 127.0.0.1 这一个地址,但地址 127.0.0.0 到 127.255.255.255 均予以保留。此地址块中的任何地址都将环回到本地主机中。此地址块中的任何地址都绝不会出现在任何网络中。

私有地址有:
A类:10.0.0.010.255.255.255
B类:172.16.0.0172.31.255.255
C类:192.168.0.0192.168.255.255

16、堆栈溢出一般是由什么原因导致的

1、内存泄露,比如某一数组原先已定义好大小,但是在后续操作中存放的个数超出这一既定长度,会导致堆栈溢出

2、由于程序员动态申请的内存块使用后未立即释放,导致内存区不够用,也会导致堆栈溢出

3、程序陷入死循环,往内存写数据,不断地消耗内存空间

4、程序本身运行起来就要消耗一定大小的内存,但是系统提供的实际内存不够,比如JVM虚拟内存不够让程序使用

17、如何在命令行查看一台linux机器的CPU、SWAP分区信息、硬盘信息?

cat /proc/cpuinfo:查看一台linux机器的CPU信息 
du:查看该目录占用文件系统数据块的情况 
cat /proc/swaps:查看SWAP分区信息
df -lh:查看硬盘信息

18、String str = new String(“abc”),“abc”在内存中是怎么分配的?

字符串常量区

什么是字符串常量池

JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池

工作原理

当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。

实现前提

字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。如果Java中的String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。

关于堆和栈

Java中所有由类实例化的对象和数组都存放在堆内存中,无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。而栈内存用来存储局部变量和方法调用。

关于寄存器

Java中运行时数据区有一个程序寄存器(又称程序计数器),该寄存器为线程私有。Java中的程序计数器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined

关于本题目中,"abc"为字面量对象,其存储在堆内存中。而字符串常量池则存储的是字符串对象的一个引用。

19、下面哪些机制可以用于进程间通信?

正确答案: A B E   你的答案: A E (错误)

Socket
Named pipe
Shared memory

Linux进程间通信:管道、信号、消息队列、共享内存、信号量、套接字(socket)

Linux线程间通信:互斥量(mutex),信号量,条件变量

Windows进程间通信:管道、消息队列、共享内存、信号量   (semaphore)   、套接字(socket)

Windows线程间通信:互斥量(mutex),信号量(semaphore)、临界区(critical section)、事件(event)

20、SQL中的DDL、DML、DCL、TCL分别代表哪些操作

DDL data definition language(数据定义语言),主要的命令有alter、create、drop、truncate,ddl主要用在定义或者改变表的结构。

DML data manipulation language(数据操纵语言),主要的命令有select、update、delete、insert,dml主要用来操作数据库中的数据

DCL data control language(数据控制语言),主要的命令有grant、deny、revoke等,dcl主要用来设置或者更新数据库用户或者角色权限

TCL Transaction Control language,主要的作用是用来控制事务的,常用的关键字有commit、rollback、setpoint等

21、下面有关 java 类加载器,说法正确的是

扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类
tomcat 为每个 App 创建一个 Loader,里面保存着此 WebApp 的 ClassLoader。需要加载 WebApp 下的类时,就取出 ClassLoader 来使用

1)Bootstrap ClassLoader

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的``class``,由C++实现,不是ClassLoader子类

2)Extension ClassLoader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

3)App ClassLoader

负责记载classpath中指定的jar包及目录中``class

4)Custom ClassLoader属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

22、模糊查询通配符

1 、 LIKE'Mc%'  将搜索以字母  Mc  开头的所有字符串(如  McBadden )。  
2 、 LIKE'%inger'  将搜索以字母  inger  结尾的所有字符串(如  Ringer 、 Stringer )。  
3 、 LIKE'%en%'  将搜索在任何位置包含字母  en  的所有字符串(如  Bennet 、 Green 、 McBadden )。  
4 、 LIKE'_heryl'  将搜索以字母  heryl  结尾的所有六个字母的名称(如  Cheryl 、 Sheryl )。  
5 、 LIKE'[CK]ars[eo]n'  将搜索下列字符串: Carsen 、 Karsen 、 Carson  和  Karson (如  Carson )。  
6 、 LIKE'[M-Z]inger'  将搜索以字符串  inger  结尾、以从  M  到  Z  的任何单个字母开头的所有名称(如  Ringer )。  
7 、 LIKE'M[^c]%'  将搜索以字母  M  开头,并且第二个字母不是  c  的所有名称(如 MacFeather )。