Java中的字符串是由双引号括起来的多个字符。
Java中的字符采用Unicode编码,所以Java字符串可以包含中文。
"Hello World"
"你好!"
""
注意:""表示空字符串,双引号中没有任何内容,空字符串不是null,空字符串是分配内存空间的,而null是没有分配内存空间的。
1 字符串
字符串可以分为可变字符串和不可变字符串。
String是不可变字符串
StringBuffer、StringBuilder是可变字符串.
1.1 String
// 创建字符串对象
String s1 = new String();
String s2 = new String("Hello World");
String s3 = new String("\u0048\u0065\u006c\u006c\u006f\u0020\u0057\System.out.println("s2 = " + s2);
System.out.println("s3 = " + s3);
char chars[] = { 'a', 'b', 'c', 'd', 'e' };
// 通过字符数组创建字符串对象
String s4 = new String(chars);
// 通过子字符数组创建字符串对象
String s5 = new String(chars, 1, 4);
System.out.println("s4 = " + s4);
System.out.println("s5 = " + s5);
byte bytes[] = { 97, 98, 99 };
// 通过byte数组创建字符串对象
String s6 = new String(bytes);
System.out.println("s6 = " + s6);
System.out.println("s6字符串长度 = " + s6.length());
输出结果:
s2 = Hello World
s3 = Hello World
s4 = abcde
s5 = bcde
s6 = abc
s6字符串长度 = 3
1.1.1 字符串池
String s7 = new String("Hello"); //使用new关键字创建 ①
String s8 = new String("Hello"); // ②
String s9 = "Hello"; //字符串常量 ③
String s10 = "Hello"; //④
System.out.printf("s7 == s8 : %b%n", s7 == s8);
System.out.printf("s9 == s10: %b%n", s9 == s10);
System.out.printf("s7 == s9 : %b%n", s7 == s9);
System.out.printf("s8 == s9 : %b%n", s8 == s9);
输出结果为:
s7 == s8 : false
s9 == s10: true
s7 == s9 : false
s8 == s9 : false
提示:
==运算符比较的是两个引用是否指向相同的对象,s7和s8指的是不同对象,s9和s10指向的是相同对象。
1.1.2 字符串拼接
两种方式:
+运算符 :可以连接任何类型数据拼接成为字符串。
concat(String str):只能拼接String类型字符串
String s1 = "Hello";
// 使用+运算符连接
String s2 = s1 + " ";
String s3 = s2 + "World";
System.out.println(s3);
//共产生了三个对象
结果为:
Hello World
String s4 = "Hello";
// 使用+运算符连接,支持+=赋值运算符
s4 += " ";
s4 += "World";
System.out.println(s4);
结果为:
Hello World
String s5 = "Hello";
// 使用concat方法连接
s5 = s5.concat(" ").concat("World");
System.out.println(s5);
结果为:
Hello World
int age = 8;
String s6= "她的年龄是" + age + "岁。";
System.out.println(s6);
char score = 'A';
String s7= "她的英语成绩是" + score;
System.out.println(s7);
结果为:
她的年龄是8岁。
她的英语成绩是A
java.util.Date now = new java.util.Date();
//对象拼接自动调用toString()方法
String s8= "今天是:" + now;
System.out.println(s8);
结果为:
今天是:Thu July 20 13:30:40 CST 2020
提示: Java中所有对象都有一个toString()方法,该方法可以将对象转换为字符串,拼接过程会调用该对象的toString()方法,将该对象转换为字符串后再进行拼接。
1.1.3 字符串查找
在String类中提供了indexOf和lastIndexOf方法用于查找字符或字符串,返回值是查找的字符或字符串所在的位置,-1表示没有找到。
方法 | 返回值 |
---|---|
int indexOf(int ch) | 从前往后搜索字符ch,返回第一次找到字符ch所在处的索引 |
int indexOf(int ch, int fromIndex) | 从指定的索引开始从前往后搜索字符ch,返回第一次找到字符ch所在处的索引。 |
int indexOf(String str) | 从前往后搜索字符串str,返回第一次找到字符串所在处的索引 |
int indexOf(String str, int fromIndex) | 从指定的索引开始从前往后搜索字符串str,返回第一次找到字符串所在处的索引 |
int lastIndexOf(int ch) | 从后往前搜索字符ch,返回第一次找到字符ch所在处的索引 |
int lastIndexOf(int ch, int fromIndex) | 从指定的索引开始从后往前搜索字符ch,返回第一次找到字符ch所在处的索引。 |
int lastIndexOf(String str) | 从后往前搜索字符串str,返回第一次找到字符串所在处的索引 |
int lastIndexOf(String str, int fromIndex) | 从指定的索引开始从后往前搜索字符串str,返回第一次找到字符串所在处的索引。 |
charAt(int index) | 返回索引index所在位置的字符 |
代码演示
String str = "Hello World,Nice to meet you!";
//获得字符串长度
int len = str.length(); // 29
//获得索引位置8的字符
char ch = str.charAt(8); // r
//查找字符和字符串
int firstChar1 = str.indexOf('W'); // 6
int lastChat1 = str.lastIndexOf('W');
int firstStr1 = str.indexOf("ld");
int lastStr1 = str.lastIndexOf("ld");
1.1.4 字符串比较
字符串比较包括 比较相等,比较大小、比较前缀、比较后缀
1)比较相等
String s1 = new String("Hello");
String s2 = new String("Hello");
//比较字符串是否是相同的引用
System.out.println("s1==s2:"+(s1==s2)); //false
//比较字符串内容是否相等
System.out.println("s1.equals(s2) : " + (s1.equals(s2))); //true
String s3 = "HELlo";
// 忽略大小写比较字符串内容是否相等
System.out.println("s1.equalsIgnoreCase(s3) : " + (s1.equalsIgnoreCase(s3));
// true
// 比较大小
String s4 = "java";
String s5 = "Swift";
// 比较字符串大小 s4 > s5
System.out.println("s4.compareTo(s5) : " + (s4.compareTo(s5)));
// 忽略大小写, 23
比较字符串大小 s4 < s5
System.out.println("s4.compareToIgnoreCase(s5) : " (s4.compareToIgnoreCase(s5)); //-9
提示:
s4.compareTo(s5)表达式返回结果大于0,说明s4大于s5,字符在字典中顺序事实上就它的Unicode编码,先比较两个字符串的第一个字符j和S,j的Unicode编码是106,S的Unicode编码是83,所以可以得出结论s4 > s5。
1.1.5 字符串截取
方法 | 返回值 |
---|---|
String substring(int beginIndex) | 从指定索引beginIndex开始截取一直到字符串结束的子字符串。 |
String substring(int beginIndex, int endIndex) | 从指定索引beginIndex开始截取直到索引endIndex -1处的字符,注意包括索引为beginIndex处的字符,但不包括索引为endIndex处的字符 |
String sourceStr = "There is a string accessing example.";
// 截取example.子字符串
String subStr1 = sourceStr.substring(28); ①
// 截取string子字符串
String subStr2 = sourceStr.substring(11, 17); ②
System.out.printf("subStr1 = %s%n", subStr1);
System.out.printf("subStr2 = %s%n",subStr2);
// 使用split方法分割字符串
System.out.println("-----使用split方法-----");
String[] array = sourceStr.split(" "); ③
for (String str : array) {
System.out.println(str);
}
输出结果:
subStr1 = example.
subStr2 = string
-----使用split方法-----
There
is
a string
accessing
example.
1.2 可变字符串
可变字符串在追加、删除、修改、插入和拼接等操作不会产生新的对象。Java提供了两个可变字符串类StringBuffer和StringBuilder,中文翻译为“字符串缓冲区”。
StringBuffer和StringBuilder具有完全相同的API,即构造方法和普通方法等内容一样。StringBuilder的中构造方法有4个:
同样适合于StringBuffer类
构造方法 | 描述 |
---|---|
StringBuilder() | 创建字符串内容是空的.StringBuilder对象,初始容量默认为16个字符。 |
StringBuilder(CharSequence seq) | 指定CharSequence字符串创建StringBuilder对象。CharSequence接口类型,它的实现类有:String、StringBuffer和StringBuilder等,所以参数seq可以是String、StringBuffer和StringBuilder等类型。 |
StringBuilder(int capacity) | 创建字符串内容是空的StringBuilder对象,初始容量由参数capacity指定的。 |
StringBuilder(String str) | 指定String字符串创建StringBuilder对象。 |
提示:
字符串长度和字符串缓冲区容量区别。字符串长度是指在字符串缓冲区中目前所包含字符串长度,通过length()获得;字符串缓冲区容量是缓冲区中所能容纳的最大字符数,通过capacity()获得。当所容纳的字符超过这个长度时,字符串缓冲区自动扩充容量,但这是以牺牲性能为代价的扩容。
字符串追加——append
//添加字符串、字符
StringBuilder sbuilder1 = new StringBuilder("Hello");
sbuilder1.append(" ").append("World");
sbuilder1.append('.');
System.out.println(sbuilder1); //Hello World.
StringBuilder sbuilder2 = new StringBuilder();
Object obj = null;
//添加布尔值、转义符和空对象
sbuilder2.append(false).append('\t').append(obj);
System.out.println(sbuilder2); // false null
//添加数值
StringBuilder sbuilder3 = new StringBuilder();
for (int i = 0; i < 10; i++) {
sbuilder3.append(i);
}
System.out.println(sbuilder3); //0123456789
字符串插入、删除、替换
方法 | 描述 |
---|---|
StringBuilder insert(int offset, String str) | 在字符串缓冲区中索引为offset的字符位置之前插入str,insert有很多重载方法,可以插入任何类型数据。 |
StringBuffer delete(int start, int end) | 在字符串缓冲区中删除子字符串,要删除的子字符串从指定索引start开始直到索引end - 1处的字符。start和end两个参数与substring(int beginIndex, intendIndex)方法中的两个参数含义一样。 |
StringBuffer replace(int start, int end, String str) | 字符串缓冲区中用str替换子字符串,子字符串从指定索引start开始直到索引end - 1处的字符。start和end同delete(int start, int end)方法。 |
// 原始不可变字符串
String str1 = "Java C";
// 从不可变的字符创建可变字符串对象
StringBuilder mstr = new StringBuilder(str1);
// 插入字符串
mstr.insert(4, " C++");
System.out.println(mstr); // Jave C++ C
// 具有追加效果的插入字符串
mstr.insert(mstr.length(), " Objective-C");
System.out.println(mstr); //Java C++ C Objective-C
// 追加字符串
mstr.append(" and Swift");
System.out.println(mstr);//Java C++ C Objective-C and Swift
// 删除字符串
mstr.delete(11, 23);
System.out.println(mstr); //Java C++ C and Swift