当前位置: 首页 > news >正文

学习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 } }
http://www.cnnetsun.cn/news/117552.html

相关文章:

  • 学习Java27天
  • ThingsBoard物联网平台消息队列实战:3大核心技术架构深度解析
  • Free Sidecar终极指南:5分钟解锁macOS多屏扩展功能
  • Universe性能优化终极指南:cProfile与火焰图实战分析
  • DeeplxFile:免费跨平台文件翻译工具的完整使用指南
  • Qwen3-4B-FP8模型实战手册:从零开始构建智能对话应用
  • IPCA改进主成分分析法 主元分析在处理数据过程中会平等的对待每一维特征,即认为每一维特征的权...
  • Carsim+Simulink联合仿真实现换道超车及弯道道路处理演示
  • 测试代码如何成为团队通用语言:从技术债到沟通桥梁的蜕变之路
  • 低代码、RPA融合、云边协同……盘点五大AI Agent平台为开发者带来的机遇与挑战。
  • 智能体(Agent)全景解析:技术路线、落地实践与产业生态
  • 3步搞定:这款智能LLM微调工具让数据准备如此简单
  • 百度网盘下载加速神器:免费解析工具完整使用指南
  • OpenUSD工具链深度解析:从入门到精通的完整指南
  • 多任务调度终极指南:从并发控制到性能优化的完整解析
  • 高效服务器监控:5步快速定位性能问题的终极指南
  • 基于SpringBoot+Vue的石材厂售卖系统(支付宝沙盒支付、协同过滤算法、物流快递API、websocket实时聊天、Echarts图形化分析)
  • ComfyUI-Manager安全级别配置深度解析与实战指南
  • COLMAP三维重建技术:从多视图图像到精准三维模型的完整指南
  • 基于Android的音乐播放器应用设计与实现6(论文+源码)
  • 如何快速掌握Unity终极REST客户端:异步网络通信完整指南
  • 图像转换成本对决:云端与本地部署的经济效益深度剖析
  • Monaco Editor深度集成指南:从原理到实战的完整解决方案
  • 开源四足机器人Mini Pupper:从入门到精通的完整实战指南
  • AzerothCore-WoTLK容器化部署终极指南:5分钟快速搭建完整MMO服务器
  • XCOM V2.6:嵌入式开发的终极串口调试解决方案
  • 负载均衡集群LVS详解及配置
  • 论文查重合格标准:从AI工具到学术规范的深度解析
  • 论文新手写作工具:9大AI工具推荐+步骤指南排名
  • 使用 pylintrc 配置 Python 代码检查的详细指南