string用法:Java String,掌握编程中的万能工具 核心用法详解
在Java编程语言中,String 是最基础、最常用且最重要的类之一,它代表不可变的字符序列,是存储和处理文本数据的核心工具,无论是简单的变量赋值、复杂的字符串拼接,还是文件路径、网络地址、数据库查询等,String 都无处不在,熟练掌握 String 的各种用法,对于编写清晰、高效、健壮的Java代码至关重要,本文将深入探讨 String 类的核心特性、常用方法及其在实际编程中的应用。
String 类的核心特性
- 不可变性: 这是
String类最核心的特性之一,一旦一个String对象被创建,它的值就不能被改变,任何看似修改String的操作(如拼接、替换等)实际上都会创建一个新的String对象,而原始对象保持不变,不可变性带来了线程安全性,因为多个线程可以共享同一个String对象而无需担心修改冲突。 - final 关键字:
String类在 Java 语言中被声明为final,这意味着它不能被任何其他类继承,保证了其核心行为和方法的稳定性和安全性。 - 字符串字面量: 在 Java 源代码中,用双引号引起来的文本(如
"Hello World")被称为字符串字面量,它们在编译时就被创建,并被存储在方法区的一个称为字符串常量池的特殊区域中,当代码中多次使用相同的字符串字面量时,JVM 会尝试重用已存在的String对象以节省内存。
String 的创建与初始化
创建 String 对象主要有以下几种方式:
- 字符串字面量: 最常见的方式,JVM 会自动在字符串常量池中查找或创建该对象。
String str1 = "Hello";
new关键字: 使用new关键字会总是在堆内存中创建一个新的String对象,即使内容与已存在的字符串字面量相同(除非使用字符串驻留机制,但通常不会)。String str2 = new String("Hello");这种方式会创建两个对象:一个在字符串常量池(字面量),一个在堆(由
new创建),可以通过System.identityHashCode()来观察对象地址。
- 构造器:
String类提供了多个构造器,可以接受字符数组、字节数组、另一个String对象等来创建新的String实例。String str3 = new String(char[] array); String str4 = new String(byte[] bytes); String str5 = new String(String original);
String 的常用方法
String 类提供了丰富的方法来操作和处理字符串,以下是一些最常用的:
-
长度相关:
int length(): 返回字符串的长度。String str = "Java"; int len = str.length(); // len = 4
-
索引访问:

char charAt(int index): 返回指定索引处的字符。boolean isEmpty(): 判断字符串是否为空。int indexOf(String str): 返回子串首次出现的索引,找不到则返回 -1。int lastIndexOf(String str): 返回子串最后一次出现的索引。char c = str.charAt(0); // 'J' boolean empty = str.isEmpty(); // false int index = str.indexOf("va"); // 2
-
提取子串:
String substring(int beginIndex): 返回从指定索引开始到末尾的子串。String substring(int beginIndex, int endIndex): 返回从指定起始索引到指定结束索引(不包含)的子串。String sub = str.substring(1); // "ava" String sub2 = str.substring(1, 3); // "av"
-
连接(拼接):
String concat(String str): 将指定字符串连接到当前字符串的末尾,返回新的字符串。String join(CharSequence delimiter, CharSequence... elements): 将字符序列元素用指定的分隔符连接成一个字符串(String类的静态方法)。- 运算符:在 Java 中, 是字符串连接符,可以连接字符串字面量、变量、表达式结果等,这是最常用的字符串拼接方式,但在循环中大量使用时需注意性能。
String greeting = "Hello".concat(" World"); String joined = String.join(",", "Java", "is", "cool"); String path = "user" + "/" + "home"; // "user/home"
-
比较:
boolean equals(Object anObject): 比较此字符串与另一个对象是否相等,区分大小写。boolean equalsIgnoreCase(String anotherString): 比较此字符串与另一个字符串是否相等,忽略大小写。int compareTo(String anotherString): 按字典序比较两个字符串,返回负数、零或正数。boolean startsWith(String prefix): 判断此字符串是否以指定前缀开始。boolean endsWith(String suffix): 判断此字符串是否以指定后缀结束。boolean equal = "abc".equals("ABC"); // false boolean ignoreCase = "abc".equalsIgnoreCase("ABC"); // true int cmp = "apple".compareTo("banana"); // 负数 boolean starts = "apple".startsWith("app"); // true boolean ends = "apple".endsWith("le"); // true
-
转换:

String toLowerCase(): 将字符串全部转换为小写。String toUpperCase(): 将字符串全部转换为大写。char[] toCharArray(): 将字符串转换为字符数组。byte[] getBytes(): 将字符串转换为平台默认字符集的字节数组。static String valueOf(...): 将各种类型(如int,char,Object等)转换为字符串。String lower = "HELLO".toLowerCase(); // "hello" char[] chars = "hello".toCharArray(); // ['h','e','l','l','o'] String bytesStr = "hello".getBytes().toString(); // "[B@<hashcode>" String numStr = String.valueOf(123); // "123"
-
搜索与替换:
int lastIndexOf(int ch): 返回指定字符最后一次出现的索引。boolean contains(CharSequence s): 判断此字符串是否包含指定的字符序列。String replace(CharSequence target, CharSequence replacement): 使用给定的字符串替换此字符串所有字符序列。String replaceFirst(String regex, String replacement): 使用给定的字符串替换此字符串匹配给定正则表达式的第一个子字符串。String[] split(String regex): 根据给定的正则表达式将此字符串拆分为字符串数组。String[] split(String regex, int limit): 拆分字符串,limit 参数控制数组的大小。String text = "Hello World, welcome!"; int lastIndex = text.lastIndexOf('o'); // 17 boolean containsHello = text.contains("Hello"); // true String replaced = text.replace("World", "Java"); // "Hello Java, welcome!" String[] words = text.split(" ", 3); // ["Hello", "World,", "welcome!"]
-
格式化:
static String format(String format, Object... args): 使用指定格式字符串和参数返回格式化字符串。String formatted = String.format("Pi value is %.2f", 3.1415926); // "Pi value is 3.14"
String 与 StringBuffer / StringBuilder
在 Java 1.0 时代,StringBuffer 是处理字符串的首选,因为它也是线程安全的,从 Java 5 开始,StringBuilder 被引入,它提供了与 StringBuffer 类似的功能,但不保证线程安全,性能通常更高。
String: 不可变,方法返回新对象。StringBuffer: 可变,线程安全,适用于多线程环境。StringBuilder: 可变,不线程安全,性能优于StringBuffer,适用于单线程环境或需要手动同步的场景。
在现代 Java 开发中,由于 String 的不可变性和 StringBuilder 的高性能,我们通常优先使用 String 进行简单操作,而对于需要大量修改字符串的场景,应使用 StringBuilder。
使用 String 的注意事项与最佳实践
- 避免过度使用 连接: 在循环中进行大量字符串拼接时,使用 会导致每次迭代都创建大量中间字符串,效率低下,应改用
StringBuilder或StringBuffer。// 高效方式 StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); sb.append(" "); } String result = sb.toString(); - 利用字符串常量池: 对于字符串字面量和少量重复使用的字符串,JVM 会自动进行字符串驻留,有助于节省内存,直接使用字符串字面量或
String.valueOf()是推荐的方式。 - 注意
equals和 的区别: 比较的是对象引用(地址),而equals比较的是对象内容(字符序列),比较字符串内容时务必使用equals或equalsIgnoreCase。 - 考虑使用
String.join(): 对于连接多个字符串,String.join()是一个清晰且高效的选择。 - 理解字符串不可变性: 理解
String的不可变性对于理解代码行为,特别是涉及共享引用和并发时,非常重要。
String 类是 Java 编程的基石,其核心在于不可变性和丰富的 API,本文详细介绍了 String 的创建、常用方法以及与其他字符串类的区别和使用场景,掌握这些知识,能够帮助开发者更有效地处理文本数据,编写出更健壮、高效的 Java 程序,从简单的文本显示到复杂的数据处理,熟练运用 String 是每一位 Java 程序员必备的技能。
相关文章:
文章已关闭评论!