JAVA面经—23届秋招面经总结----(二)
爱数 9.15一面(软件开发工程师):
0. 自我介绍
1.java数据类型
- 基本数据类型:整型、浮点型、字符型;
- 引用数据类型:数组、接口、类。(字符串也是)。
2.java支持多继承吗?要是想用多继承该怎么实现?
- 不支持。
- 可以去实现多个接口(interface)。
3.函数之间传参是值传递还是引用传递?
- 值传递。
传参为基本数据时,直接按值拷贝传递;
传参为引用数据类型时,指在方法调用时,传递的参数按引用传递,传递的是引用的地址。(也叫值传递,此时的“值”是对应的引用。)
4.解释一下自动装箱和自动拆箱?
- 自动装箱:将基本数据类型重新转化为对象。
例如:Integer i=9;
9属于基本数据类型,jdk1.5后引入了自动装箱,使得上述操作合法。 - 自动拆箱:将对象重新转化为基本数据类型。
public class Test {
public static void main(String[] args) {
/ /声明一个Integer对象
Integer i = 9;
// 进行计算时自动对i对象进行拆箱操作
System.out.print(i--);
}
}
输出:8
对象时不能直接进行运算的,上述代码进行了自动拆箱,将i对象转化为基本数据类型,再进行自减操作。
5.ArrayList和LinkedList区别
- 底层数据结构:ArrayList底层是Object数组,LinkedList底层使用的是双向循环链表。
- 插入删除是否受元素位置影响:
ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。LinkedList采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 o(1)而数组为近似o(n)。 - 是否支持快速访问:
LinkedList 不支持高效的随机元素访问,而ArrayList 实现了RandomAccess接口,所以有随机访问功能。快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index)方法)。 - 内存空间占用:ArrayList会有一定的空间浪费,会在list列表的结尾预留容量空间;LinkedList的空间花费体现在每个元素都需要更多的存储空间来存放该元素的前驱和后继数据,
6.简单说一下二叉树的后序、中序遍历
- 后序:依次遍历树的左右中节点。
- 中序:依次遍历树的左中右节点。
7.Hashset和Treeset的区别
- 不同点1:底层使用的储存数据结构不同:
HashSet底层是HashMap;
TreeSet底层是TreeMap。 - 不同点2:储存的数据保存唯一方式不同。
HashSet通过重写hashcode()方法以及equals()方法;
TreeSet通过实现Comparable接口。 - 不同点3:
hashset无序;
Treeset有序。
8.迭代器了解吗
迭代器,即接口Iterator。
通过两个方法来遍历集合:hasNext();next();
使用Iterator,可以遍历所有集合,如Map,List,Set;但只能在向前方向上遍历集合中的元素。
(扩展:使用ListIterator,只能遍历List实现的对象,但可以向前和向后遍历集合中的元素。)
public class iteratorTest {
public static void main(String[] args) {
List<String>list=new ArrayList<>();
list.add("a");
list.add("b");
Iterator<String> iterator1=list.iterator();//得到list的迭代器
//调用迭代器的hasNext方法,判断是否有下一个元素
while (iterator1.hasNext()) {
//将迭代器的下标移动一位,并得到当前位置的元素值
System.out.print(iterator1.next());
}
}
}
输出: a b
9.线程与进程的区别,什么情况用进程、线程?
- 区别:
调度:进程是资源管理的基本单位,线程是程序执行的基本单位。
切换:线程上下文切换比进程上下文切换要快得多。
拥有资源: 进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的资源。
系统开销: 创建或撤销进程时,系统都要为之分配或回收系统资源,如内存空间,I/O设备等,OS所付出的开销显著大于在创建或撤销线程时的开销,进程切换的开销也远大于线程切换的开销。 - 使用情形:
1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应
3、因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;
4、并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
5、需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。
10.在项目中的使用多线程的情况说一下
- 两个用户比如经理和管理员同时对订单数量进行修改,用到了多线程,对两步修改操作进行同步,保证不会出现数据不安全,使用同步锁,来解决线程安全问题。
- tomcat服务器内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。如果不采用多线程机制,上百个人同时访问一个web应用的时候,tomcat就得排队串行处理了,那样客户端根本是无法忍受那种访问速度的。
11.垃圾回收发生在什么时候
- 对象没有引用
在进行可达性分析后,确定哪些对象可以被回收。 - 当Eden区满时,触发Minor GC。
- Old区满时,触发Full GC。
- 执行方法:System.gc(),通知jvm进行一次垃圾回收。
11.tcp四次挥手
- 第一次挥手:客户端向服务端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待服务端的确认。
- 第二次挥手:服务端收到连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = k,确认号 ack = u + 1。
- 第三次挥手:服务端向客户端发送连接释放报文(FIN=1,ACK=1),主动关闭连接,同时等待 A 的确认。
- 第四次挥手:客户端收到服务端的连接释放报文后,立即发出确认报文(ACK=1),序列号 seq = u + 1,确认号为 ack = w + 1。
12.HTTP和TCP/IP的关系
TCP/IP网络通常分成4层,分别是应用层、传输层、网络层、网络接口层。
HTTP只是为传输做好了前期准备,TCP协议主要解决如何在IP网络层之上可靠的传输数据包,IP网络层负责将数据从一个设备传输到另一个设备。
HTTP是应用层的协议,TCP是传输层的协议,IP是网络层的协议。
13.tcp中的Keepalive
Keepalive是TCP 的保活机制。
TCP 保活机制可以在双方没有数据交互的情况,通过探测报文,来确定对方的 TCP 连接是否存活,这个工作是在内核完成的。
14.如果已经建立了TCP连接,但是客户端出现进程崩溃了怎么办?
通过定时器 + 超时重试机制,尝试获取确认,直到最后会自动断开连接。