news 2026/4/15 19:01:33

学习Java26天

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
学习Java26天

1. String 概述

核心概念

  • Java API:Java 提供的一套预定义类和接口,可以直接使用

  • String 类java.lang.String代表字符串,程序中所有字符串字面值都是该类的对象

  • 重要特性:String 对象是不可变的(immutable),创建后内容不能修改

2. 创建 String 对象的四种方式

方式1:直接赋值(最常用)

java

// 语法:String 变量名 = "字符串内容"; String str1 = "Hello World"; String str2 = "Java"; String emptyStr = ""; // 空字符串 // 特点:会检查字符串池,如果已存在则复用 String s1 = "abc"; String s2 = "abc"; // s1 和 s2 指向同一个对象 System.out.println(s1 == s2); // true,地址相同

方式2:new String() 构造方法

java

// 1. 创建空白字符串 String str1 = new String(); // 等价于 "" System.out.println(str1); // 输出:空字符串 System.out.println(str1.length()); // 输出:0 // 2. 根据已有字符串创建 String original = "Hello"; String str2 = new String(original); // 创建新的String对象,内容为"Hello" // 3. 根据字符数组创建 char[] charArray = {'J', 'a', 'v', 'a'}; String str3 = new String(charArray); // "Java" String str4 = new String(charArray, 0, 2); // 从索引0开始取2个字符:"Ja" // 4. 根据字节数组创建(常用于网络传输、文件读写) byte[] byteArray = {65, 66, 67, 68}; // ASCII: A, B, C, D String str5 = new String(byteArray); // "ABCD" // 指定字符集 try { byte[] bytes = "你好".getBytes("UTF-8"); String str6 = new String(bytes, "UTF-8"); // "你好" } catch (Exception e) { e.printStackTrace(); }

3. String 类的常用方法

长度和空值判断

java

String str = "Hello Java"; // 获取长度 int length = str.length(); // 10 // 判断是否为空 boolean isEmpty = str.isEmpty(); // false boolean isEmpty2 = "".isEmpty(); // true // 判断是否为空白(包含空格、制表符等) boolean isBlank = " ".isBlank(); // true(Java 11+)

字符串比较

java

String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); String s4 = "ABC"; // 使用 == 比较(比较地址) System.out.println(s1 == s2); // true System.out.println(s1 == s3); // false(s3在堆内存中) // 使用 equals() 比较(比较内容) System.out.println(s1.equals(s2)); // true System.out.println(s1.equals(s3)); // true System.out.println(s1.equals(s4)); // false(区分大小写) // 忽略大小写比较 System.out.println(s1.equalsIgnoreCase(s4)); // true // 比较字符串字典顺序 System.out.println("abc".compareTo("abd")); // -1(小于) System.out.println("abc".compareTo("abc")); // 0(等于) System.out.println("abd".compareTo("abc")); // 1(大于)

字符串查找

java

String str = "Hello Java World"; // 查找字符/字符串位置 int index1 = str.indexOf('J'); // 6(第一个J的位置) int index2 = str.indexOf("Java"); // 6 int index3 = str.indexOf('a', 7); // 8(从索引7开始查找) // 从后往前查找 int lastIndex = str.lastIndexOf('o'); // 13 // 是否包含 boolean contains = str.contains("Java"); // true // 是否以指定字符串开始/结束 boolean startsWith = str.startsWith("Hello"); // true boolean endsWith = str.endsWith("World"); // true

字符串截取和替换

java

String str = "Hello Java World"; // 截取子串 String sub1 = str.substring(6); // "Java World"(从索引6到结尾) String sub2 = str.substring(6, 10); // "Java"(从6到9,不包含10) // 替换 String replaced1 = str.replace('o', 'O'); // "HellO Java WOrld" String replaced2 = str.replace("Java", "Python"); // "Hello Python World" // 替换所有(正则表达式) String replaced3 = str.replaceAll("\\s+", "-"); // 将所有空白替换为-

字符串分割和连接

java

// 分割字符串 String str = "apple,banana,orange"; String[] fruits = str.split(","); // ["apple", "banana", "orange"] // 复杂分割(正则表达式) String complex = "apple, banana; orange"; String[] result = complex.split("[,\\s;]+"); // 按逗号、空格、分号分割 // 连接字符串 String joined = String.join("-", "Java", "Python", "C++"); // "Java-Python-C++"

大小写转换和去除空白

java

String str = " Hello Java "; // 大小写转换 String upper = str.toUpperCase(); // " HELLO JAVA " String lower = str.toLowerCase(); // " hello java " // 去除首尾空白 String trimmed = str.trim(); // "Hello Java" // 去除首尾空白(包含Unicode空白符) String stripped = str.strip(); // "Hello Java"(Java 11+)

其他常用方法

java

String str = "Java"; // 获取指定位置的字符 char ch = str.charAt(2); // 'v' // 转换为字符数组 char[] chars = str.toCharArray(); // ['J', 'a', 'v', 'a'] // 转换为字节数组 byte[] bytes = str.getBytes(); // 使用平台默认编码 // 格式化字符串 String formatted = String.format("姓名:%s,年龄:%d", "张三", 25); // 重复字符串 String repeated = "Java ".repeat(3); // "Java Java Java "(Java 11+)

4. String 的不可变性

不可变性的表现

java

String s1 = "Hello"; String s2 = s1; // s1和s2指向同一个对象 s1 = s1 + " World"; // 创建新的String对象 System.out.println(s1); // "Hello World" System.out.println(s2); // "Hello"(s2不受影响)

不可变性的好处

  1. 线程安全:无需同步

  2. 缓存哈希值:提高性能

  3. 字符串池:节省内存

  4. 安全性:防止被修改

5. 字符串常量池

内存机制

java

// 情况1:直接赋值(使用常量池) String s1 = "abc"; // 检查常量池,如果不存在则创建 String s2 = "abc"; // 复用常量池中的对象 System.out.println(s1 == s2); // true // 情况2:new String()(在堆内存创建新对象) String s3 = new String("abc"); String s4 = new String("abc"); System.out.println(s3 == s4); // false System.out.println(s1 == s3); // false // 情况3:intern()方法(手动入池) String s5 = s3.intern(); // 将s3的内容放入常量池 System.out.println(s1 == s5); // true

6. 性能优化建议

避免使用 + 连接大量字符串

java

// 错误做法(创建多个临时对象) String result = ""; for (int i = 0; i < 1000; i++) { result += i; // 每次循环创建新的String对象 } // 正确做法(使用StringBuilder) StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); } String result = sb.toString();

7. 实际应用示例

示例1:用户输入验证

java

import java.util.Scanner; public class StringDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入用户名:"); String username = scanner.nextLine().trim(); // 验证用户名 if (username.isEmpty()) { System.out.println("用户名不能为空!"); } else if (username.length() < 3) { System.out.println("用户名至少3个字符!"); } else if (!username.matches("[a-zA-Z0-9_]+")) { System.out.println("用户名只能包含字母、数字和下划线!"); } else { System.out.println("用户名有效:" + username); } } }

示例2:文件路径处理

java

public class FilePathDemo { public static void main(String[] args) { String filePath = "C:/Users/User/Documents/test.txt"; // 获取文件名 int lastSlash = filePath.lastIndexOf('/'); String fileName = filePath.substring(lastSlash + 1); System.out.println("文件名:" + fileName); // test.txt // 获取文件扩展名 int dotIndex = fileName.lastIndexOf('.'); if (dotIndex > 0) { String extension = fileName.substring(dotIndex + 1); System.out.println("扩展名:" + extension); // txt } // 获取文件路径 String directory = filePath.substring(0, lastSlash); System.out.println("目录:" + directory); // C:/Users/User/Documents } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 13:33:12

Redis篇5——Redis深度剖析:系统的“隐形杀手”——热Key与大Key问题

在之前的文章中&#xff0c;我们聊了持久化如何保数据&#xff0c;分布式锁如何保互斥。今天&#xff0c;我们要聊聊 Redis 生产环境中两个最头疼、最容易引发线上事故的“毒瘤”&#xff1a;热 Key (Hot Key) 和 大 Key (Big Key)。很多时候&#xff0c;Redis 整体运行良好&am…

作者头像 李华
网站建设 2026/4/11 19:44:23

Dubbo监控实战终极指南:从基础架构到企业级部署

你是否正在为分布式系统中的服务监控而头疼&#xff1f;当Dubbo服务调用延迟飙升、错误率攀升时&#xff0c;如何快速定位问题根源&#xff1f;本文将通过完整的实战案例&#xff0c;带你构建企业级的Dubbo监控体系。 【免费下载链接】dubbo Dubbo 是一款高性能、轻量级的分布式…

作者头像 李华
网站建设 2026/4/12 4:30:16

RV1126 NO.56:ROCKX+RV1126人脸识别推流项目之VI模块和VENC模块讲解

一&#xff0e;VI模块介绍&#xff1a;本章节介绍基于RockX和RV1126的人脸识别推流项目中VI模块和VENC模块的初始化设置。该项目需要配置两个VI模块&#xff1a;一个用于RockX人脸检测和识别处理&#xff0c;另一个用于显示AI处理结果。相关实现代码位于rkmedia_module_functio…

作者头像 李华
网站建设 2026/4/13 6:32:14

PyPTO算子框架:解决千亿参数DeepSeek-V3.2-Exp推理性能瓶颈的终极方案

在大模型技术快速迭代的今天&#xff0c;DeepSeek-V3.2-Exp作为千亿参数规模的先进模型&#xff0c;其推理性能的优化已成为工程实践中的核心挑战。PyPTO算子框架的诞生&#xff0c;正是为了解决这一痛点&#xff0c;为复杂大模型的高效部署提供了创新性的解决方案。 【免费下载…

作者头像 李华
网站建设 2026/4/15 19:01:18

当 Gemini 3 + Nano Banana Pro 抹平了人类最后一丝优越感

在人类文明长达五千年的认知里&#xff0c;“天赋”是这世界上最坚固的屏障。即便一个普通人再努力&#xff0c;他也难以触及贝多芬对旋律的直觉&#xff0c;或者梵高对色彩的狂热。这种由基因、环境与灵光共同构建的随机性&#xff0c;让艺术创作一直带有一种近乎宗教式的“神…

作者头像 李华
网站建设 2026/4/10 8:15:23

【2025新版】AE动效网页化全攻略:5种高效方案深度解析

【2025新版】AE动效网页化全攻略&#xff1a;5种高效方案深度解析 【免费下载链接】lottie-web 项目地址: https://gitcode.com/gh_mirrors/lot/lottie-web 设计师精心制作的After Effects动画&#xff0c;在交付开发时常常面临"还原度低、性能差、兼容性差"…

作者头像 李华