咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦\~
🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
String类是Java中最常用的类之一,它提供了许多方便的方法来操作字符串。本教程将深入讲解String类的使用方法,包括创建字符串、字符串的比较、连接、子串、替换、分割等操作。
摘要
本教程主要包括以下内容:
- String类概述
- String类源码解析
- String类常用方法介绍
String类方法使用介绍
- 如何创建字符串
- 字符串比较
- 字符串连接
- 提取子串
- 替换字符串
- 分割字符串
- 字符串长度
- 字符串搜索
测试用例
- 测试代码
- 测试结果
- 测试代码分析
- 小结
String类
概念
String类是Java中最常用的类之一,它表示字符串类型的数据。字符串是由一系列字符组成的,可以用双引号括起来表示,例如:"Hello World"。Java中的String类是不可变的,一旦被创建,它的值就不能被改变。这意味着每次对一个字符串进行操作时,都需要创建一个新的字符串对象。
优缺点分析
优点:
- 不可变性:String对象创建后,其内容不能被修改,这就保证了程序中的某些变量在被赋值后不能再被修改,从而保证了程序的正确性和健壮性;
- 可重用性:String对象可以被多个变量引用,因为其内容不可变,所以可以在程序中多次使用同一个String对象来表示相同的字符串,这就提高了程序的性能;
- 安全性:由于String对象的不可变性,程序在使用字符串时不需要担心修改原始数据的风险,从而保证了程序的安全性;
- 常量池:Java中的字符串常量会被存储在常量池中,相同字符串只会在内存中存储一份,从而节省了内存空间。
缺点:
- 可能会产生大量的临时对象:由于字符串的不可变性,每次字符串的拼接、切割等操作都会产生新的String对象,如果频繁进行这些操作,可能会导致大量的临时对象被创建,从而影响程序的性能;
- 比较操作不高效:由于String对象的比较操作是逐字符比较的,如果比较的字符串过长,比较操作可能会很耗时。
应用场景
应用场景:
- 字符串处理:String类是Java中最常用的字符串处理类,通常用于存储和处理文本,如读取文件、解析XML等;
- 数据库操作:在Java中进行数据库操作时,经常需要使用字符串来表示SQL语句、表名、字段名等;
- 网络通信:在网络通信中,很多协议都是基于字符串的,例如HTTP协议、FTP协议等,使用String类可以方便地表示和处理这些通信协议。
源码分析
下面是Java中String类的部分源码:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
// 字符串的值,底层是一个字符数组
private final char value[];
// 字符串的长度
private final int count;
// 缓存hash值,默认为0
private int hash;
// 构造函数,传入一个字符数组
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
this.count = value.length;
}
// 返回字符串的长度
public int length() {
return count;
}
// 返回指定索引位置的字符
public char charAt(int index) {
if ((index < 0) || (index >= count)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
// 返回从beginIndex到endIndex-1位置的子字符串
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(value, beginIndex, endIndex - beginIndex);
}
// 比较字符串的内容是否相等
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
// 判断字符串是否包含指定的字符序列
public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}
}
从上述代码中可以看出,String类是不可变的,即一旦被创建,其值不可更改。在构造函数中,传入一个字符数组,并将其复制到类中的value数组中,最终得到一个完整的字符串。String类中包含了多个常用的方法,例如length()
、charAt()
、substring()
、equals()
和contains()
等方法。这些方法都对字符串进行了不同程度的操作,例如返回字符串的长度、返回指定索引位置的字符、返回子字符串、比较字符串的内容是否相等、判断字符串是否包含指定的字符序列等。
常用方法
在String类中,包含了多个常用的方法,例如:
length()
:返回字符串的长度。charAt(int index)
:返回指定索引位置的字符。substring(int beginIndex, int endIndex)
:返回从beginIndex
到endIndex-1
位置的子字符串。equals(Object anObject)
:比较字符串的内容是否相等。contains(CharSequence s)
:判断字符串是否包含指定的字符序列。
具体方法介绍
如何创建字符串
在Java中创建字符串有两种方式。第一种是使用字符串字面值,例如:
String str = "Hello World";
第二种是使用String类的构造方法,例如:
String str = new String("Hello World");
第二种方式比较消耗资源,因为它会在堆中创建一个新的字符串对象。建议使用第一种方式创建字符串。
字符串比较
在Java中比较字符串可以使用equals()方法或==运算符。例如:
String str1 = "Hello World";
String str2 = "Hello World";
String str3 = new String("Hello World");
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str1 == str3); // false
需要注意的是,equals()
方法比较的是两个字符串的值是否相等;==运算符比较的是两个字符串的引用是否相等。
字符串连接
在Java中可以使用+运算符或concat()
方法连接两个字符串。例如:
String str1 = "Hello";
String str2 = "World";
String str3 = str1 + " " + str2;
String str4 = str1.concat(" ").concat(str2);
System.out.println(str3); // "Hello World"
System.out.println(str4); // "Hello World"
需要注意的是,每次连接字符串都会创建一个新的字符串对象,因此在连接多个字符串时应该使用StringBuilder
或StringBuffer
类。
字符串长度
可以使用length()
方法获取字符串的长度,如下:
String str = "Hello World";
int len = str.length();
提取子串
在Java中可以使用substring()
方法提取字符串的子串。例如:
String str1 = "Hello World";
String str2 = str1.substring(6); // "World"
String str3 = str1.substring(0, 5); // "Hello"
System.out.println(str2);
System.out.println(str3);
其中,substring(int beginIndex)
方法用于提取从指定位置开始到字符串末尾的子串;substring(int beginIndex, int endIndex)
方法用于提取从指定位置开始到指定位置结束的子串。
替换字符串
在Java中可以使用replace()
方法或replaceAll()
方法替换字符串中的内容。例如:
//替换字符串
public static void testReplace() {
String str1 = "Hello World";
String str2 = str1.replace("World", "Java"); // "Hello Java"
String str3 = str1.replaceAll("o", "O"); // "HellO WOrld"
System.out.println(str2);
System.out.println(str3);
}
执行结果截图如下:
其中,replace(CharSequence oldChar, CharSequence newChar)
方法用于替换字符串中的指定字符或字符串;replaceAll(String regex, String replacement)
方法用于替换字符串中的正则表达式匹配项。
分割字符串
在Java中可以使用split()方法将字符串分割成字符串数组。例如:
//分割字符串
public static void testSplit() {
String str1 = "Hello,World,Java";
String[] str2 = str1.split(","); // {"Hello", "World", "Java"}
for (String str : str2) {
System.out.println(str);
}
}
执行结果截图如下:
需要注意的是,split()方法的参数可以是一个正则表达式。如果分割符是一个普通字符,可以使用Pattern.quote()
方法将其转义。
字符串搜索
可以使用indexOf()
方法和lastIndexOf()
方法来查找子字符串在字符串中的位置,如下:
//字符串搜索
public static void testIndexOf() {
String str = "Hello World";
int index1 = str.indexOf("o"); // 4
int index2 = str.lastIndexOf("o"); // 7
System.out.println("index1:" + index1);
System.out.println("index2:" + index2);
}
public static void main(String[] args) {
testIndexOf();
}
执行结果截图如下:
测试用例
如下我将实际运用如上方法进行简单演示,以帮助同学们更好的理解与使用。
测试代码
如下:
public class StringTest {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "hello";
// test string equality with case sensitive
if (str1.equals(str2)) {
System.out.println("The two strings are equal.");
} else {
System.out.println("The two strings are not equal.");
}
// test string equality with case insensitive
if (str1.compareToIgnoreCase(str2) == 0) {
System.out.println("The two strings are equal.");
} else {
System.out.println("The two strings are not equal.");
}
// test substring
String str = "Hello World";
String str3 = str.substring(0, 5);
String str4 = str.substring(6);
System.out.println(str3 + " " + str4);
// test string length
int len = str.length();
System.out.println(len);
// test string concatenation
String str5 = "Java";
String str6 = str1 + " " + str5;
System.out.println(str6);
// test string replace
String newStr = str.replace("World", "Java");
System.out.println(newStr);
}
}
测试结果
执行如上测试用例,结果如下:
测试用例代码分析
该代码演示了 Java 中 String 类的常用方法,主要包括:
equals()
方法用于比较两个字符串是否相等,区分大小写;compareToIgnoreCase()
方法用于比较两个字符串是否相等,不区分大小写;substring()
方法用于截取字符串中的子串;length()
方法用于获取字符串的长度;- 字符串拼接使用 + 号;
replace()
方法用于替换字符串中的字符或子串。
在该代码中,需要注意以下几点:
- 字符串比较使用
equals()
和compareToIgnoreCase()
方法; - 截取子串使用
substring()
方法,指定起始位置和结束位置; - 构造新字符串使用 + 号;
- 替换字符或子串使用
replace()
方法,指定要替换的字符或子串和替换后的字符或子串。
小结
本教程介绍了Java中String类的使用方法,包括创建字符串、字符串的比较、连接、子串、替换、分割等操作。需要注意的是,由于每次操作都会创建一个新的字符串对象,因此在进行大量字符串操作时应该使用StringBuilder或StringBuffer类。在实际开发中,String类是非常常用的一个类,掌握好它的使用方法对于编写高效的Java程序非常重要。
附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
结语
本篇文章对Java中String类的基础内容进行了详细的讲解,希望能够帮助读者更好地掌握Java语言中字符串的操作方法。
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个 一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。