java八股文

103 阅读11分钟
  1. 通过jdk可以编写java程序

    JDK、JRE、JVM有什么区别

    • JDK: Java Development Kit 针对Java程序员的产品
    • JRE:Java Runtime Environment是运行Java的环境集合
    • JM:Java虚拟机用于运行Java字节码文件,跨平台的核心
  2. 截屏2024-06-14 16.27.41.png

  3. 截屏2024-06-14 16.30.14.png 输出:d1==d2 因为:浮点数在电脑里保存是按 科学计数法,值保存小数点后7位 解决方法:java bigdecimal类 截屏2024-06-14 16.34.12.png

  4. 生成30-100的随机整数

    public Integer randomInt1() {
        int max = 100;
        int min = 30;
        int re = new Random().nextInt(max-min) + min;
        return re;
    }
    public Integer randomInt2() {
        int max = 100;
        int min = 30;
        int re = (int)(Math.random() * (max-min)) + min;
        return re;
    }
    
  5. 列出1-1000的质数

    public static void main(String[] args) {
        for (int i = 2; i <= 1000; i++) {
            boolean flag = true;
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.println(i);
            }
        }
    }
    
  6. 面向对象三大特征:分装、继承、多态

    封装:eg 接口

    封装的好处:

    1. 实现专业的分工
    2. 减少代码耦合
    3. 可以自由修改类的内部结构

    继承:java类不支持多继承,接口支持

截屏2024-06-14 19.32.17.png 截屏2024-06-14 19.33.49.png 7. 静态对象和实例变量的区别 截屏2024-06-14 19.47.23.png

  • 静态变量在程序的整个生命周期内存在,直到程序结束或静态变量被显式销毁。
  • 实例变量和静态变量存放在堆,静态变量存放在堆的永久生成区域中
  1. 执行顺序 代码块
    • 1静态优先
    • 2父类优先
    • 3非静态块 优先于构造函数

截屏2024-06-14 19.59.56.png

  1. java的异常体系

截屏2024-06-14 20.18.36.png 截屏2024-06-14 20.18.56.png

  1. 字符串比较

截屏2024-06-14 20.24.20.png t t f t f 因为s5是运行时才会确定,所以不s4==s5 s6存放在堆, 不在常量池

  1. String Stringbuffer stringbuilder

string存放在常量池

stringbuilder stingbuffer 截屏2024-06-14 20.29.26.png

  1. List与Set

截屏2024-06-14 20.31.57.png 截屏2024-06-14 20.32.47.png 截屏2024-06-14 20.35.34.png

  1. List排序 Collections.sort() 截屏2024-06-14 20.39.21.png

  2. TreeSet排序

  • 自然排序

自然排序要求TreeSet集合中存储的元素所在的类必须实现Comparable接口,并重写comoareTo()方法,然后TreeSet集合就会对该类型使用compareTo()方法进行比较

截屏2024-06-14 20.49.40.png this 在 o 前,为升序排列;

  • 自定义排序 截屏2024-06-14 20.46.53.png
  1. Object类 hashCode()和equals() 的区别 截屏2024-06-14 20.56.34.png

先hashcode比较,在equals比较 截屏2024-06-14 20.56.58.png

  1. Java IO中的几种流

每个表的 第一行 代表顶层父类,下面几个才能使用

InputStreamReader 将输入字节流转换为输入字符流 截屏2024-06-14 20.59.13.png 17. 复制文件到指定文件夹

截屏2024-06-15 09.26.40.png

截屏2024-06-15 09.31.32.png

计算机网络

  1. 为什么分层:

通信是一个大问题,需要分成一个一个小问题 进行解决 分层设计:不同层实现不同功能

  1. 怎么分层

截屏2024-06-15 10.44.40.png

3.分层结构

截屏2024-06-15 10.49.53.png

  1. 概念总结

截屏2024-06-15 11.03.47.png

  1. 计算机网络分层结构
  • OSI 7层(不适合市场)

截屏2024-06-15 11.35.07.png 截屏2024-06-15 11.37.46.png

应用层:用户与网络的界面;

截屏2024-06-15 16.10.02.png 截屏2024-06-15 16.12.19.png 截屏2024-06-15 16.15.55.png 截屏2024-06-15 16.21.42.png 截屏2024-06-15 16.23.55.png 截屏2024-06-15 16.25.54.png 截屏2024-06-15 16.28.05.png

  • TCP/IP 4层 截屏2024-06-15 16.30.27.png

计算机网络(一)

截屏2024-06-16 21.54.57.png 6. TCP、UDP、IP分别属于什么层 截屏2024-06-15 16.44.06.png

各层数据结构: 截屏2024-06-15 16.46.19.png

  1. 网络中传输层的作用和包含的协议 截屏2024-06-15 16.49.12.png 截屏2024-06-15 16.51.27.png 截屏2024-06-15 16.54.41.png

  2. HTTP1.0 1.1 2.0 区别 截屏2024-06-15 17.01.09.png 截屏2024-06-15 17.04.19.png

  3. HTTP头-- keep-alive 截屏2024-06-15 17.06.21.png

HTTP2.0

截屏2024-06-15 17.09.56.png 截屏2024-06-15 17.12.25.png 截屏2024-06-15 17.14.04.png

  1. HTTP报文详解 截屏2024-06-15 19.55.38.png
  • HTTP常用请求方法与使用场景

请求方法:HTTP请求的本质是对服务器资源进行操作的过程(增删改查+系统功能),通过定义不同方法实现不同操作是清晰并且是必要的。

• GET:最常用的方法,常用于请求服务器发送某个资源

• HEAD:和GET类似,但服务器在响应中只返回首部

• DELETE:请求服务器删除请求 URL 所指定的资源 截屏2024-06-15 20.01.59.png 截屏2024-06-15 20.06.15.png

  • 常见状态码 截屏2024-06-15 20.07.23.png

  • 200: OK请求没问题,实体的主体部分包含了所请求的资源

  • 204: No Content的主体部分 响应报文中包含若干首部和一个状态行,但没有实体

  • 304: Not Modified回任何资源 所请求的资源未修改,服务器返回此状态码时,不会返

  • 400:Bad Request客户端请求的语法错误,服务器无法理解

  • 401:Unauthorized 请求客户端在获取对资源的访问权之前,对自己进行认证

  • 403:Forbidden 请求被服务器拒绝了

  • 404: Not Found 用于说明服务器无法找到所请求的 URL

  • 500:Internal Server Error 服务器内部错误,无法完成请求

  • 502:Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 截屏2024-06-15 20.23.27.png 503 服务器宕机;504 网关超时;

  1. 对称加密与非对称加密

截屏2024-06-15 20.31.11.png 密钥:分为对称和非对称

对称加密:密钥a=密钥b 截屏2024-06-15 20.39.19.png

非对称加密:密钥a!=密钥b(公钥加密,私钥解密) 截屏2024-06-15 20.40.12.png 截屏2024-06-15 20.45.28.png

截屏2024-06-15 20.45.56.png

  1. Hash---不能算 加密算法 截屏2024-06-15 20.48.42.png 截屏2024-06-15 20.53.23.png 截屏2024-06-15 20.54.12.png MD5属于Hash算法

  2. TLS技术--HTTPS加密认证的过程

TSL重点是 通过非对称加密算法 生成 对称加密算法的过程 截屏2024-06-15 21.01.17.png 截屏2024-06-15 21.02.35.png

在SSL更新到3.0时,IETF对SSL3.0进行了标准化,并添加了少数机制,标准化后的IETF更名为TLS1.0(Transport Layer Security 安全传输层协议),可以说TLS就是SSL的新版本3.1。也可以将TLS看作SSL的升级版 截屏2024-06-15 21.11.17.png ---------具体实现--------- 截屏2024-06-15 21.12.33.png 双方拥有随机数123,并且随机数3是通过非对称加密传输给服务器的 截屏2024-06-15 21.18.26.png

  1. DNS服务--域名系统的工作流程 截屏2024-06-15 21.21.54.png 截屏2024-06-15 21.23.19.png 域名分级所以 域名服务器也会分级 截屏2024-06-15 21.28.32.png

截屏2024-06-15 21.29.14.png

  1. DNS安全---DNS攻击

现象:截屏2024-06-15 21.32.53.png 攻击手段:

  • DNS劫持:黑客攻击劫持地方运营商的DNS服务器
    • 可以通过配置本地获得DNS服务器地址 避免
  • DNS欺骗:冒充权威服务器
  • DDoS攻击 截屏2024-06-15 21.39.41.png

防范手段: 采用更严格的访问控制;部署零信任方案;检查/验证DNS记录;接入高防服务

计算机网络(二)

截屏2024-06-16 21.52.47.png 16. TCP与UDP协议 截屏2024-06-15 22.02.01.png 截屏2024-06-15 22.03.15.png UDP校验和:判断数据传输过程中是否出错

截屏2024-06-16 09.01.07.png

截屏2024-06-16 09.02.43.png 截屏2024-06-16 09.03.46.png 截屏2024-06-16 09.04.22.png 截屏2024-06-16 09.05.37.png

UDP与TCP协议:头部复杂度不同 截屏2024-06-16 09.08.10.png 截屏2024-06-16 09.09.40.png 截屏2024-06-16 09.14.16.png 17. TCP连接建立

  • TCP为什么需要建立三次握手:因为TCP协议提供的是可靠的有连接服务 截屏2024-06-16 09.25.52.png
  • 三次握手异常情况: 第一次握手报文丢失,当主动方认为第一次握手报文丢失 会再发第二次 截屏2024-06-16 09.29.44.png 截屏2024-06-16 09.30.51.png 所以需要第三次握手的确认,选择忽视丢弃4️⃣
  1. TCP四次挥手 截屏2024-06-16 09.38.22.png 截屏2024-06-16 09.39.43.png 第二次挥手报文和关闭等待阶段的发送的报文,会是之前没有发送完数据的报文;数据发送完 才会发送第三次挥手报文

TIME-WAIT时间设置为2倍MSL的时间 截屏2024-06-16 09.40.26.png 截屏2024-06-16 09.42.36.png

  1. TCP的可靠传输--滑动窗口
  • 先是停止等待协议(单个发送、确认、超时重发) 截屏2024-06-16 09.47.40.png
  • 滑动窗口,累计确认 截屏2024-06-16 09.53.11.png 截屏2024-06-16 09.54.10.png 截屏2024-06-16 09.52.43.png
  • 停止等待协议+累计确认+滑动窗口 达到更好的效果 利用带宽
  1. TCP拥塞避免算法 截屏2024-06-16 10.01.32.png
  • 网络拥塞往往由很多种因素引起,它并不是一个单点问题

  • 拥塞避免是 全局角度的问题

  • 拥塞避免的目的:防止过多数据注入到网络,避免网络中的路由器或链路过载

  • 慢开始与拥塞避免:cwnd的增长趋势-称为慢开始 截屏2024-06-16 10.05.57.png 截屏2024-06-16 10.11.43.png cwnd的增长趋势-称为慢开始(1,2,4,8) 截屏2024-06-16 10.08.34.png cwn到达门限值后,执行拥塞避免算法;新的门限制=发生超时时的cwnd/2

  • 快重传与快恢复 截屏2024-06-16 10.15.17.png 快恢复: 没有慢开始过程,直接拥塞避免的过程

截屏2024-06-16 10.18.17.png 21. TCP粘包原理 截屏2024-06-16 10.23.36.png 截屏2024-06-16 10.26.30.png 22. TCP协议安全性 截屏2024-06-16 10.29.41.png 截屏2024-06-16 10.31.17.png 截屏2024-06-16 10.32.00.png

截屏2024-06-16 10.33.25.png

  • 防范手段还有 防火墙
  1. VPN-虚拟专用网技术 截屏2024-06-16 10.35.38.png
  • VPN使用场景:公司内网、校园网、工业专用网 截屏2024-06-16 10.37.44.png 专用IP地址--即,内网IP地址 截屏2024-06-16 10.41.11.png IPSec、PPTP、L2TP协议 保证隧道传输安全

总结:VPN工作原理(虚拟隧道、专用IP地址、协议,VPN工作在网络层)

操作系统

操作系统(一)

截屏2024-06-16 21.45.04.png

  1. 操作系统的进程 截屏2024-06-16 11.15.22.png 截屏2024-06-16 11.16.52.png 截屏2024-06-16 11.18.08.png

  2. 进程状态模型--同步 异步 阻塞 非阻塞

  • 五状态模型:创建、就绪、终止、阻塞、运行 截屏2024-06-16 11.22.49.png

截屏2024-06-16 11.23.32.png

截屏2024-06-16 11.24.29.png

资源:磁盘 网卡等


截屏2024-06-16 11.26.06.png

截屏2024-06-16 11.26.52.png

截屏2024-06-16 11.27.07.png

进程调度是分配CPU资源

阻塞、非阻塞、同步、异步 截屏2024-06-16 11.31.09.png

阻塞状态:进程有等待,同步; 非阻塞状态:进程一直在运行,异步;

  1. 操作系统线程 截屏2024-06-16 15.31.49.png 进程的线程共享进程资源,线程本身不拥有资源的 截屏2024-06-16 15.33.44.png

多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高; 线程是CPU调度和分配的基本单位

  1. 用户态与内核态

简单来说内核态就是操作系统运行线程,用户态就是线程执行用户自己的程序。

内核态: 也叫内核空间,是内核进程/线程所在的区域。主要负责运行系统、硬件交互。

用户态: 也叫用户空间,是用户进程/线程所在的区域。主要用于执行用户程序。

  • 操作系统资源管理
    • 处理器资源;IO资源;存储器资源;文件资源

在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。如果所有的程序都能使用这些指令,那么你的系统一天死机N回就不足为奇了。 所以,CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。 如此设计的本质意义是进行权限保护。

截屏2024-06-16 19.58.57.png 截屏2024-06-16 19.59.33.png 截屏2024-06-16 20.04.31.png

  1. 程序运行类型分析
  • 计算密集型(可以通过多线程提升资源利用率和减少时间) 截屏2024-06-16 21.21.53.png
  • IO密集型(可以通过提高存储器读写速度 减少时间) 截屏2024-06-16 21.22.49.png

截屏2024-06-16 21.25.00.png

  1. 协程是什么?为什么需要协程 截屏2024-06-16 21.28.32.png 截屏2024-06-16 21.29.18.png 上下文切换:会涉及用户态内核态的转换

协程:微线程、纤程、协作式线程 截屏2024-06-16 21.33.25.png 截屏2024-06-16 21.34.21.png

协程:只运行在用户态,内核无法感知,多个协程对应一个内核态的进程;协程由用户自行调度,内核无法感知。

  • 协程 通过相互让步 实现协作式线程

协程的优缺点

  • 调度、切换、管理更加轻量
  • 内核无法感知协程的存在
  • 可以减少上下文切换的成本,因为协程本身切换在用户态完成的
  • 协程无法发挥CPU的多核优势
  • 协程主要运用在多IO场景(网络IO)

调度管理总结:程序(program)只能有一个进程,一个进程就是一个程序。 有人说,我打开一个程序,比如chrome,有十多个进程呢,这是咋回事。那就是十多个程序,操作系统给他们分配了彼此独立的内存,相互执行不受彼此约束,分配同样时间的CPU。对于用户而言,他们是一个整体,我们通常称之为应用程序(application)。 对于计算机而言,一个进程就是一个程序,多个进程(比如一个浏览器的多个进程)对计算机而言就是多个不同的程序,它不会把它们理解为一个完整的“程序”。

所以正确的结论是:一个程序(program)就是一个正在执行的进程,而每个进程,可以是单线程的,也可以是多线程的。一个应用程序(application)通常由多个程序组成。

操作系统(二)

截屏2024-06-16 21.56.12.png

  1. 缓存的作用——存储器的层次结构
  • 缓存
  • 主存
  • 辅存

局部性原理:是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。 两个层次都运用了局部性原理 截屏2024-06-17 09.09.20.png 截屏2024-06-17 09.10.47.png 截屏2024-06-17 09.11.40.png

系统设计中缓存(如,redis)的作用: 截屏2024-06-17 09.13.23.png

  1. 虚拟内存

背景:截屏2024-06-17 09.21.40.png 概念: 截屏2024-06-17 09.23.20.png

  • 逻辑地址空间---物理地址空间 截屏2024-06-17 09.28.31.png

虚拟内存运行概述: 截屏2024-06-17 09.40.16.png 高速缓存置换时机: 截屏2024-06-17 09.41.17.png 主存页面存置换时机: 截屏2024-06-17 09.41.41.png 总结: 截屏2024-06-17 09.42.05.png 9. 缺页中断——操作系统内存管理

  • 内存管理:页式、段式、段页式 截屏2024-06-17 09.52.24.png 截屏2024-06-17 09.53.29.png 截屏2024-06-17 09.55.26.png

Linux页面大小一般为 4k

多级页表 截屏2024-06-17 09.56.59.png

页式存储缺点:有一段联系的逻辑分布在多个页面中,将大大降低执行效率

截屏2024-06-17 10.00.14.png 截屏2024-06-17 10.01.18.png

截屏2024-06-17 10.01.45.png 截屏2024-06-17 10.02.22.png

缺页中断: 在系统调用时就会进行进程切换 截屏2024-06-17 10.05.41.png

  1. LRU算法——页面置换算法
  • 页面替换的时机:高速缓存替换的时机、主存页面的替换时机
  • 实现页面替换的数据结构是 双向链表 截屏2024-06-17 10.11.28.png

缓存置换算法:先进先出算法FIFO、最近最少使用算法LRU、最不经常使用算法LFU 截屏2024-06-17 10.12.45.png 截屏2024-06-17 10.14.50.png 截屏2024-06-17 10.15.45.png

  1. 软链接与硬链接——Linux ext4文件系统
  • 常见的文件系统:win(FAT、NTFS),linux(ext2/3/4) 截屏2024-06-17 10.21.10.png

FAT文件系统:使用一张表保存盘块的信息 截屏2024-06-17 10.23.23.png

截屏2024-06-17 10.28.10.png 截屏2024-06-17 10.29.00.png 截屏2024-06-17 10.29.24.png

  1. 服务器部署的RAID——磁盘冗余阵列 截屏2024-06-17 10.31.40.png
  • RAID分级方案
  • RAID0、RAID1、RAID5、RAID6、RAID10 截屏2024-06-17 10.35.49.png