【Java高级语法】(五)字符串操作类String:几乎每天都会用到的String类,你还在踩坑吗?~

您所在的位置:网站首页 5类6类7类网线对比 【Java高级语法】(五)字符串操作类String:几乎每天都会用到的String类,你还在踩坑吗?~

【Java高级语法】(五)字符串操作类String:几乎每天都会用到的String类,你还在踩坑吗?~

2023-06-20 02:31| 来源: 网络整理| 查看: 265

Java高级语法详解之字符串操作类String :one: 概念:two: 使用2.1 创建字符串对象2.2 字符串的比较2.3 字符串长度2.4 字符串连接2.5 字符串截取2.6 字符串的查找和替换2.7 字符串的切割和拆分2.8 字符串和其他类型的转换2.9 字符串的格式化2.10 字符串的判断2.11 手动入池2.12 其他操作2.13 小结 :three: 字符串常量池:four: StringBuffer类:five: StringBuilder类:six: String、StringBuffer和StringBuilder的对比:bookmark_tabs: 本文源码下载地址

1️⃣ 概念

Java的String类是Java标准库中最常用的类之一。它用于表示字符串,并提供了许多用于操作和处理字符串的方法。

Java的String类的概念源自于C语言中的字符数组。然而,为了方便使用和提供更多功能,Java设计者将String类定义为一个引用类型,而不是像C语言中的字符数组那样是一个基本数据类型。

Java的String类提供了丰富的方法来处理字符串,包括字符串连接、查找子字符串、比较字符串、提取字符、替换字符、大小写转换等等。这些方法使得在Java中处理字符串变得非常方便和灵活。

与其他编程语言相比,Java的String类的优势在于字符串是不可变的(immutable),也就是说一旦创建,字符串的内容就不可修改。这种不可变性使得字符串具有更好的线程安全性。

2️⃣ 使用 2.1 创建字符串对象

在Java中,我们可以使用以下两种方式创建一个String类型的对象:

public void createString(){ //1、直接赋值 String str1 = "Hello"; //2、构造方法 String str2 = new String("World"); }

上述代码中,第一种方式使用字符串字面量直接创建一个字符串对象,而第二种方式通过关键字new创建一个新的字符串对象。

需要注意的是,String类是不可变的,意味着一旦创建了一个字符串对象,就不允许对其进行修改。每次修改字符串时,实际上是创建了一个全新的字符串对象,因此在频繁修改字符串时需要特别注意性能问题。

🔍 String类的两种实例化方式之间有什么区别? 1、直接赋值 String类的设计使⽤了共享设计模式,JVM底层会自动维护一个字符串的对象池(对象数组)。 采用直接赋值 的方式进行对象实例化操作,那么该实例化对象(字符串内容)将自动保存到对象池 之中。 如果下次继续使用直接赋值的方式声明String类对象,此时对象池之中若已有相同内容,则直接进行引用;若没有,则创建新的字符串对象而后将其保存在对象池之中。 2、构造方法 构造方法方式的实例化,JVM会先在堆上创建一个匿名字符串,再将这个字符串复制一份并由变量指向,导致出现垃圾空间(匿名String对象),且此方式不会将该字符串对象加入到JVM的 “字符串常量池” 中,导致字符串共享问题。 解决办法是使用String类的intern()方法将以构造方法方式创建的对象手动加入到"字符串常量池"中。

2.2 字符串的比较

在Java中,用于比较字符串的内容是否相同有两种方法:equals()和equalsIgnoreCase()。

boolean equals(Object anObject):比较两个字符串的内容是否相同;boolean equalsIgnoreCase(String anotherString):忽略字符串的大小写,比较两个字符串的内容;int compareTo(String anotherString):按照字符编码比较字符串大小,结果=0表示相等、>0表示大于、 String str = "Hello World"; int length = str.length(); System.out.println(length); }

运行结果:

11 2.4 字符串连接

在Java中,可以使用+运算符或String concat(String str)方法来拼接字符串。如下:

public static void concatMethod(){ String str1 = "Hello"; String str2 = "World"; String result1 = str1 + ", " + str2; String result2 = str1.concat(", ").concat(str2); System.out.println(result1); System.out.println(result2); }

需要注意的是,频繁拼接字符串时,使用StringBuilder或StringBuffer类会更高效。下文会详细介绍关于这这两个类的更多情况。

运行结果:

Hello, World Hello, World 2.5 字符串截取

要从一个字符串中截取子串,可以使用substring(int beginIndex, int endIndex)方法和substring(int beginIndex)方法。

substring(int beginIndex, int endIndex)方法用来截取从第一个参数表示的起始位置(包括)到第二个参数表示结束位置(不包括)的子字符串;substring(int beginIndex)方法用于从从第一个参数表示的指定位置截取到字符串末尾。

如下:

public static void substringMethod(){ String str = "Hello World!"; String substr = str.substring(6, 11); String substr2 = str.substring(6); System.out.println(substr); System.out.println(substr2); }

运行结果:

World World! 2.6 字符串的查找和替换

🍎 查找 对于字符串的查找操作,常用的方法有indexOf(int ch)和lastIndexOf(int ch)。它们用于返回指定字符或子串在字符串中的位置。

indexOf(int ch) 和 indexOf(String str):从前往后的正向查找指定字符或子串在字符串中的位置。若找不到,则返回-1;lastIndexOf(int ch) 和 lastIndexOf(String str):从后往前的反向查找指定字符或子串在字符串中的位置。若找不到,则返回-1;charAt(int index):获取指定位置的字符。

如下:

public static void findIndexMethod(){ String str = "Hello World"; int index1 = str.indexOf('o'); int index2 = str.indexOf("World"); int lastIndex1 = str.lastIndexOf('o'); int lastIndex2 = str.lastIndexOf("World"); System.out.println(index1); System.out.println(index2); System.out.println(lastIndex1); System.out.println(lastIndex2); char c = str.charAt(0); System.out.println(c); }

运行结果:

4 6 7 6 H

🍊 替换 Java中提供了多个方法用于替换字符串中的字符或子串,分别是:

replace(char oldChar, char newChar) 方法用于将字符串中的指定字符 替换为新字符。该方法会返回一个新字符串,原始字符串不会改变。若原始字符串中有多个匹配的字符,所有匹配的字符都会被替换;

replace(CharSequence target, CharSequence replacement) 方法用于将字符串中与目标字符序列 匹配的部分替换为指定字符序列。该方法同样会返回一个新字符串,而不改变原始字符串; 注意这个方法的参数是 CharSequence 类型,这意味着可以传递任何实现了 CharSequence 接口的对象,包括 String、StringBuilder 等。这使得它更具灵活性,可以进行更复杂的字符串替换操作;

replaceFirst(String regex, String replacement)方法将字符串中首次出现的与正则表达式regex匹配的部分替换;

replaceAll(String regex, String replacement) 方法会将字符串中所有与正则表达式regex匹配的部分全部替换。

如下:

public static void replaceMethod(){ String str = "Hello World"; String newStr1 = str.replace('l', 'L'); String newStr2 = str.replace("World", "Java"); System.out.println(newStr1); System.out.println(newStr2); String newStr3 = str.replaceFirst("l", "L"); String newStr4 = str.replaceAll("l", "L"); System.out.println(newStr3); System.out.println(newStr4); }

运行结果:

HeLLo WorLd Hello Java HeLlo World HeLLo WorLd 2.7 字符串的切割和拆分

🍒 切割 字符串的切割操作主要通过split(String regex)方法来实现,其中参数regex是一个正则表达式,用于指定分隔符。

如下:

public static void splitMethod(){ String str = "Java is a programming language"; String[] splitStr = str.split(" "); for (String s : splitStr) { System.out.println(s); } }

输出结果:

Java is a programming language

🍉 拆分 拆分字符串与切割类似,使用的方法是split(String regex, int limit)。limit参数指定返回的数组长度限制。

如下:

public static void splitLimitMethod(){ String str = "Java,is,a,programming,language"; String[] splitStr = str.split(",", 3); for (String s : splitStr) { System.out.println(s); } }

输出结果:

Java is a,programming,language 2.8 字符串和其他类型的转换

Java中提供了大量用于字符串和其他数据类型转换的方法:

toCharArray():将字符串转换为字符数组;String.valueOf(Object obj):将其他类型转换为字符串;getBytes():使用平台的默认字符集将此 字符串编码为字节数组;getBytes(String charsetName):使用指定字符集将 字符串编码为字节数组。

同时,各个包装类也有对字符串转换的支持:

int intValue = Integer.parseInt(stringValue); 将字符串转换为整数;double doubleValue = Double.parseDouble(stringValue); 将字符串转换为双精度浮点数;float floatValue = Float.parseFloat(stringValue); 将字符串转换为单精度浮点数;boolean booleanValue = Boolean.parseBoolean(stringValue); 将字符串转换为布尔值。

关于包装类对字符串转换的操作支持更多情况,请参考我的另一篇文章: 【Java高级语法】(四)包装类:关于包装类的那些细节你都清楚吗?~

如下:

public static void changeTypeMethod(){ String str = "Hello, world!"; // 将字符串转换为字符数组 char[] charArray = str.toCharArray(); System.out.println("字符串转换为字符数组:"); for (char c : charArray) { System.out.print(c + "、"); } System.out.println(); // 将其他类型转换为字符串 int number = 123; String numberStr = String.valueOf(number); System.out.println("将整数转换为字符串:" + numberStr); double decimal = 3.14; String decimalStr = String.valueOf(decimal); System.out.println("将浮点数转换为字符串:" + decimalStr); boolean bool = true; String boolStr = String.valueOf(bool); System.out.println("将布尔值转换为字符串:" + boolStr); // 使用平台的默认字符集将字符串编码为字节数组 byte[] bytes1 = str.getBytes(); System.out.println("默认字符集下的字节数组:"); for (byte b : bytes1) { System.out.print(b + " "); } System.out.println(); // 使用指定字符集将字符串编码为字节数组(UTF-8) byte[] bytes2 = str.getBytes(Charset.forName("UTF-8")); System.out.println("UTF-8字符集下的字节数组:"); for (byte b : bytes2) { System.out.print(b + " "); } System.out.println(); // 使用指定字符集将字符串编码为字节数组(GBK) byte[] bytes3 = str.getBytes(Charset.forName("GBK")); System.out.println("GBK字符集下的字节数组:"); for (byte b : bytes3) { System.out.print(b + " "); } System.out.println(); }

输出结果:

字符串转换为字符数组: H、e、l、l、o、,、 、w、o、r、l、d、!、 将整数转换为字符串:123 将浮点数转换为字符串:3.14 将布尔值转换为字符串:true 默认字符集下的字节数组: 72 101 108 108 111 44 32 119 111 114 108 100 33 UTF-8字符集下的字节数组: 72 101 108 108 111 44 32 119 111 114 108 100 33 GBK字符集下的字节数组: 72 101 108 108 111 44 32 119 111 114 108 100 33 2.9 字符串的格式化

Java中使用String.format()方法可以对字符串进行格式化操作。

String.format(String format, Object... args):使用格式规范化字符串。第一个参数是格式字符串,后续参数是需要插入到格式字符串中的变量。

如下:

public static void formatMethod(){ int number = 123; double decimal = 3.14; // 使用格式化字符串 String formattedString = String.format("The number is %d and the decimal is %.2f", number, decimal); System.out.println("格式化字符串:" + formattedString); }

输出结果:

格式化字符串:The number is 123 and the decimal is 3.14 2.10 字符串的判断

Java中使用String.format()方法可以对字符串进行格式化操作。

boolean contains(String s):判断该字符串是否包含传进来的字符串;boolean startsWith(String prefix):判断字符串是否以传进来的字符串开头;boolean endsWith(String suffix):判断字符串是否以传进来的字符串结尾;boolean isEmpty():判断字符串是否为空。

如下:

public static void judgmentMethod(){ String str = "Hello, World!"; // 判断字符串是否包含传进来的字符串 String searchStr1 = "Hello"; boolean containsStr1 = str.contains(searchStr1); System.out.println("字符串 \"" + str + "\" 是否包含 \"" + searchStr1 + "\": " + containsStr1); String searchStr2 = "ChinaAi"; boolean containsStr2 = str.contains(searchStr2); System.out.println("字符串 \"" + str + "\" 是否包含 \"" + searchStr2 + "\": " + containsStr2); // 判断字符串是否以传进来的字符串开头 String prefix1 = "Hello"; boolean startsWithPrefix1 = str.startsWith(prefix1); System.out.println("字符串 \"" + str + "\" 是否以 \"" + prefix1 + "\" 开头: " + startsWithPrefix1); String prefix2 = "Hi"; boolean startsWithPrefix2 = str.startsWith(prefix2); System.out.println("字符串 \"" + str + "\" 是否以 \"" + prefix2 + "\" 开头: " + startsWithPrefix2); // 判断字符串是否以传进来的字符串结尾 String suffix1 = "World!"; boolean endsWithSuffix1 = str.endsWith(suffix1); System.out.println("字符串 \"" + str + "\" 是否以 \"" + suffix1 + "\" 结尾: " + endsWithSuffix1); String suffix2 = "Java"; boolean endsWithSuffix2 = str.endsWith(suffix2); System.out.println("字符串 \"" + str + "\" 是否以 \"" + suffix2 + "\" 结尾: " + endsWithSuffix2); // 判断字符串是否为空 boolean isEmpty = str.isEmpty(); System.out.println("字符串 \"" + str + "\" 是否为空: " + isEmpty); }

输出结果:

字符串 "Hello, World!" 是否包含 "Hello": true 字符串 "Hello, World!" 是否包含 "ChinaAi": false 字符串 "Hello, World!" 是否以 "Hello" 开头: true 字符串 "Hello, World!" 是否以 "Hi" 开头: false 字符串 "Hello, World!" 是否以 "World!" 结尾: true 字符串 "Hello, World!" 是否以 "Java" 结尾: false 字符串 "Hello, World!" 是否为空: false 2.11 手动入池

在Java中,通过手动将字符串加入字符串池,可以实现字符串的共享,从而优化内存使用。可以使用以下方式将字符串手动添加到字符串池中:

intern():这个方法会返回字符串池中对应的字符串,如果池中没有该字符串,则将它添加到池中并返回。

如下:

public static void internMethod(){ // 创建两个不同的字符串对象 String str1 = new String("Hello"); String str2 = new String("Hello"); // 执行intern()方法后,将字符串加入字符串常量池 String internStr1 = str1.intern(); String internStr2 = str2.intern(); // 检查两个字符串是否引用同一个字符串对象 boolean isSameObject = (internStr1 == internStr2); System.out.println("是否引用同一个字符串对象: " + isSameObject); // 使用equals()方法检查字符串内容是否相同 boolean isEqual = internStr1.equals(internStr2); System.out.println("字符串内容是否相同: " + isEqual); }

输出结果:

是否引用同一个字符串对象: true 字符串内容是否相同: true 2.12 其他操作

Java中String 类还包括以下一些操作方法:

toLowerCase():将字符串中的英文字母转小写;toUpperCase():将字符串中的英文字母转大写;trim():去掉字符串左右两边的空格。

如下:

public static void otherMethod(){ String input = " Hello, World! "; System.out.println("原始字符串: " + input); // 转小写 String lowercase = input.toLowerCase(); System.out.println("转小写后: " + lowercase); // 转大写 String uppercase = input.toUpperCase(); System.out.println("转大写后: " + uppercase); // 去掉左右两边的空格 String trimmed = input.trim(); System.out.println("去掉空格后: " + trimmed); }

输出结果:

原始字符串: Hello, World! 转小写后: hello, world! 转大写后: HELLO, WORLD! 去掉空格后: Hello, World! 2.13 小结

本节介绍了Java中String类的各种操作支持方法,包括创建字符对象、比较字符串内容、获取长度、连接、截取、查找、替换、切割、拆分、转换、格式化等常用操作。String类是Java编程中十分重要的一部分,熟练掌握这些操作有助于开发出高效的程序。

操作类别方法说明获取length() 获取字符串长度 charAt(int index) 获取指定位置的字符 indexOf(Char char)获取指定字符在字符串中首次出现的位置lastIndexOf(Char char)反向查找指定字符在字符串中首次出现的位置subString(int start)字符串截取,从指定位置到字符串末尾subString(int start,int end)字符串截取,从指定位置到指定位置,范围左闭右开比较equals(String s)比较字符串内容是否相同,区分大小写equalsIgnoreCase(String s)比较字符串内容是否相同,不区分大小写compareTo(String s)比较字符串大小(按照字符编码),结果=0表示相等、>0表示大于、 // 创建一个空的 StringBuilder 对象 StringBuilder sb1 = new StringBuilder(); // 根据已存在的字符串创建 StringBuilder 对象 StringBuilder sb2 = new StringBuilder("Hello"); // 指定初始容量创建 StringBuilder 对象 StringBuilder sb3 = new StringBuilder(10); StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append("World"); System.out.println(sb.toString()); sb.delete(5, 10); System.out.println(sb.toString()); sb.insert(5, " World"); System.out.println(sb.toString()); sb.replace(5, 11, " Everybody"); System.out.println(sb.toString()); sb.reverse(); System.out.println(sb.toString()); String str = sb.toString(); System.out.println(str); }

输出结果:

HelloWorld Hello Hello World Hello Everybody ydobyrevE olleH ydobyrevE olleH

除了上面提到的常用方法之外,StringBuilder 还有其他一些方法可以查询和修改字符串。请参考 Java 官方文档 以获取更详尽的信息。

6️⃣ String、StringBuffer和StringBuilder的对比

String类:适用于少量的字符串不变的操作; StringBuilder类:适用于单线程下在字符串缓冲区进行大量操作; StringBuffer类:适用于多线程下在字符串缓冲区进行大量操作。

String类表示不可变的(immutable)字符串,该类是 final修饰的类,不能被继承且表示字符串常量(字符串常量一旦声明则不可改变,而字符串对象可以改变,改变的是其内存地址的指向),对String修改会产生新的对象,效率低。而StringBuilder和StringBuffer均为可变字符串;String类使用 + 和 concat() 方法做数据的连接操作,而在StringBuffer类和StringBuilder类中使用 append()方法进行数据连接;StringBuilder是非线程安全的,不保证同步所以在性能上较高;StringBuffer是线程安全的,该类方法都使用了 synchronized 修饰,所以符合多线程操作中的安全要求。 📑 本文源码下载地址

Java的String类讲解案例代码(String类使用:创建对象、比较、连接、截取、查找和替换、拆分…) 在这里插入图片描述

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3