Java中涉及常见面试整理
1.JDK 与 JRE 区别?
JDK
是Java
开发工具包,包含Java的运行时环境;
JRE
是Java运行时环境(包含Java基础的使用类库以及Java虚拟机)
2.Java基本数据类型有哪些
Java
基本数据类型:
整形:
byte short int long
浮点型:float double
字符型:char
布尔型:boolean
3.final在Java中的作用?
修饰类:表示
该类不能被继承
,类中所有成员方法都被隐式指定为final方法;
修饰方法:不可被重写;
修饰变量:不可被改变,修饰引用变量表示引用不可变,引用的内容可变;
修饰常量:编译阶段被存入常量池中;
4.Java 中操作字符串都有那些类,区别?
操作字符串的类有:
String
StringBuilder
StringBuffer
String
:只读字符串,每次对String的操作都会产生一个新的对象;
StringBuilder
: 可变的字符数组,线程不安全,效率相对高;
SringBuffer
: 可变的字符数组,线程安全。
5.接口与抽象类的区别?
(1)抽象类中可以定义构造器,接口不能;
(2)抽象类可以有抽象方法和具体方法,接口中不能有具体方法;
(3)抽象类中可以定义成员变量,接口中只能是常量;
(4)抽象类中可以包含静态方法,接口不行;
6.TCP协议三次握手与四次挥手,能否是2次握手或者是4次?
三次握手:
第一次握手:客户端给服务端发送
SYN
(同步序号标志位)报文,申请建立客户端到服务端的连接;第二次握手:服务端接收客户端的数据报文后,服务端返回
SYN+ACK(确认号是否有效)
给客户端以确认连接服务端到客户端的请求;第三次握手:客户端接收到服务端返回的数据报,将状态置为
established
,并返回ACK
给服务端,服务端接收到这个ACK
,就将状态置为established
,建立了服务端到客户端的连接;
四次挥手:
- 第一次挥手:客户端发送
FIN
(结束报文段)到服务端,申请建立关闭客户端到服务端的连接;- 第二次挥手:服务端接收到
FIN
,将状态置为close_wait
,并返回一个ACK
应答给客户端(TCP
协议默认执行)- 第三次挥手:服务端发送一个
FIN
到客户端,申请关闭服务端到客户端的连接,并执行关闭前的一些操作;- 第四次挥手:客户端返回
ACK
到服务端,并将状态置为close_wait
,需要等待一段时间(防止丢包重传FIN
),客户端在将状态置为closed
,等服务端接收到这个数据报时,将状态置为closed
关闭连接;
不可以是2
次,不可靠;
可以是4
次,但存在效率问题;
7.Java常见容器有哪些?
list
:有序的集合,元素可以重复,可以进行索引访问以及动态扩容;
map
:使用键值对存储元素,元素不允许重复,无序;
set
:元素不能重复,无序;
8.ArrayList 与LinkedList 区别?
ArrayList
:底层采用数组来存储元素,因此物理上连续,支持随机访问,支持扩容,但在任意位置插入删除元素,需要进行元素的搬移,因此,时间复杂度为O(N);
LinkedList
:底层采用双向链表结构,因此逻辑上是连续的但物理上不一定连续;,不支持随机访问,并且没有扩容的概念;任意位置插入删除元素,只需要修改引用即可,因此时间复杂度为O(1)。
9.栈、虚拟机栈、栈帧、操作数栈区别?
栈:是一种后进先出的数据结构,在Java中对应的实现为
Stack
;虚拟机栈:是一块具有特殊作用的内存空间,生命周期与线程相同,
JVM
为了方便管理,将内存分为栈区与堆区;栈区,线程是私有的,主要存放函数调用的一些信息,主要有栈帧,堆区:一般new出来的空间都在堆区;栈帧:用于支持Java虚拟机进行方法调用和执行的数据结构,每个方法在执行时都会创建一个栈帧,用于保存局部变量表、操作数栈、动态链接以及方法出口等信息,当方法调用结束时,该方法对应的栈帧会从虚拟机栈中进行出栈;
操作数栈:也被称作操作栈,是一个后进先出的栈,同局部变量表一样,在编译期间,操作数栈的最大最大深度就被确定下来了。
10.HashMap 为什么要重写 HashCode 与 equals 方法?
HashMap
是泛型的,里面存放键值对,而它的哈希函数底层采用的是除留余数法,因此,当key
不是整形时,就需要提供HashCode
方法,将key
转为整形;
重写equals
方法,是因为默认情况下继承基类中的equals
方法,但基类中equals
方法是比较对象的地址,当要比较对象的值时就需要重写equals
方法。
11. 与equals 区别?==
==
:比较地址是否相等equals
:比较内容是否相等
12.IO流的分类?
按照流向:输入流 输出流
按照操作单元:字节流 字符流
按照流的角色:结点流 处理流
13.事务的四大特性?
- 原子性; 持久性; 一致性; 隔离性
14.http 协议中,请求方法有哪些?
请求方法:
get
post
get
与post
区别:
- 语义上:
get
是获取资源,post
是提交资源;- 数据存放位置:
get
存放在queryString
中,post
存放在body
中;- 幂等性:
get
具有幂等性,post
则没有;- 缓存:
get
可以,post
不可以;
15.http 与 https 区别?
- 安全性:
https
是加密后的密文传输,安全,而http
明文传输,不安全;- 默认端口:
http
默认端口80
,https
默认端口443
;
https
是基于http
之上,使用TSL/SSL
协议进行加密的。
16.Cookie 是什么?
cookie
是客户端保存数据的一种技术,由于web
程序是使用http
协议进行传输的,而http
协议是无状态的协议,对于事务没有记忆能力,因此当后续处理需要处理前面的信息时,就需要重新上传,导致数据量增大;因此使用cookie
可以解决这一问题。
17.设计模式六大原则?
- 单一职责原则
- 接口隔离原则
- 依赖倒转原则
- 里氏替换原则
- 开闭原则
- 迪米特法制
18.两个对象的hashcode相同,则equals也一定为true吗?
两个对象的
equals
返回true
,那么hashcode
也一定相等;
两个对象的hashcode
相同,equals
不一定为true
;
19.数组中有没有length()方法,String有没有length()方法?
数组中是没有
length()
这个方法的,但有length()
这个属性,用来计算数组的长度;
String
中有length()
这个方法,用来计算字符串长度;
20.如何解决哈希冲突?
哈希冲突:多个不同元素经过相同的哈希函数,从而产生相同的哈希地址,称为哈希冲突;
解决方式:
- 先检查哈希函数是否设置合理,设计原则有:
(1)哈希函数定义必须包括要存储元素的全部关键码;
(2)哈希函数计算出来的哈希地址能够均匀分布整个空间;
(3)哈希函数设计尽可能简单;
- 方式一:闭散列:也叫开放定址法,指发生哈希冲突时,当哈希表中元素没有满的情况下,那么就可以将关键字
key
按照某种方式存放到发生冲突位置的下一个空位置中去;
找空位置的方式:
- 线性探测:从发生冲突的位置开始,依次向后探测,直到找到下一个空位置为止;
- 二次探测:原理同线性探测,只是中间间隔元素;
- 方式二:开散列,也叫链地址法,对关键码集合使用哈希函数计算散列地址,将具有相同地址的关键码归于同一个子集合中,每一个子集合称为一个桶,各个桶中的元素通过一个单链表连接,各链表的头结点存储在哈希表中。
21.常见Linux命令?
mkdir
:创建目录,mkdir t
:创建一个名为t的目录,当t存在时,会报错;
yum
: 安装(yum install软件名称)更新(yum update 软件名)卸载指令(yum remove 软件名)
vim
:文本编辑命令;使用i进入插入模式,再插入模式下不能保存,需要先回到普通模式,按下esc即可返回到普通模式;保存:冒号w;
ls
:显示目录与文件,ls-a:列出目录下所有文件;ls-l:列出文件的详细信息;ls-k:以K字节的形式表示文件的大小;
cd
:切换到某个目录;cd ~:切换到用户目录;cd /:切换到根目录;cd -:返回最近访问目录;cd …:返回上级目录;
less
:查看文件内容;less -N 文件名:显示文件每行的行号
ps
:查看进程,ps -elf
-e:显示系统内的所有进程信息;
-l:使用长(long)格式显示进程信息;
-f:使用完整的(full)格式显示进程信息。
22.HTTP协议及状态码?
http的全称为“超文本传输协议”,所谓超文本就是指它能够传输的内容有文本、图片、音频及视频等文件,是一种应用较广泛的 应用层协议,处于OSI七层模型(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)的第7层;(目前常用的是HTTP 1.1);
常见状态码:
(1)200 表示访问成功
(2)404 表示请求的URL路径中没有对应的资源
(3)403 表示禁止访问,一般有可能出现的情况就是权限不够
(4)405 表示方法不支持
(5)500 服务器内部出错
(6)301 302 表示重定向(重定向会发送两次请求)
23.TCP 与 UDP 区别?
(1)从特点来看:
TCP是有连接的、可靠的、面向字节流、有发送缓冲区以及接收缓冲区且大小不限;
UDP是无连接的、不可靠的、面向数据报,只有接收缓冲区没有发送缓冲区且大小受限的;
(2)从使用场景来看:
TCP协议适用高可靠性的业务场景中(文件传输);同时TCP提供了可靠传输及提高效率的机制:
表现在
:
可靠传输:校验和、序列号、确认应答、超时重传、连接管理、流量及拥塞控制)
提高效率:滑动窗口、延时应答、捎带应答UDP协议则适用于实时性要求高,但允许一等程度的丢包的(语音聊天)
24.网络5层结构以及各层作用?
(1)物理层:通过媒介传输比特
(2)数据链路层:负责封装和解封装ip报文 (帧)
(3)网络层:负责数据报从源到宿的传递(报文)
(4)传输层:负责对报文进行分组与重组 (包)
(5)应用层:负责向用户提供应用程序
25.数组与链表的区别?
逻辑结构上:数组在内存中是连续的,链表在内存中不连续
访问效率上:数组在内存中顺序存储,可以通过下标进行访问,访问效率高,链表要想访问某个元素,需要从头进行遍历;
越界问题上:数组的大小是固定的,存在访问越界问题,链表无影响;
使用场景上:频繁访问操作就选择数组、删除或插入元素时,则选择链表;
26.进城池?
在程序实际处理过程中,会有成千上万的任务需要执行,当成千上万的任务需要被执行时,我们就需要创建成千上万个进程嘛?显然是不可行的,首先由于创建进程需要耗费时间,销毁进程也需要耗费时间;第二,就算创建那么多的进程,操作系统也不可能让他们同时执行(效率太低),因此就需要进城池,定义一个池,里面存放固定数量的进程,有需求时,就拿一个池中的进程来处理任务,等处理完毕,进程并不关闭,而是将进程再放回到进城池中继续等待。
27.二叉树了解嘛?
二叉树:是结点的有限集合,该集合可以为空(空树);不为空:该二叉树由一个根节点和两颗被称为左右子树的二叉树组成;
同时,任何一颗二叉树中不存在度大于2的结点,包含两种特殊的二叉树,完全二叉树(假设一个二叉树的高度为H,则它的前H-1层结点军达到饱和,H层结点从前往后依次排列)和满二叉树(每层结点树都达到最大值)
28.链表了解嘛?
链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的;有8种不同的分类,分别为:带头链表、不带头链表、单向链表、双向链表、循环和非循环链表。
29.接口测试怎么测?用什么工具?
首先,接口其实就是一个网址(URL),对其进行测试时,
(1)需要检查数据的正确性:不同的参数可能对应不同的结果;
(2)请求类型的判断,是get还是post请求;
(3)检验接口的兼容性:传入异常数据时,是否会发生崩溃
(4)参数是否有加密
常见的接口测试工具
:Postman、SoapUI、REST-Assured、JMeter、Apifox、Katalon
Studio、Karate
30.进程与线程有什么区别?
进程:是系统分配资源的最小单位(基本单位),占用独立的虚拟内存空间
线程:操作系统调度cpu执行的基本单位
联系
:进程包含线程,一个进程至少包含一个线程,都有创建、就绪、运行、阻塞以及销毁状态;