一 ·string 和stringbuffer还有stringbuilder的区别
1. String
- 不可变性:
String
对象是不可变的。一旦创建了一个String
对象,它的值就不能改变。如果对String
进行任何修改,实际上会创建一个新的String
对象。 - 线程安全:由于其不可变性,
String
对象是线程安全的,不需要额外的同步。 - 性能:由于每次修改字符串都会创建一个新的对象,因此在频繁修改字符串的场景中,
String
的性能较差。
String str = "Hello"; str = str + " World"; // 创建了一个新的字符串对象
2. StringBuffer
- 可变性:
StringBuffer
是可变的,可以在原对象的基础上进行修改。 - 线程安全:
StringBuffer
是线程安全的,所有的方法都是同步的(即它们是Synchronized
的)。这意味着在多线程环境下使用StringBuffer
是安全的。 - 性能:由于线程安全带来的同步开销,
StringBuffer
在单线程环境下性能不如StringBuilder
。
StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); // 修改了原来的对象
3. StringBuilder
- 可变性:
StringBuilder
也是可变的,可以在原对象的基础上进行修改。 - 线程安全:
StringBuilder
不是线程安全的,也就是说,它的操作不是同步的。 - 性能:由于没有同步开销,
StringBuilder
在单线程环境下比StringBuffer
性能更好。
StringBuilder sb = new StringBuilder("Hello"); sb.append(" World");
4.选择使用的建议
- 使用
String
:当字符串不会发生变化时,或者在多线程环境下使用不可变对象来避免同步开销时。 - 使用
StringBuffer
:在需要字符串可变且在多线程环境下操作时。 - 使用
StringBuilder
:在需要字符串可变且在单线程环境下操作时。
5.深入认识一下这三个字符处理函数
基本用法大致相同
public class StringBufferExample {
public static void main(String[] args) {
// 创建一个StringBuffer对象
StringBuffer sb = new StringBuffer("Hello");
// 添加字符串
sb.append(" World");
// 插入字符串
sb.insert(6, "Beautiful ");
// 替换字符串
sb.replace(6, 16, "Amazing");
// 删除字符串
sb.delete(6, 13);
// 反转字符串
sb.reverse();
// 将StringBuffer转换为String
String result = sb.toString();
// 输出结果
System.out.println(result); // 输出: dlroW olleH
}
}
6.练习
题目1:字符串拼接
问题:请编写一个方法,使用
StringBuilder
来拼接一个字符串数组中的所有元素,并返回拼接后的字符串。public class StringBuilderTest { public static String joinStrings(String[] strings) { // 在这里实现 } public static void main(String[] args) { String[] words = {"Hello", "World", "Java", "StringBuilder"}; System.out.println(joinStrings(words)); // 输出应为 "HelloWorldJavaStringBuilder" } }
题目2:反转字符串
问题:请编写一个方法,使用
StringBuffer
来反转一个给定的字符串,并返回反转后的字符串。public class StringBufferTest { public static String reverseString(String str) { // 在这里实现 } public static void main(String[] args) { String word = "HelloWorld"; System.out.println(reverseString(word)); // 输出应为 "dlroWolleH" } }
题目3:线程安全的计数器
问题:请编写一个线程安全的计数器类
SafeCounter
,使用StringBuffer
来记录每次计数时的日志。然后创建多个线程来同时增加计数器的值,并记录每次增加的操作。public class SafeCounter { private int count; private StringBuffer logBuffer; public SafeCounter() { count = 0; logBuffer = new StringBuffer(); } public synchronized void increment() { // 在这里实现 } public synchronized String getLog() { // 在这里实现 } public static void main(String[] args) { SafeCounter counter = new SafeCounter(); // 创建并启动多个线程来增加计数器的值 for (int i = 0; i < 5; i++) { new Thread(() -> { counter.increment(); }).start(); } // 等待一段时间以确保所有线程完成 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 输出日志内容 System.out.println(counter.getLog()); } }
题目4:字符串插入
问题:请编写一个方法,使用
StringBuilder
在给定的字符串指定位置插入一个子字符串,并返回修改后的字符串。public class StringInsertTest { public static String insertString(String original, String toInsert, int position) { // 在这里实现 } public static void main(String[] args) { String original = "HelloWorld"; String toInsert = "Beautiful"; int position = 5; System.out.println(insertString(original, toInsert, position)); // 输出应为 "HelloBeautifulWorld" } }
总结:增强的for
循环是一种简化数组和集合遍历的方式。它比传统的for
循环更简洁,避免了手动管理索引或迭代器语法
for (元素类型 元素变量 : 数组或集合) { // 对元素变量的操作 } 元素类型:数组或集合中元素的类型。 元素变量:在每次迭代中代表当前元素的变量。 数组或集合:要遍历的数组或实现了Iterable接口的集合
实例1:
public class ForEachExample { public static void main(String[] args) { String[] fruits = {"Apple", "Banana", "Cherry"}; // 使用for-each循环遍历数组 for (String fruit : fruits) { System.out.println(fruit); } } }
了解了多线程基本的启动和使用
for (int i = 0; i < 5; i++) { new Thread(() -> { for (int j = 0; j < 10; j++) { counter.increment(); } }).start(); } 1. 创建线程 new Thread(() -> { ... }).start();: new Thread(...) 创建了一个新的线程。Thread构造函数中传入了一个 Runnable 对象,该对象的 run 方法包含了线程执行的任务。 在这里,我们使用了一个 lambda 表达式 () -> { ... } 来定义线程的任务。它是一个简化的 Runnable 实现方式。 2. 线程的任务 for (int j = 0; j < 10; j++) { counter.increment(); }: 这个 for 循环在每个线程中执行 10 次 counter.increment() 方法。即每个线程会增加计数器的值 10 次,并记录每次增加的日志。 3. 启动线程 .start(): 调用 start 方法来启动线程,使其执行 run 方法中的任务。每个线程将并发执行 counter.increment() 操作。
try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } 1. 等待 Thread.sleep(2000): 使主线程(即执行 main 方法的线程)暂停 2000 毫秒(2秒)。这个等待时间是为了确保所有创建的线程有足够的时间完成它们的任务。 2. 异常处理 catch (InterruptedException e): 捕获 sleep 方法可能抛出的 InterruptedException 异常。这个异常表示当前线程在休眠期间被中断。
二·http和https
1.概念
HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件、图片文件、查询结果等),通常使用端口 80。
HTTPS(超文本传输安全协议,Hypertext Transfer Protocol Secure)是 HTTP 的安全版本,HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包,HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。
2.工作原理
- 客户端发起请求:用户通过客户端(如浏览器)输入 URL,客户端向服务器发起一个 HTTP 请求。
- 服务器处理请求:服务器接收到请求后,根据请求的类型(如GET、POST等)和请求的资源,进行相应的处理。
- 服务器返回响应:服务器将处理结果包装成HTTP响应消息,发送回客户端。
- 客户端渲染页面:客户端接收到响应后,根据响应内容(如HTML、图片等)渲染页面,展示给用户。
Web 服务器有:Nginx 服务器,Apache 服务器,IIS 服务器(Internet Information Services)等。
HTTP 默认端口号为 80,但是你也可以改为 8080 或者其他端口。
HTTP 三点注意事项:
-
HTTP 是无连接:无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。
-
HTTP 是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送,客户端以及服务器指定使用适合的 MIME-type 内容类型。
-
HTTP 是无状态:HTTP 协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时它的应答就较快。
HTTPS 作用
HTTPS 的主要作用是在不安全的网络上创建一个安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。
HTTPS 的信任基于预先安装在操作系统中的证书颁发机构(CA)。
因此,与一个网站之间的 HTTPS 连线仅在这些情况下可被信任:
- 浏览器正确地实现了 HTTPS 且操作系统中安装了正确且受信任的证书颁发机构;
- 证书颁发机构仅信任合法的网站;
-
Google Chrome、Internet Explorer 和 Firefox 等浏览器在网站含有由加密和未加密内容组成的混合内容时,会发出警告。
- 被访问的网站提供了一个有效的证书,也就是说它是一个由操作系统信任的证书颁发机构签发的(大部分浏览器会对无效的证书发出警告);
- 该证书正确地验证了被访问的网站(例如,访问 https://www.runoob.com 时收到了签发给 www.runoob.com 而不是其它域名的证书);
- 此协议的加密层(SSL/TLS)能够有效地提供认证和高强度的加密。
-
HTTP 与 HTTPS 区别
虽然 HTTP 和 HTTPS 在名称上非常相似,但它们在安全性上有本质的区别:HTTPS通过使用SSL/TLS协议,为数据传输提供了加密和完整性校验,从而保护了用户的隐私和数据安全。随着网络安全意识的提高,越来越多的网站开始使用HTTPS来保护用户数据
因此,对于涉及敏感信息传输的网站,建议使用 HTTPS 来提高安全性。
主要区别如下:
-
加密:
- HTTP:数据传输过程中不加密,容易被截获和篡改。
- HTTPS:使用SSL/TLS协议对传输的数据进行加密,保护数据传输过程中的安全性。
-
端口:
- HTTP:默认使用端口80。
- HTTPS:默认使用端口443。
-
安全性:
- HTTP:不提供数据加密,安全性较低。
- HTTPS:提供数据加密和完整性校验,安全性较高。
-
证书:
- HTTP:不需要证书。
- HTTPS:需要SSL证书来启用加密,并验证服务器的身份。
-
性能:
- HTTP:由于不加密数据,性能略高于HTTPS。
- HTTPS:由于需要进行加密和解密,可能会有一定的性能开销。
-
搜索引擎优化(SEO):
- HTTP:搜索引擎可能会对没有使用HTTPS的网站进行降权。
- HTTPS:搜索引擎倾向于优先索引和展示使用HTTPS的网站。
-
浏览器显示:
- HTTP:在大多数现代浏览器中,HTTP网站通常显示为"不安全"。
- HTTPS:浏览器会显示一个锁形图标,表示网站是安全的。
-
成本:
- HTTP:通常免费。
- HTTPS:需要购买SSL证书,可能会有一定的成本。
-
应用场景:
- HTTP:适用于不需要传输敏感信息的网站,如新闻网站、博客等。
- HTTPS:适用于需要传输敏感信息的网站,如网上银行、在线购物、电子邮件等。
- 客户端请求消息
-
请求行(Request Line):
- 方法:如 GET、POST、PUT、DELETE等,指定要执行的操作。
- 请求 URI(统一资源标识符):请求的资源路径,通常包括主机名、端口号(如果非默认)、路径和查询字符串。
- HTTP 版本:如 HTTP/1.1 或 HTTP/2。
请求行的格式示例:
GET /index.html HTTP/1.1
-
请求头(Request Headers):
- 包含了客户端环境信息、请求体的大小(如果有)、客户端支持的压缩类型等。
- 常见的请求头包括
Host
、User-Agent
、Accept
、Accept-Encoding
、Content-Length
等。
-
空行:
-
请求头和请求体之间的分隔符,表示请求头的结束。
请求体(可选): -
-
响应
在某些类型的HTTP请求(如 POST 和 PUT)中,请求体包含要发送给服务器的数据。 -
状态行(Status Line):
- HTTP 版本:与请求消息中的版本相匹配。
- 状态码:三位数,表示请求的处理结果,如 200 表示成功,404 表示未找到资源。
- 状态信息:状态码的简短描述。
状态行的格式示例:
HTTP/1.1 200 OK
-
响应头(Response Headers):
- 包含了服务器环境信息、响应体的大小、服务器支持的压缩类型等。
- 常见的响应头包括
Content-Type
、Content-Length
、Server
、Set-Cookie
等。
-
空行:
- 响应头和响应体之间的分隔符,表示响应头的结束。
-
响应体(可选):
- 包含服务器返回的数据,如请求的网页内容、图片、JSON数据等
-
-
具体实例
HTTP/1.1 200 OK //版本1.1 响应成功 状态码200 Content-Type: text/html; charset=UTF-8 体的媒体类型(text/html)和字符集(UTF-8)。 Content-Length: 138 指定响应体的字节长度,帮助客户端确定响应体的大小。 Connection: keep-alive 保持响应 Date: Thu, 25 Jul 2024 12:00:00 GMT 时间 Server: Apache/2.4.41 (Ubuntu) 服务器信息 空行隔开 <!DOCTYPE html> <html> <head> <title>Example Page</title> </head> <body> <h1>Hello, World!</h1> <p>This is an example response.</p> </body> </html>响应体
请求方法
状态码
- 1xx(信息性状态码):表示接收的请求正在处理。
- 2xx(成功状态码):表示请求正常处理完毕。
- 3xx(重定向状态码):需要后续操作才能完成这一请求。
- 4xx(客户端错误状态码):表示请求包含语法错误或无法完成。
- 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。
三·java链接数据库mysql
首先下载一个jar包然后创建数据库写入数据之后在Java文件夹下面导入即可;随后一串显示代码如下
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class MySQLExample {
public static void main(String[] args) {
String jdbcUrl = "jdbc:mysql://localhost:3306/test1// 文件名";
String username = "root";
String password = "root";
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 加载JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 建立连接
connection = DriverManager.getConnection(jdbcUrl, username, password);
// 创建语句
statement = connection.createStatement();
// 执行查询
String query = "SELECT * FROM EMP";
resultSet = statement.executeQuery(query);
// 处理结果
while (resultSet.next()) {
String name = resultSet.getString("Name");
String sex = resultSet.getString("Sex");
int age = resultSet.getInt("Age");
System.out.println("Name: " + name + ", Sex: " + sex + ", Age: " + age);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
四·tcpip协议
概念:TCP协议是一个面向连接的、可靠的传输协议,它提供一种可靠的字节流,能保证数据完整、无损并且按顺序到达。TCP尽量连续不断地测试网络的负载并且控制发送数据的速度以避免网络过载。另外,TCP试图将数据按照规定的顺序发送
补充:UDP协议是一个无连接的数据报协议,是一个“尽力传递”和“不可靠”协议,不会对数据包是否已经到达目的地进行检查,并且不保证数据包按顺序到达
目录
一 ·string 和stringbuffer还有stringbuilder的区别
总结:增强的for循环是一种简化数组和集合遍历的方式。它比传统的for循环更简洁,避免了手动管理索引或迭代器