JAVA后端面经随笔总结(1)

1. 快速排序和归并排序

两个都是常用的O(nlogn)的排序算法,归并排序在任何条件下都是O(nlogn)的时间复杂度,而快排在最差状态下退化成O(n^2)。

快排不稳定,归并稳定

一般语言库中自带的排序方法sort()都是基于快速排序的。

一般文件外部的磁盘文件会采用归并排序,因为快排依赖于数据的随机程度。

2. TCP/IP协议为什么可靠?

1. 面向连接、三次握手 2. 重传机制 3. 流量控制 4. 拥塞控制 5. 首部校验和 6. 序号和ACK确认

3. TCP为什么三次握手?四次挥手?

三次握手是因为接收方需要确认是否发送方成功获取到连接成功的信息。否则在二次握手的情况下,可能出现以下情况:

服务器成功接收发起请求并返回ACK,但ACK丢失。客户端会在超时后重新传输请求包,这会被服务器认为客户端发起了一个新的请求,并开辟新的进程监听。导致资源浪费。

四次挥手是因为TCP连接本身是全双工的,一方发起FIN请求并得到回应后只能表示发起方的传输工作结束,但接收方可能仍然有数据需要传输。当接收方结束后再发起一轮FIN请求,表示双方都关闭连接。

4. Java HashMap底层

链表数组 + 链表 + 红黑树(1.8)

通过hash &(n -1)的计算得到链表首地址位置

get(Object key)

首先通过 Node<K,V>[hash &(n -1)]找到头节点

再遍历得到目标

put(key, value)

首先与get的第一步相同,有相同key的话则刷新value,否则插入到链表尾部

链表长度 >8 则转化为红黑树

hash值计算有两步:

1). key.hashcode(),Object类中默认的hashCode()返回32位JVM内存地址

2). HashMap中调用hash()二次计算来优化散列表,hash值本身右移16位并 位异或操作,混合原始哈希码的高16位和低16位,以此来加大低位的随机性。

5. == 和 equals()

对于基本变量, ==就是判断值,包括包装类Integer, Float等与其基本类型做比较,都是判断值。

对于Object来说,==判断两个对象的地址是否相同

默认的equals()方法也是调用了 ==, 但是包装类和String类实际上重写了equals方法

6. B树与B+树(面试常考,需要自己加深理解)

都是平衡多路查找树,应用于大规模数据存储和数据库索引

(1)B树类似于二叉排序树

对于m阶的B树来说

- 树的每个节点的子树堆垛为m

- 若根节点不是叶子节点,则至少有两棵子树

- 非终端节点,至少有m/2棵子树

- 节点信息为(n, A0, K1, A1, K2, ..., Kn, An)

其中 K为关键码,A指向子树根节点

高度h = log_m/2((n+1)/2) +1

(2)B+树

与B树差不多

非终端节点都是索引,叶子节点包含全部关键码信息,相互之间有指针链接

7. 为什么用B+树来做索引

因为索引比较大,常存储于外存当, B+树的高度比红黑树低,搜索时间较低,所以更适合。

8. 红黑树(需要单独学习)

一种二叉平衡树,插入效率比AVL更高, JAVA中 TreeMap和TreeSet

9. ArrayList Vs. LinkedList

 ArrayList的底层实现是数组,扩容需要旧数组到新的内存当中去

时间复杂度 

ArrayList: get O(1), add O(1)摊销, remove O(n)

LinkedList: get O(n), add O(1), remove O(n)

10. JVM 内存模型(重点,这里不够仔细,需单独了解)

线程栈(线程之间相互隔离),包括栈帧,对应执行的方法。里面有局部变量和基本类型。栈的大小是固定的,可以用jvm参数 -XSS控制

堆区存储对象

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值