java面试完问题 及答案 复习

面试题https://www.cnblogs.com/javastack/p/9546015.html
https://blog.csdn.net/u014664750/article/details/78980133

JAVA中的几种基本数据类型是什么,各自占用多少字节。
https://www.cnblogs.com/spenserliu/p/9850232.html
String类能被继承吗,为什么。
https://blog.csdn.net/zhangyubishoulin/article/details/82459855
String,Stringbuffer,StringBuilder的区别。
https://blog.csdn.net/kingzone_2008/article/details/9220691
ArrayList和LinkedList有什么区别。
https://blog.csdn.net/weixin_42468526/article/details/81178698

IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。
https://www.cnblogs.com/xuxiuxiu/p/7798136.html

代理 静态代理 动态代理(InvocationHandler 重写invoke()) cglib代理(MethodInterceptor重写intercept)
https://www.cnblogs.com/cenyu/p/6289209.html
什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。
java8的新特性。
🐴🐴🐴
🐴🐴🐴docker启动redis 集群
https://segmentfault.com/a/1190000010131816

🐴🐴🐴缓存击穿/雪崩/穿透
https://baijiahao.baidu.com/s?id=1655304940308056733&wfr=spider&for=pc
🐴🐴🐴sql优化过程
https://blog.csdn.net/m_nanle_xiaobudiu/article/details/79288257

🐴🐴🐴jvm调优思路
https://baijiahao.baidu.com/s?id=1617167971312758600&wfr=spider&for=pc
https://www.jianshu.com/p/b92b08706a12
https://blog.csdn.net/b1303110335/article/details/104877029
🐴🐴🐴JVM基本参数
https://blog.csdn.net/Andy86869/article/details/83217169

慕课网 剑指offer java面试复习

🐴🐴🐴tcp3次握手/4次挥手

🐴🐴🐴4次挥手 timewait状态/close_wait过多原因
https://blog.csdn.net/qq_40910541/article/details/88677656
https://www.cnblogs.com/softidea/p/5741192.html
TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。
因为TIME_WAIT状态持续2MSL,
🐴🐴🐴tcp syn flood 攻击
https://blog.csdn.net/xiyou222/article/details/51285562
https://www.cnblogs.com/jokerbj/p/11278067.html
A(攻击者)发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当这个服务器返回ACK以后,A不再进行确认,那这个连接就处在了一个挂起的状态,也就是半连接的意思,那么服务器收不到再确认的一个消息,还会重复发送ACK给A。这样一来就会更加浪费服务器的资源。A就对服务器发送非法大量的这种TCP连接,由于每一个都没法完成握手的机制,所以它就会消耗服务器的内存最后可能导致服务器死机,就无法正常工作了。更进一步说,如果这些半连接的握手请求是恶意程序发出,并且持续不断,那么就会导致服务端较长时间内丧失服务功能——这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。

那么我们如何去防范这种SYN攻击呢?

其实最常用的一个手段就是优化主机系统设置。比如降低SYN timeout时间,使得主机尽快释放半连接的占用或者采用SYN cookie设置,如果短时间内收到了某个IP的重复SYN请求,我们就认为受到了攻击。我们合理的采用防火墙设置等外部网络也可以进行拦截。
🐴🐴🐴HTTP HTTPS区别
https://www.cnblogs.com/jesse131/p/9080925.html
🐴🐴🐴HTTPS 握手
https://www.jianshu.com/p/14cd2c9d2cd2
https://blog.csdn.net/jasonjwl/article/details/50985271
🐴🐴🐴IPV4 IPV6
https://blog.csdn.net/chao199512/article/details/86139714

🐴🐴🐴TCP和UDP的区别
https://www.jianshu.com/p/8cb4b1f2afb3
https://blog.csdn.net/xiaoyuerp/article/details/84102318.

🐴🐴🐴TCP滑动窗口
保证tcp可靠性(批量发送 按序列重排)
流量控制(接收方告诉发送方 接收方的能力)

接收方缓存池大小-未处理数据大小(接受位置-已处理的位置)
发送方滑动窗口
发送方滑动窗口

🐴🐴🐴HTTP请求/响应结构.
请求
响应结构

🐴🐴🐴HTTP请求过程
tcp连接为3次握手 链接结束为4次挥手 如果http keepalive则tcp保持

🐴🐴🐴HTTP状态码
1已接受
2成功3重定向4客户端错误5服务器错误

🐴🐴🐴HTTP GET POST区别
GET URL拼接参数 长度限制 POST 参数放在请求体body中
GET 幂等性 安全性 GET会被缓存/储存

🐴🐴🐴HTTP COOKIE SESSION 让http具有状态
COOKIE 客户端用户信息
SESSION 服务器端信息 服务器分发cookie jsessionid/url回写jesessionid参数
session更安全/但占用服务器性能

🐴🐴🐴加密方式
对称加密 加密解密公用一个key 效率高 DES 3DES AES
非对称加密 加密解密分别使用公钥私钥 安全性高 效率高 加密长度有限 RSA、DSA(数字签名用)、ECC(移动设备用)
哈希算法 将信息转为固定长度值 不可逆 MD5
数字签名 信息添加签名哈希值 确保数据没被修改
🐴🐴🐴HTTPS加密流程
HTTPS数据传输流程不用每次都非对称,第一次非对称传送对称加密的密钥,之后使用对称加密,避免性能问题。

🐴🐴🐴HTTPS HTTP区别
区别

🐴🐴🐴为何要四次分手呢?
那四次分手又是为何呢?TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。

**

数据库

**
🐴🐴🐴数据库模块设计
在这里插入图片描述
🐴🐴🐴索引数据结构
🐴🐴🐴为什么使用索引
因为要避免全表扫描 提升查找效率
🐴🐴🐴二叉查找树 平衡二叉树(相差不大于1)

二分查找法 O(log n)
缺点 增加删除后成为线性树

🐴🐴🐴B树 有M个孩子就是M届B树
定义:每个最多M个孩子 最少有MAX(M/2)个孩子 叶子节点位于同一层(矮 减少io)
因为定义所以不会形成线性树

🐴🐴🐴B+树
特点
在这里插入图片描述
在这里插入图片描述
优点:
1树更矮 io更低 树结构只存索引(可以存更多索引)
2效率更稳定 任何查找要从根节点到叶子节点
3扫描效率更高 因为数据项链

🐴🐴🐴HASH索引 速度快
在这里插入图片描述
缺点:不能使用范围查询 数据仍需排序
不能使用组合索引
不能避免表扫描 bucket对应多个数据 需要扫描
hash撞桶 性能低下(不稳定)

🐴🐴🐴BITMAP索引 存储空间小
适合 固定索引 性别 颜色 等
修改一个需要锁表
在这里插入图片描述
🐴🐴🐴密集/稀疏索引
MYSQL INNODB MYISAMDB
密集索引 物理排列顺序 索引都对应一个数据记录 以及其他列的信息 索引数据 一起存储
稀疏 对应多个 地址 及主键 索引数据 分开存储
在这里插入图片描述
在这里插入图片描述
🐴🐴🐴SQL优化
在这里插入图片描述
1打开慢日志
在这里插入图片描述
2explain 语句分析
在这里插入图片描述
index all为全表扫描

在这里插入图片描述
3修改sql语句 select 索引位 或添加索引/使用适合的索引(mysql有查询优化器会选择 但不一定是最优 需测试)
force index(xxx)强制使用xx索引
修改前
在这里插入图片描述
修改后
在这里插入图片描述
在这里插入图片描述
🐴🐴🐴联合索引 最左匹配原则
建立联合索引area title

条件为2者时 走联合索引 为area走 为title不走
在这里插入图片描述
原则为
在这里插入图片描述
成因 从col3开始找 col2 col1 但不能直接找 12

🐴🐴🐴索引越多越好? 否定
在这里插入图片描述
🐴🐴🐴INNODB /MYISAM 锁方面的区别是什么
MYISAM 支持表级锁 不支持行级锁 // INNODB同时支持
MYISAM select的时候会对表+读锁 update insert会对表上写锁 会阻塞
lock tables xxx read;上读锁(共享锁) 解锁unlock tables;
🐴🐴🐴MYISAM 表锁与索引无关 (检索性能高)
https://blog.csdn.net/fei33423/article/details/72229677 为什么检索性能高
select语句默认 共享锁 update insert默认排他锁
上读锁时 依然可以读 不能排他锁
上写锁(排他锁)时 读/写都被阻塞
select 语句上排他锁 for update;
在这里插入图片描述
🐴🐴🐴INNODB 可以提交事务 事务二段锁 行锁(走索引)表锁(不走索引)(读写性能高)
事务默认自动提交 autocommit ON
select并未上共享锁
上共享锁 (共享锁之后还可以执行其他锁)
在这里插入图片描述
共享排他规则相同
x排他 s共享锁
在这里插入图片描述
🐴🐴🐴MYISAM/INNODB 对比
行锁代价大 开销大
MYISAM 适合检索(效率高) 保存了count数量(count快)
不适合增删改(会锁表) 没有事务
INNODB 适合修改(只锁行 效率高) 可靠性高(支持事务)

🐴🐴🐴MYSQL各种锁
在这里插入图片描述
乐观锁 可以任意修改(修改之前取版本号) 在提交更新时比对数据版本(相同则更新/不相同失败)(1版本号2时间戳) 冲突则返回失败
悲观锁:全程在数据库层 排他锁实现(数据安全)(死锁 降低并行 效率低)

数据库事务

🐴🐴🐴事务的4大特性ACID
A原子性(要么全做 要么全失败)C一致性 I隔离性(多个事务 事务之间互不影响)D持久性(事务永久更改 更新不能丢失 系统故障也不能影响 INNODB为redo log file)
在这里插入图片描述
🐴🐴🐴事务并发引起的问题
🐴🐴事务更新丢失(innodb避免)

🐴🐴脏读
事务一操作后回滚
事务2 读到事务回滚前的脏数据 进行修改
解决办法:set session TRANSACTION ISOLATION LEVEL READ COMMITTED;//只读事务提交完的结果
🐴🐴不可重复读
事务一 第一次读 数据为事务2提交之前的数据
第二次读 数据为事务2提交之后的数据 2次读的数据不同
set session TRANSACTION ISOLATION LEVEL REPEATABLE READ;//设置隔离级别为 可重复读
🐴🐴幻读 (read commited 隔离级别出现)
事务一 读表数据 事务2新增或删除表数据 (均为提交)
事务一修改表数据 连带了新增/减少的那行
解决:set session TRANSACTION ISOLATION LEVEL SERIALIZABLE;//隔离级别最高(所有sql执行都会上锁) 会让事务2的新增阻塞

🐴🐴🐴事务隔离级别
mysql
select @@tx_isolation; 8.0为select @@transaction_isolation;
set session TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;//innodb可以读事务未提交的修改
在这里插入图片描述
🐴🐴🐴当前读 快照读

🐴🐴🐴RR/RC 快照读如何实现的
rr隔离级别下(原因为READ VIEW产生版本)
事务1 快照读300 事务2修改为0提交 事务1快照读还为300 事务1当前读为0
事务1 事务2修改为0提交 事务1快照读还为0 事务1当前读为0

RC隔离级别下 当前度 快照读都相同
原因:伪MVCC(多版本并发控制 读不加锁 读写不冲突)每行加入了3个字段
介绍和MVCC有关的字段:DATA_TRX_ID和DATA_ROLL_PTR。

DATA_TRX_ID:(最后一次修改的事务id)用来标识最近一次对本行记录做修改(insert|update)的事务的标识符, 即最后一次修改(insert|update)本行记录的事务id。

DATA_ROLL_PTR:(回滚指针)指写入回滚段(rollback segment)的 undo log record (撤销日志记录记录)。如果一行记录被更新, 则 undo log record 包含 ‘重建该行记录被更新之前内容’ 所必须的信息。
DB_ROW_ID 行号 随新行插入 而增的id

UNDO LOG 进行操作就会产生undo记录 老版本数据 (旧的数据 在undo日志中找她的版本数据)
undolog 分为 insert/update undo log(delete/update产生的log 回滚/快照读都需要)

READ VIEW 可见性
快照读时 会创建READ VIEW 可见性算法 对比DB_TRX_ID事务id与活跃事务id(最大最小 递增) 取出undo log

🐴🐴🐴RR下next-key锁 行锁 gap锁(防止幻读的发生 区间锁)
gap锁 rr 串行中才有
删改查
全部命中(where in 记录全能找到)不用gap锁 用记录锁record lock
部分命中 或未命中 区间上gap锁

REDIS

🐴🐴🐴redis多路复用选择
https://www.cnblogs.com/linganxiong/p/5583415.html
REDIS 主线程为单线程去操作 都为原子性操作
IO 多系统先选择O(1)的底层函数 ,没有则选择select()

🐴🐴🐴redis数据结构

🐴🐴🐴查找固定pattern的key
KEYS +PATTERN 缺点

SCAN+PATTERN+COUNT 可用在生产环境
在这里插入图片描述
在这里插入图片描述
🐴🐴🐴REDIS分布式锁

1setnx key之后再expirekey
如果设置成功则操作 不成功则等待
缺点:setnx和expire 两个动作并非一起原子性
2直接set 带上NX 和expire时间

🐴🐴🐴大量key在同时过期 造成卡顿
在这里插入图片描述
🐴🐴🐴REDIS做异步队列
初级

代替sleep机制 采用redis的 blpop 阻塞等待 pop
redis pub/sub模式 多个消费者消费消息
缺点 无状态 不保证可达(使用mq)

🐴🐴🐴redis持久化 3种
RDB 快照 手动触发
缺点:


自动触发

🐴🐴🐴BGSAVE 底层
调用fork创建子进程去写rdb 互不影响主进程 主进程如果要写 会在副本上写 互不影响 实现原子性 copy on write

🐴🐴🐴AOF append only file 追加 保存写状态 备份数据库接收到的指令

🐴🐴🐴AOF文件重写压缩 BG REWRITE AOF手动触发

🐴🐴🐴数据恢复 REDIS服务器启动时 直接加载aof 无则加载rdb

🐴🐴🐴RDB AOF 优缺点

🐴🐴🐴混合方式 RDB全量备份 AOF 追加RDB之后的改动 4.0之后

🐴🐴🐴redis pipeline batch执行命令 不用单条执行 单条响应


🐴🐴🐴主从同步 弊端 确保高可用
最终一致性 主写 从读 一个从保存修改 再通知主 将修改同步到从
全同步

增量同步 主先整理aof改动 在从写入改动

🐴🐴🐴redis sentinel哨兵高可用 流言协议-接受主状态信息 投票选新主

🐴🐴流言协议

🐴🐴主从同步设置
https://blog.csdn.net/qq_41782425/article/details/89287723
哨兵配置
https://blog.csdn.net/weixin_40671802/article/details/80798537
🐴🐴redis集群 一致性哈希算法 容错性 扩展性 解决高并发
数据分片
采用哈希环去定位 服务器位置 以及 数据位置 1-2^32

优点:宕机 影响数据少 好扩展
缺点:服务器较少时 数据倾斜

解决:服务器虚拟节点 每个服务器多个节点
在这里插入图片描述
redis集群设置https://my.oschina.net/ruoli/blog/2252393

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 作为一个JavaAI助手,我认为Java面试复习应该从以下几个方面开始: 1. Java基础知识:包括Java语言特性、数据类型、流程控制语句、面向对象编程、异常处理、集合框架等。 2. Java虚拟机:包括内存模型、垃圾回收机制、类加载机制等。 3. 多线程:包括线程的创建、同步和互斥、线程池等。 4. Java Web开发:包括Servlet、JSP、Spring、MyBatis、Hibernate等。 5. 数据库:包括SQL语句、数据库设计、MySQL、Oracle等。 6. 网络编程:包括TCP/IP协议、HTTP协议、Socket编程等。 7. 设计模式:包括单例模式、工厂模式、观察者模式等。 8. 框架技术:包括Spring Boot、Spring Cloud、Dubbo、Zookeeper、Kafka等。 以上是我认为Java面试复习的核心点,但具体复习的内容还要根据自己的实际情况和职位要求来定。 ### 回答2: 在准备Java面试时,首先应该从基础知识开始复习。以下是一些建议的复习内容: 1. Java基础知识:复习Java的数据类型、控制结构、面向对象的概念和特性、异常处理、集合类等基础知识。还应该熟悉Java中常用的关键字和操作符。 2. 面向对象编程:复习关于封装、继承和多态的概念以及如何在Java中实现它们。还应该了解设计模式和SOLID原则等面向对象编程的相关概念。 3. Java核心类库:复习Java的核心类库,包括IO流、多线程、网络编程以及常用工具类等。特别要注意Java 8引入的新特性,如Lambda表达式和Stream API。 4. 数据库知识:熟悉SQL语言和关系型数据库的基本概念,了解JDBC的使用和常见的数据库操作。 5. 数据结构和算法:复习常用的数据结构,如数组、链表、栈、队列、树和图等。还应该了解常见的排序和搜索算法,并能够分析它们的时间复杂度。 6. 框架和技术:了解常用的Java框架和技术,如Spring、Hibernate、Java Servlet、JSP和MVC等。还应该了解Web开发中的常见技术,如HTML、CSS、JavaScript和HTTP协议。 7. 掌握项目经验:复习自己的项目经验,了解自己在项目中所承担的角色和责任,并准备有关项目的技术细节和相关问题的回答。 在复习过程中,建议通过做一些模拟面试题和编程练习来巩固所学的知识。同时也要保持对新技术和新特性的学习,如Java 11、Java模块系统和响应式编程等。最重要的是保持对Java编程的实践和理解,通过项目实践和编码实践来提升自己的能力。 ### 回答3: Java面试复习应该从以下几个方面开始: 1. 基本语法和核心概念:复习Java的基本语法规则、关键字、变量数据类型、运算符以及流程控制语句等。同时还需要熟悉面向对象的概念,如类和对象、继承、多态等。 2. 集合框架:复习Java集合框架的常见类,如ArrayList、LinkedList、HashSet、HashMap等,了解它们的特点、常用方法以及适用场景。同时还需了解迭代器和遍历方式等相关知识。 3. 异常处理:复习Java的异常处理机制,包括异常类的继承关系、异常处理的方式和操作等。了解如何捕获和处理异常,并了解常见的异常类型及其解决方法。 4. 多线程:复习Java的多线程编程相关知识,包括线程的基本概念、创建和启动线程的方式、线程同步与互斥、线程池的使用等。同时了解Java中的线程状态和线程调度等内容。 5. IO流和网络编程:复习Java的IO流操作,包括文件的读写、字节流和字符流的区别、以及常见的输入输出流等。还需要了解Java网络编程的基本概念、Socket编程、URL和URLConnection等相关知识。 6. JDBC和数据库:复习Java数据库连接(JDBC)相关知识,包括数据库的基本操作、连接数据库的方式、执行SQL语句以及事务处理等。同时还需了解常见的数据库操作类和框架,如Hibernate和MyBatis等。 除了以上内容,还建议在复习过程中多动手实践,编写一些简单的Java程序或者参与一些项目实践,以提升对知识的理解和运用能力。另外,对于面试经常涉及的常见问题和算法题也应进行重点复习,例如字符串处理、排序算法、数据结构等。最后,了解一些面试技巧和注意事项,如自我介绍、项目经验的准备和回答等,有助于更好地应对面试的挑战。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值