1. String类概述
本节学习String这个类,也就是学习如何对字符串进行处理。字符串处理在开发中极为常见,理解String类的使用至关重要。
应用场景示例:
-
用户登录:用户输入的用户名和密码需要与后台存储的正确信息进行校验,这时就需要用到String类提供的比较功能。
String userInputPassword = "userPassword123"; String correctPassword = "userPassword123"; if (userInputPassword.equals(correctPassword)) { System.out.println("登录成功"); } else { System.out.println("登录失败"); }
-
直播留言过滤:检测并屏蔽不文明留言,如用
***
替换脏话。String rudeComment = "这个人是笨蛋"; String filteredComment = rudeComment.replace("笨蛋", "***"); System.out.println(filteredComment); // 输出:这个人是***
Java为了方便字符串处理,提供了String
类,该类位于java.lang
包下。通过创建字符串对象并调用其方法,可以方便地处理字符串。
2. String创建对象
首先,我们查看String类的API文档,了解如何创建String对象。
API文档摘要:
- Java程序中的所有字符串字面值(如
"abc"
)都是String
类的实例。
创建String对象的方式:
-
方式一:直接使用双引号创建字符串对象。
String s1 = "abc"; // "abc"是一个字符串对象,用s1变量接收 String s2 = "小马快递员"; // "小马快递员"是一个字符串对象,用s2变量接收
-
方式二:使用
String
类的构造方法创建对象。// 使用默认构造方法,创建一个空字符串对象 String rs1 = new String(); System.out.println(rs1); // 输出:"" // 使用带字符串参数的构造方法 String rs2 = new String("itheima"); System.out.println(rs2); // 输出:itheima // 使用字符数组作为参数 char[] chars = {'a', 'b', 'c'}; String rs3 = new String(chars); System.out.println(rs3); // 输出:abc // 使用字节数组作为参数 byte[] bytes = {97, 98, 99}; String rs4 = new String(bytes); System.out.println(rs4); // 输出:abc
3. String类的常用方法
接下来,我们学习如何使用String类的方法处理字符串。首先快速浏览一下String类的常用方法,然后在具体示例中加深理解。
常用方法概览:
-
length()
:获取字符串长度。 -
charAt(int index)
:获取指定索引处的字符。 -
toCharArray()
:将字符串转换为字符数组。 -
equals(Object anObject)
:比较字符串内容是否相同。 -
equalsIgnoreCase(String anotherString)
:忽略大小写比较字符串内容。 -
substring(int beginIndex, int endIndex)
:截取字符串。 -
substring(int beginIndex)
:从指定索引处截取到字符串末尾。 -
replace(CharSequence target, CharSequence replacement)
:替换字符串中的指定内容。 -
contains(CharSequence s)
:判断字符串是否包含指定内容。 -
startsWith(String prefix)
:判断字符串是否以指定前缀开头。 -
split(String regex)
:根据正则表达式拆分字符串。
示例代码:
public class StringDemo {
public static void main(String[] args) {
// 示例字符串
String s = "黑马Java";
// 获取字符串长度
System.out.println("字符串长度: " + s.length());
// 获取指定索引处的字符
char c = s.charAt(1);
System.out.println("索引1处的字符: " + c);
// 遍历字符串
for (int i = 0; i < s.length(); i++) {
System.out.println("字符: " + s.charAt(i));
}
// 将字符串转换为字符数组并遍历
char[] chars = s.toCharArray();
for (char ch : chars) {
System.out.println("字符数组中的字符: " + ch);
}
// 比较字符串内容
String s1 = new String("小马");
String s2 = new String("小马");
System.out.println("s1 == s2: " + (s1 == s2)); // false,比较引用
System.out.println("s1.equals(s2): " + s1.equals(s2)); // true,比较内容
// 忽略大小写比较字符串内容
String c1 = "34AeFG";
String c2 = "34aEfg";
System.out.println("c1.equals(c2): " + c1.equals(c2)); // false
System.out.println("c1.equalsIgnoreCase(c2): " + c1.equalsIgnoreCase(c2)); // true
// 截取字符串
String s3 = "Java是最好的编程语言之一";
String rs = s3.substring(0, 8);
System.out.println("截取字符串: " + rs);
// 从指定索引处截取到字符串末尾
String rs2 = s3.substring(5);
System.out.println("从索引5截取到末尾: " + rs2);
// 替换字符串中的指定内容
String info = "这个电影简直是个垃圾,垃圾电影!!";
String rs3 = info.replace("垃圾", "**");
System.out.println("替换后的字符串: " + rs3);
// 判断字符串是否包含指定内容
String info2 = "Java是最好的编程语言之一,我爱Java,Java不爱我!";
System.out.println("info2包含Java: " + info2.contains("Java"));
System.out.println("info2包含java: " + info2.contains("java")); // 大小写敏感
System.out.println("info2包含Java2: " + info2.contains("Java2"));
// 判断字符串是否以指定前缀开头
String rs4 = "张三丰";
System.out.println("rs4以张开头: " + rs4.startsWith("张"));
System.out.println("rs4以张三开头: " + rs4.startsWith("张三"));
// 根据正则表达式拆分字符串
String rs5 = "张无忌,周芷若,殷素素,赵敏";
String[] names = rs5.split(",");
for (String name : names) {
System.out.println("拆分后的字符串: " + name);
}
}
}
4. String的注意事项
注意事项:
-
String对象是不可变的:
- String对象一旦创建,其内容就不可改变。任何对String的修改操作都会返回一个新的String对象。
- 例如,字符串拼接操作实际上是在常量池中创建了一个新的字符串对象,而不是修改了原有的字符串。
-
字符串字面量和new创建字符串的区别:
- 字符串字面量(如
"abc"
)会被存储在字符串常量池中,相同内容的字符串只存储一份。 - 使用
new
关键字创建的字符串对象会在堆内存中分配新的空间,即使内容相同,也是不同的对象。
- 字符串字面量(如
示例代码:
public class StringExample {
public static void main(String[] args) {
// 字符串字面量
String str1 = "小马";
String str2 = "小马";
// 使用new关键字创建字符串
String str3 = new String("小马");
String str4 = new String("小马");
// 比较字符串字面量和new创建的字符串
System.out.println("str1 == str2: " + (str1 == str2)); // true,指向同一个对象
System.out.println("str1.equals(str2): " + str1.equals(str2)); // true,内容相同
System.out.println("str3 == str4: " + (str3 == str4)); // false,不同对象
System.out.println("str3.equals(str4): " + str3.equals(str4)); // true,内容相同
// 验证字符串字面量存储在常量池中
String str5 = "小马" + "快递员"; // 编译时优化为"小马快递员"
String str6 = "小马快递员";
System.out.println("str5 == str6: " + (str5 == str6)); // true,指向同一个对象
}
}