JAVA基础
- 面向对象的特征
封装,继承,多态
· 封装是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
· 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
· 多态是同一个行为具有多个不同表现形式或形态的能力。同一个接口,使用不同的实例而执行不同操作
- 重载和重写
方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。
方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。
- 接口和抽象类的区别
相同点
(1)都不能被实例化
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点
(1)接口只有定义,不能有方法的实现,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
- 类加载机制
加载,链接,初始化
加载:加载二进制数据到内存 —> 映射成jvm能识别的结构 —> 在内存中生成class文件
链接:验证、准备、解析三个阶段。
初始化:初始化就是执行类的构造器方法init()的过程。 - 泛型
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
- ArrayList和LinkList区别
ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
在ArrayList中,由于元素存储在连续的内存位置上,因此使用迭代器遍历元素时效率更高。
在LinkedList中,每个元素存储在不同的内存位置上,因此需要随机跳转指针遍历元素,效率比ArrayList低。
- HashMap的底层实现
HashMap底层采用数组+链表+红黑树的数据结构实现 。
数组用于存储键值对,链表用于解决哈希冲突,红黑树在链表长度超过一定阈值时转换以提高查找效率 。
HashMap是基于Map接口实现,允许使用null键和null值,但是不保证映射的顺序,且是无序的、线程不安全的。
- 红黑树
红黑树是一种自平衡的二叉查找树,是一种高效的查找树。
节点是红色或黑色。
根是黑色。
所有叶子都是黑色(叶子是NIL节点)。
每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。 - 线程池
线程池就是管理一系列线程的资源池,其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息,例如已完成任务的数量。
线程池一般用于执行多个不相关联的耗时任务,没有多线程的情况下,任务顺序执行,使用了线程池的话可让多个不相关联的任务同时执行。 - JVM的内存结构
VM的内存结构大概分为:
堆(Heap):线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。
方法区(Method Area):线程共享。存储类信息、常量、静态变量、即时编译器编译后的代码。
方法栈(JVM Stack):线程私有。存储局部变量表、操作栈、动态链接、方法出口,对象指针。
本地方法栈(Native Method Stack):线程私有。为虚拟机使用到的Native 方法服务。如Java使用c或者c++编写的接口服务时,代码在此区运行。
程序计数器(Program Counter Register):线程私有。也翻译成PC寄存器(PC Register)。可以看作是当前线程所执行的字节码的行号指示器。指向下一条要执行的指令。
- jvm垃圾回收
标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。
复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。
标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。
OS
- 进程和线程的区别
二者均可并发执行。
线程是指进程内的一个执行单元,也是进程内的可调度实体。一个程序至少有一个进程,一个进程至少有一个线程,一个线程只属于一个进程。资源分配给进程,同一进程的所有线程共享该进程的所有资源。
进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
- 线程间如何通信
共享内存、消息传递和管道流
共享内存:线程之间共享程序的公共状态,线程之间通过读-写内存中的公共状态来隐式通信。
消息传递:线程之间没有公共的状态,线程之间必须通过明确的发送信息来显示的进行通信。
管道流:管道输入/输出流的形式 - volatile关键字解决什么问题
volatile关键字用于修饰被不同线程访问和修改的变量。保证可见性、有序性和禁止编译器优化
计网
- HTTP的状态码
共享内存:信息响应 (100–199)
成功响应 (200–299)
重定向消息 (300–399)
客户端错误响应 (400–499)
服务端错误响应 (500–599) - HTTP跟HTTPS有什么区别
· HTTPS协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
· HTTP是超文本传输协议,信息是明文传输,安全性较低,而HTTPS则是具有安全性的SSL加密传输协议。
· HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
· HTTPS主要作用包括两方面,一是数据加密,保证数据传输的安全性,二是确认访问网站的真实性,起到身份验证的作用。
· HTTP数据传输是不经过加密的,因此在传输过程中数据的完整性无法得到保证,数据有被篡改的风险。HTTPS使用数字证书对通信进行加密,可以保证数据在传输过程中不被篡改,确保数据的完整性。 - TCP、IP分别在哪一层
TCP在TCP/IP网络体系结构中属于传输层
IP 协议位于 OSI 参考模型的第三层,即网络层。 - TCP的滑动窗口工作过程
TCP 将数据分成若干段,依次发送出去。
接收端接收到了 seg1 seg2 seg4,回复一个 ACK 包说明已经接收到,并将 seg4 进行缓存。
发送端收到 ACK 之后,将对应的数据包变为已确认状态,窗口向右移动。
窗口右移,产生一些新的空位,这些是接收端允许发送的范畴。
对于丢失的 seg3,如果超过一定时间,TCP 就会重新传送(重传机制),重传成功会 seg3 seg4 一块被确认,不成功,seg4 也将被丢弃。 - https的ssl的执行流程?
对称加密、非对称加密、混合加密机制
· SSL加密技术协议,SSL采用混合加密(同时使用非对称加密和对称加密)的方式建立起安全的HTTP通信。 - 输入网址到出现网页的过程
DNS 解析:将域名解析成 IP 地址
TCP 连接:TCP 三次握手
发送 HTTP 请求
服务器处理请求并返回 HTTP 报文
浏览器解析渲染页面
断开连接:TCP 四次挥手 - https的ssl的执行流程?tcp三次握手中ssl用到了几次?公钥是谁产生的?
-
tcp和udp的区别是什么?tcp拥塞控制的实现方式?
TCP是一种面向连接的协议,它提供了可靠的、顺序的数据传输服务;而UDP则是一种无连接的协议,它以更快的速度传输数据,但并不保证数据的完整性和顺序。
网络拥塞的定义和条件
拥塞控制的作用
拥塞控制的解决方法:慢开始、拥塞避免、快速重传、快速恢复
发送方维持拥塞窗口的原则:只要网络没有拥塞,拥塞窗口就增大一些,以便发送更多分组出去
滑动窗口协议通过动态调整窗口大小来实现流量控制和拥塞控制
TCP的三个主要组成部分:发送方、接收方和网络