1. Java 中 final 关键字有什么用?
-
在 Java 中,final 关键字用于表示一个不可变的常量或一个不可变的变量。
-
在 Java 中,final 关键字可以修饰类、方法和变量,作用如下:
-
final 修饰类,表示该类不能被继承。final 类中的方法默认都是 final 的,不能被子类重写。
-
final 修饰方法,表示该方法不能被子类重写。
-
final 修饰变量,表示该变量只能被赋值一次。
-
final 修饰的变量必须在声明时或构造函数中初始化,且不能再被修改。常用于定义常量。
另外,使用 final 修饰的变量在编译时就已经确定了其值,因此在运行时访问时比非 final 变量更快。
-
-
使用 final 关键字可以带来一些好处,例如:
-
安全性:将变量声明为 final 可以防止它被改变,从而提高安全性。
-
可读性:将常量声明为 final 可以提高代码的可读性,因为常量的值不会被修改。
-
优化:final 变量在编译时被转换成常量,这可以提高程序的性能。
总之,final 关键字在 Java 中非常有用,可以提高程序的安全性、可读性和性能。
-
-
源码中常见的final
2. HTTP 是哪一层的协议?简述它的作用?
HTTP 是应用层协议,主要用于在 Web 浏览器和 Web 服务器之间传递数据。它是一种无状态的协议,即服务器不会保存关于客户端的任何信息,每次客户端发送请求,服务器都会返回响应。HTTP 协议通常基于 TCP 协议,使用 TCP 的 80 端口作为默认的传输端口。总之,HTTP 协议的作用是规定了 Web 应用程序中客户端和服务器之间的通信方式和数据传输格式,是支持 Web 应用程序开发的基础协议。
HTTP 协议主要作用包括:
-
建立连接:客户端与服务器建立 TCP 连接,然后发送 HTTP 请求,服务器接收请求并处理。
-
发送请求:客户端发送HTTP请求到服务器,包括请求方法(GET、POST、PUT等)、请求头(如User-Agent、Accept等)和请求正文(可选)等信息。
-
处理请求:服务器接收并解析 HTTP 请求,执行请求操作(如查询数据库等),并将处理结果返回给客户端。
-
返回响应:服务器返回HTTP响应,包括响应状态码(如200 OK、404 Not Found等)、响应头(如Content-Type、Cache-Control等)和响应正文(可选)等信息。
HTTP 的状态码指示了服务器对请求的处理结果。常见的状态码包括 200 OK(请求成功)、301 Moved Permanently(永久重定向)、404 Not Found(未找到资源)和 500 Internal Server Error(服务器内部错误)等。
-
关闭连接:客户端接收到响应后,关闭TCP连接。
HTTP 的请求报文主要包括以下几个部分:
-
请求行:包括请求方法、URL 和 HTTP 协议版本。
-
请求头:包括一些请求头部信息,例如 User-Agent、Host 等。
-
空行:表示请求头结束。
-
请求体:实际请求的数据,例如表单提交的数据等。
HTTP 的响应报文主要包括以下几个部分:
-
状态行:包括 HTTP 协议版本、状态码和状态消息。
-
响应头:包括一些响应头部信息,例如 Server、Content-Type、Content-Length 等。
-
空行:表示响应头结束。
-
响应体:实际响应的数据,例如网页的 HTML 代码、图片、音频等。
3. 什么是进程和线程?它们有哪些区别和联系?
在操作系统中,进程是指一个正在执行中的程序,而线程是进程的一部分,是一个程序中执行的代码片段。
进程是操作系统资源分配的最小单位,一个进程至少包括一个线程,进程拥有自己的内存空间、文件句柄、环境变量等系统资源。进程间相互独立,互不干扰,每个进程都拥有自己的地址空间。进程通信需要通过进程间通信机制(IPC)来实现。
线程是程序执行的最小单位,一个进程中可以包含多个线程,它们共享进程的内存空间和系统资源。多个线程可以并发执行,从而提高了程序的运行效率,同时也会带来线程安全等问题。线程之间的通信可以通过共享内存、信号量等机制实现。
进程和线程的区别和联系如下:
-
资源分配:进程拥有自己的内存空间等系统资源,而线程共享进程的资源;
-
独立性:进程之间相互独立,互不干扰,而线程是进程的一部分,线程之间共享进程的资源;
-
调度:进程间调度的开销比线程大,线程的调度开销小,可以并发执行;
-
并发性:多个进程之间相互独立,多个线程可以并发执行;
-
同步:进程间通信需要通过IPC机制,线程间同步可以通过共享内存、信号量等机制实现。
在实际开发中,多线程应用更加常见,因为线程的开销小,执行效率高,适用于需要并发执行的场景。但需要注意线程安全问题。而多进程应用通常更加稳定,但开销较大,适用于需要独立运行的场景。