面试问题总结

1、 TCP与UDP的区别,如何实现UDP安全传输

由于在传输层UDP已经是不可靠的连接,那就要在应用层自己实现一些保障可靠传输的机制
简单来讲,要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的
- 超时重传(定时器)
- 有序接受 (添加包序号)
- 应答确认 (Seq/Ack应答机制)
- 滑动窗口流量控制等机制 (滑动窗口协议)

等于说要在传输层的上一层(或者直接在应用层)实现TCP协议的可靠数据传输机制,比如使用UDP数据包+序列号,UDP数据包+时间戳等方法。

目前已经有一些实现UDP可靠传输的机制

滑动窗口:

在这里插入图片描述

怎么解决HashCode冲突

  • 开放地址法
    1、线性探测法,如果发生冲突,从该位置向后遍历直到下一个空槽
    2、线性补偿探测法,将线性探测法的步长1改为Q
  • 链地址法
    构成一个单链表,并将单链表的头指针存在hash表格中
  • 重哈希法
    构造多个不同的hash函数,冲突时,就再计算一个hash值
  • 建立公共溢出区
    建立一个溢出区,凡是冲突的放到溢出区

3、 Hashmap的底层实现原理?

HashMap原理

4、 HTTP与HTTPS的区别,分别介绍

具体的区别如下:

1、HTTPS更安全:HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议的信息明文传输安全;

2、HTTPS需要申请证书:HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费,费用大概与.com域名差不多,每年需要大约几十元的费用。而常见的HTTP协议则没有这一项;

3、端口不同:HTTP使用的是大家最常见的80端口,而HTTPS连接使用的是443端口;

4、安全性不同:HTTP的连接很简单,是无状态的。而HTTPS协议是SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全

5、 HTTPS是如何实现的

1、客户端发起HTTPS请求

就是用户在浏览器里输入一个https网址,然后连接到server的443端口

2、服务端的配置

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。

这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。

3、传送证书

这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

4、客户端解析证书

这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。

如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。

5、传送加密信息

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。

6、服务端解密信息

服务端用私钥解密后,得到了客户端传过来的随机值(新的私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。

7、传输加密后的信息

这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。

8、客户端解密信息

客户端用之前生成的私钥(随机值)解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

6、C++与JAVA的区别

尽管Java是基于C++的的,但是相比之下,Java是一种更纯粹的面向对象程序设计语言。在Java中,一切都被视为对象。 
1. C++创建对象之后,需要再使用完将其调用delete方法将其销毁;Java有垃圾回收机制,用来监视new出来的所有对象,辨别不会再被引用的对象,然后释放内存空间。 
2. 作用域(C、C++、Java的作用域由花括号的位置决定): C和C++会将较大作用域的变量隐藏起来,但是Java不允许。
3、当变量作为类的成员使用时,Java才确保给定默认值,以确保那些基本类型的成员变量得到初始化,但是C++没有此功能。而对于局部变量,C++编译器会对其予以警告,Java则会视为错误。
4、Java不可以将一个非布尔值当做布尔值在逻辑表达式中使用,C++却可以。 
在C++中表达式的值为0则为假,非0则为真。
5、Java中新增了一种“无符号”右移位操作符(>>>),它使用“零扩展”,无论正负,都在高位插入0。这是C、C++中所没有的。
6、Java没有Sizeof()。在C\C++中,sizeof()操作符可以告诉我们为数据项分配的字节数,因为C++中不同的数据类型在不同的机器上可能有不同的大小。但是Java中所有数据类型在所有机器中大小都是相同的
7、C++有goto,Java没有goto。 
8、C++中有多继承,Java中只有单一继承。Java可以通过接口实现多继承
9、Java是半解释和半编译的,运行速度比C++慢
10、 C++有指针,Java没有
11、在c++中,数组定义时,已经分配存储空间,并可以使用。 (定义时指定数组大小) 
   在java中,数组定义时,int arr[],只字义了数组变量,数组是不可以使用的。 只有数组new以后,才会创建数组,分配存储空间,并可以使用
  

7、面向对象与面向过程

面向对象与面向过程

8、 JAVA中的继承与C++中的继承有什么不同?

C++中一个类能同时继承多个类
java中一个类只能继承一个类
可以通过实现多个接口达到类似多重继承的效果

9、接口和抽象类的异同

相同点:都不能实例化
不同点:

1.接口只有定义,其方法不能再接口中实现,只有实现接口的类才能实现接口中定义的方    法,而抽象类的方法可以再抽象类中被实现。

2.接口需要用implements实现,抽象类只能被继承(extends)。

3.设计理念不同,接口是"has - a ",抽象类是"is -a "

4.接口中定义的成员变量默认修饰符为public static final(静态不能被修改),而且必须      给其赋初值。抽象类可以有自己的数据成员变量,也可以有非抽象的成员变量,而且抽象类中的成员变量默认为default(本包可见)。抽象类中的方法前面有abstract修饰,不能用private、static、synchronize、native修饰,同时方法必须以分号结尾,不带花括号。

10、什么是多态

按字面意思就是多种状态,在面向对象语言中,接口的多种不同的实现方式即为多态,应用时就是将子类对象指向父类型的引用

11、什么是封装

就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,控制用户对类的修改和访问数据的程度
把该隐藏的隐藏起来,把该暴露的暴露出来

12、什么是继承

继承是面向对象中的一个非常中要的的特性,通过继承,子类可以使用父类中的一些成员变量与方法,从而能够提高代码的复用性,提高开发效率

13、Linux

linux

14、线程与进程

线程
线程是程序中一个单一的顺序控制流程。进程的一个实体,是系统独立调度和分派CPU的基本单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程
线程与进程

15、Spring

Spring

16、进程通信

进程与线程
进程、socket

17、类加载详细过程

加载器加载到jvm中,接下来其实又分了好几个步骤:

加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象。
连接,连接又包含三块内容:验证、准备、初始化。

  • 验证,文件格式、元数据、字节码、符号引用验证;
  • 准备,为类的静态变量分配内存,并将其初始化为默认值;
  • 解析,把类中的符号引用转换为直接引用

初始化,为类的静态变量赋予正确的初始值。

18、MySQL

mysql常见问题

mysql是否可以做主备

MySQL可以做主备,主从复制延迟问题

mysql的union和union all

union和union all 的区别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值