好未来面经(详细)
http://
开头;HTTPS 的默认端⼝号是 443,URL 以https://
开头。HTTP 的报文结构可以分为两类:请求报文和响应报文。两者在结构上相似,都包含了起始行、头部和消息正文。
三分恶面渣逆袭:HTTP 报文
GET /index.html HTTP/1.1
Host: www.javabetter.cn
Accept: text/html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
①、请求行
包括方法(如 GET、POST)、请求的 URL 和 HTTP 协议的版本。例如:GET /index.html HTTP/1.1
。
②、请求头部
包含请求的附加信息,如客户端想要接收的内容类型、浏览器类型等。
请求头部由键值对组成,键和值之间用冒号分隔,每一行一个键值对。例如:
Host: www.javabetter.cn
,表示请求的主机名(域名)Accept: text/html
,表示客户端可以接收的媒体类型User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
,表示客户端的浏览器类型③、空行
请求头部和消息正文之间有一个空行,表示请求头部结束。
④、消息正文(可选)
请求的具体内容,如 POST 请求中的表单数据;GET 请求中没有消息正文。
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
<html>
<body>沉默王二很天真</body>
</html>
①、状态行
包括 HTTP 协议的版本、状态码(如 200、404)和状态消息(如 OK、NotFound)。例如:HTTP/1.0 200 OK
。
②、响应头部
包含响应的附加信息,如服务器类型、内容类型、内容长度等。也是键值对,例如:
Content-Type: text/plain
,表示响应的内容类型Content-Length: 137582
,表示响应的内容长度Expires: Thu, 05 Dec 1997 16:00:00 GMT
,表示资源的过期时间Last-Modified: Wed, 5 August 1996 15:55:28 GMT
,表示资源的最后修改时间Server: Apache 0.84
,表示服务器类型③、空行
表示响应头部结束。
④、消息正文(可选)
响应的具体内容,如 HTML 页面。不是所有的响应都有消息正文,如 204 No Content 状态码的响应。
MySQL 支持很多内置函数,包括执行计算、格式转换、日期处理等。我说一些自己常用的(挑一些自己熟悉的)。
CONCAT()
: 连接两个或多个字符串。LENGTH()
: 返回字符串的长度。SUBSTRING()
: 从字符串中提取子字符串。REPLACE()
: 替换字符串中的某部分。LOWER()
和 UPPER()
: 分别将字符串转换为小写或大写。TRIM()
: 去除字符串两侧的空格或其他指定字符。-- 连接字符串
SELECT CONCAT('沉默', ' ', '王二') AS concatenated_string;
-- 获取字符串长度
SELECT LENGTH('沉默 王二') AS string_length;
-- 提取子字符串
SELECT SUBSTRING('沉默 王二', 1, 5) AS substring;
-- 替换字符串内容
SELECT REPLACE('沉默 王二', '王二', 'MySQL') AS replaced_string;
-- 字符串转小写
SELECT LOWER('HELLO WORLD') AS lower_case;
-- 字符串转大写
SELECT UPPER('hello world') AS upper_case;
-- 去除字符串两侧的空格
SELECT TRIM(' 沉默 王二 ') AS trimmed_string;
ABS()
: 返回一个数的绝对值。CEILING()
: 返回大于或等于给定数值的最小整数。FLOOR()
: 返回小于或等于给定数值的最大整数。ROUND()
: 四舍五入到指定的小数位数。MOD()
: 返回除法操作的余数。-- 返回绝对值
SELECT ABS(-123) AS absolute_value;
-- 向上取整
SELECT CEILING(123.45) AS ceiling_value;
-- 向下取整
SELECT FLOOR(123.45) AS floor_value;
-- 四舍五入
SELECT ROUND(123.4567, 2) AS rounded_value;
-- 余数
SELECT MOD(10, 3) AS modulus;
NOW()
: 返回当前的日期和时间。CURDATE()
: 返回当前的日期。CURTIME()
: 返回当前的时间。DATE_ADD()
和 DATE_SUB()
: 在日期上加上或减去指定的时间间隔。DATEDIFF()
: 返回两个日期之间的天数。DAY()
, MONTH()
, YEAR()
: 分别返回日期的日、月、年部分。-- 返回当前日期和时间
SELECT NOW() AS current_date_time;
-- 返回当前日期
SELECT CURDATE() AS current_date;
-- 返回当前时间
SELECT CURTIME() AS current_time;
-- 在日期上添加天数
SELECT DATE_ADD(CURDATE(), INTERVAL 10 DAY) AS date_in_future;
-- 计算两个日期之间的天数
SELECT DATEDIFF('2024-12-31', '2024-01-01') AS days_difference;
-- 返回日期的年份
SELECT YEAR(CURDATE()) AS current_year;
SUM()
: 计算数值列的总和。AVG()
: 计算数值列的平均值。COUNT()
: 计算某列的行数。MAX()
和 MIN()
: 分别返回列中的最大值和最小值。GROUP_CONCAT()
: 将多个行值连接为一个字符串。-- 创建一个表并插入数据进行聚合查询
CREATE TABLE sales (
product_id INT,
sales_amount DECIMAL(10, 2)
);
INSERT INTO sales (product_id, sales_amount) VALUES (1, 100.00);
INSERT INTO sales (product_id, sales_amount) VALUES (1, 150.00);
INSERT INTO sales (product_id, sales_amount) VALUES (2, 200.00);
-- 计算总和
SELECT SUM(sales_amount) AS total_sales FROM sales;
-- 计算平均值
SELECT AVG(sales_amount) AS average_sales FROM sales;
-- 计算总行数
SELECT COUNT(*) AS total_entries FROM sales;
-- 最大值和最小值
SELECT MAX(sales_amount) AS max_sale, MIN(sales_amount) AS min_sale FROM sales;
IF()
: 如果条件为真,则返回一个值;否则返回另一个值。CASE
: 根据一系列条件返回值。COALESCE()
: 返回参数列表中的第一个非 NULL 值。-- IF函数
SELECT IF(1 > 0, 'True', 'False') AS simple_if;
-- CASE表达式
SELECT CASE WHEN 1 > 0 THEN 'True' ELSE 'False' END AS case_expression;
-- COALESCE函数
SELECT COALESCE(NULL, NULL, 'First Non-Null Value', 'Second Non-Null Value') AS first_non_null;
FORMAT()
: 格式化数字为格式化的字符串,通常用于货币显示。-- 格式化数字
SELECT FORMAT(1234567.8945, 2) AS formatted_number;
CAST()
: 将一个值转换为指定的数据类型。CONVERT()
: 类似于CAST()
,用于类型转换。-- CAST函数
SELECT CAST('2024-01-01' AS DATE) AS casted_date;
-- CONVERT函数
SELECT CONVERT('123', SIGNED INTEGER) AS converted_number;
进程说简单点就是我们在电脑上启动的一个个应用,比如我们启动一个浏览器,就会启动了一个浏览器进程。进程是操作系统资源分配的最小单位,它包括了程序、数据和进程控制块等。
线程说简单点就是我们在 Java 程序中启动的一个 main 线程,一个进程至少会有一个线程。当然了,我们也可以启动多个线程,比如说一个线程进行 IO 读写,一个线程进行加减乘除计算,这样就可以充分发挥多核 CPU 的优势,因为 IO 读写相对 CPU 计算来说慢得多。线程是 CPU 分配资源的基本单位。
三分恶面渣逆袭:进程与线程关系
一个进程中可以有多个线程,多个线程共用进程的堆和方法区(Java 虚拟机规范中的一个定义,JDK 8 以后的实现为元空间)资源,但是每个线程都会有自己的程序计数器和栈。
大一上先学习的 C语言,大一下半学期开始学习 Java,中间还学过一些 Python 和 JavaScript,但整体的感受上来说还是最喜欢 Java。
因为它可以做的事情太多了,既可以用它来爬一些数据做测试,还可以用它来写 Web 后端服务,就连一些轮子也可以用它来造,比如说我之前写过一个 MYDB 的轮子,就是用的 Java。
在 Java 中,==
操作符和 equals()
方法用于比较两个对象:
①、==:用于比较两个对象的引用,即它们是否指向同一个对象实例。
如果两个变量引用同一个对象实例,==
返回 true
,否则返回 false
。
对于基本数据类型(如 int
, double
, char
等),==
比较的是值是否相等。
②、equals() 方法:用于比较两个对象的内容是否相等。默认情况下,equals()
方法的行为与 ==
相同,即比较对象引用,如在超类 Object 中:
public boolean equals(Object obj) {
return (this == obj);
}
然而,equals()
方法通常被各种类重写。例如,String
类重写了 equals()
方法,以便它可以比较两个字符串的字符内容是否完全一样。
二哥的 Java 进阶之路,String的equals()源码
举个例子:
String a = new String("沉默王二");
String b = new String("沉默王二");
// 使用 == 比较
System.out.println(a == b); // 输出 false,因为 a 和 b 引用不同的对象
// 使用 equals() 比较
System.out.println(a.equals(b)); // 输出 true,因为 a 和 b 的内容相同
不是,String
是一个类,属于引用数据类型。Java 的基本数据类型包括八种:四种整型(byte
、short
、int
、long
)、两种浮点型(float
、double
)、一种字符型(char
)和一种布尔型(boolean
)。
我自己常用的有:
length()
- 返回字符串的长度。charAt(int index)
- 返回指定位置的字符。substring(int beginIndex, int endIndex)
- 返回字符串的一个子串,从 beginIndex
到 endIndex-1
。contains(CharSequence s)
- 检查字符串是否包含指定的字符序列。equals(Object anotherObject)
- 比较两个字符串的内容是否相等。indexOf(int ch)
和 indexOf(String str)
- 返回指定字符或字符串首次出现的位置。replace(char oldChar, char newChar)
和 replace(CharSequence target, CharSequence replacement)
- 替换字符串中的字符或字符序列。trim()
- 去除字符串两端的空白字符。split(String regex)
- 根据给定正则表达式的匹配拆分此字符串。