基础面经札记3

某公司面试问题

1.抽象类与接口区别

接口是对动作的抽象,抽象类是对根据的抽象。

  1. 接口不能实例化;
  2. 接口只能包含方法声明;
  3. 接口的成员包括方法,属性,索引器,事件;
  4. 接口中不能包含常量,字段(域),构造函数、析构函数,静态成员。

抽象类可以有构造方法,接口不能有构造方法。

  1. 抽象类可以有普通成员变量,接口中无;
  2. 抽象类可以包含非抽象普通方法,接口中所有方法都是抽象的;
  3. 抽象类中的抽象方法的访问权限可以是public类型和default,接口中的抽象方法只能是public类型, 默认是public abstract类型。

一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类
接口不可以实现接口,可以继承接口,并且可以多个接口。

2.Java是值传递还是引用传递

值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数。

就 Java 语言本身来说,只有值传递,没有引用传递。
根据 值传递,引用传递的定义来说:

  1. Java 中的基本类型,属于值传递。
  2. Java 中的引用类型,属于引用传递。
  3. Java 中的 String 及包装类,属于特殊群体,作为形参时,由于每次赋值都相当于重新创建了对象,因此看起来像值传递,但是其特性已经破坏了,值传递、引用传递的定义。因此他们属于引用传递的定义,却表现为值传递。

3.讲讲工厂和抽象工厂

工厂模式

工厂模式是最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A()
工厂模式也是用来创建实例对象的,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象,这可以给系统带来更大的可扩展性和尽量少的修改量。

抽象工厂
抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
也就是说抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象

工厂模式:客户必须清楚地指出想获取哪种产品;由接口的子类负责获取产品
抽象工厂模式:客户不知道其想获取哪种产品;由接口中判断调用哪个子类,通过子类获取产品。

4.url组成

一个完整的URL包括:服务方或协议,主机地址或端口,资源的具体地址。

以下面这个URL为例

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

一个完整的URL包括以下几部分:

  1. 协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

  2. 域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

  3. 端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口80

  4. 虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

  5. 文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

  6. 锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

  7. 参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

5.http请求报文组成,怎么知道http请求长度

HTTP请求报文由3部分组成(请求行+请求头+请求体)

请求行:

  1. 是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。
  2. 为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。
  3. 是协议名称及版本号。

请求头:

  1. 是HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
  2. 与缓存相关的规则信息,均包含在header中

请求体:

  1. 是报文体,它将一个页面表单中的组件值通过param1=value1&param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html? param1=value1&param2=value2”的方式传递请求参数。

http请求长度
Content-Length是HTTP消息长度, 用十进制数字表示的八位字节的数目, 是Headers中常见的一个字段

Content-Length使用十进制的数字表示了消息的长度, 服务端/客户端通过它来得知后续要读取消息的长度.

6.http与https的区别

什么是HTTP?
http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。

什么是HTTPS?

Https = Http + SSL

SSL协议:SSL(Secure Socket Layer)安全套接层,是一种位于应用层与传输层之间,为网络通信提供安全及完整性验证的一种网络协议。

相对于TCP或HTTP协议,SSL协议要复杂很多。由于它也是建立在TCP协议之上的,所以在使用SSL传输数据之前需要先进行三次握手和服务器建立连接。

HTTPS在HTTP基础上加入SSL协议,SSL协议依靠证书来验证服务器的身份,并对传输的数据进行加密,保障数据的安全性。这个过程大致为:发送HTTPS请求、得到返回证书、对证书验证、密钥交换、数据传输。

HTTP vs HTTPS

HTTP特点:

  1. 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
  2. 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
  3. 基于请求和响应:基本的特性,由客户端发起请求,服务端响应简单快速、灵活
  4. 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性

HTTPS特点:

  1. 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  2. 验证身份:通过证书认证客户端访问的是自己的服务器
  3. 保护数据完整性:防止传输的内容被中间人冒充或者篡改

7.http请求方法

在这里插入图片描述

8.tcp传输不拥堵,udp拥堵,为什么?

因为TCP有校验和,超时重传,连接管理,流量控制,拥塞控制等机制保证了它传输不拥堵,但是传输速率慢。而UDP为了传输快,就舍弃了这些机制,但接收方来不及接受时,很容易造成拥堵。

校验和:如果接收方比对校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。
序列号:序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。
确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
超时重传:在进行TCP传输时,由于确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的ACK报文,并解析ACK报文,判断数据是否传输成功。如果发送方发送完数据后,迟迟没有等到接收方的ACK报文,这该怎么办呢?而没有收到ACK报文的原因可能是什么呢?
首先,发送方没有介绍到响应的ACK报文原因可能有两点:

  1. 数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到。
  2. 接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。
  3. TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制。简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

连接管理:连接管理就是三次握手与四次挥手的过程,保证可靠的连接,是保证可靠性的前提。
流量控制:接收端在接收到数据后,对其进行处理。如果发送端的发送速度太快,导致接收端的结束缓冲区很快的填充满了。此时如果发送端仍旧发送数据,那么接下来发送的数据都会丢包,继而导致丢包的一系列连锁反应,超时重传呀什么的。而TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制
拥塞控制:拥塞控制是TCP在传输时尽可能快的将数据传输,并且避免拥塞造成的一系列问题。是可靠性的保证,同时也是维护了传输的高效性。

9.四次挥手

四次挥手

  1. 第一次挥手:A数据传输完毕需要断开连接,A的应用进程向其TCP发出连接释放报文段(FIN = 1,序号seq = u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1状态,等待B的确认。
  2. 第二次挥手:B收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT关闭等待状态,此时的TCP处于半关闭状态,A到B的连接释放。而A收到B的确认后,进入FIN-WAIT-2状态,等待B发出的连接释放报文段。
  3. 第三次挥手:当B数据传输完毕后,B发出连接释放报文段(FIN = 1,ACK = 1,序号seq = w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A 的最后确认。
  4. 第四次挥手:A收到B的连接释放报文段后,对此发出确认报文段(ACK = 1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSE状态。

关闭连接时,被动关闭方可能还需要发送一些数据后,再发送FIN报文表示同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的,所以需要四次挥手。

10.mysql基本数据类型,金钱价格应用什么数据类型

基本数据类型

整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
实数类型:FLOAT、DOUBLE、DECIMAL
字符串类型:varchar、char、blob、text
日期和时间类型:DATETIME、TIMESTAMP

金钱价格数据类型

float和double都是不能用来表示精确的类型的,因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定。

金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用BigDecimal.
MYSQL数据库选择decimal类型,注意默认值 一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!

11.mysql的索引怎么运作?

索引是一种避免扫描整个表以获得您正在寻找的结果的方法。

存在不同类型的索引,它们在存储层中实现,因此它们之间没有标准,它们也依赖于您正在使用的存储引擎。

InnoDB和B + Tree索引

对于InnoDB,最常见的索引类型是基于B + Tree的索引,它以排序顺序存储元素。

12.redis数据类型

String
1.string是Redis最基本的数据类型,一个key对应一个string。
2.string 类型是二进制安全的。意思是 redis 的 string 任意格式的二进制数据。比如jpg图片或者序列化的对象。
3.string 类型的值最大能存储 512M

Hash
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

List
Redis List是简单的字符串列表,数据结构是双向链表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),也就是兼有栈和队列的特性。因为是链表,所以查找的复杂度就是O(n)了,但是考虑到常用的指令都是在列头和列尾操作,所以这种数据结构才是最适合的。

Set
1.Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

2.Redis 中集合是通过哈希表实现的,其实就是一个值为null的hashmap,所以添加,删除,查找的复杂度都是 O(1),也可以通过计算hash来排重和判断一个数据是否在集合中。

Sorted Set
1.Redis sorted set和Set一样也是string类型元素的集合,且不允许重复的成员。
2.不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
3.有序集合的成员是唯一的,但分数(score)却可以重复。

13.Lunix文件权限设置

文件的权限针对三类对象进行定义

owner 属主,缩写u
group 属组,缩写g
other 其他,缩写o

每个文件针对每类访问者定义了三种主要权限

r:Read 读
w:Write 写
x:eXecute 执行

另 X:针对目录加执行权限,文件不加执行权限(因文件具备执行权限有安全隐患)

注意:root账户不受文件权限的读写限制,执行权限受限制

修改文件访问权限的方法:chmod 修改权限

chown 设置文件所有者(普通用户无法修改文件所有者)

chgrp 设置文件所属组(普通用户要想该所属组,前提是文件所有者为自己,自己在所属组中)

chmod 设置指定文件权限

chattr 给指定文件添加保护,避免root账户误操作

猜你喜欢

转载自blog.csdn.net/qq_42748009/article/details/114578630
今日推荐