字符串对于大多数的编程语言来说,是一个绕不过的话题,当然,Java也不例外。Java提供了三个类来支持字符串,分别为:String、StringBuffer和StringBuilder。其中,String是不可变字符串,而StringBuffer和StringBuilder是可变字符串。只不过StringBuffer是线程安全的字符串类,而StringBuilder不是线程安全的字符串类。
String类是一个不可变的字符串类。也就是说,一个字符串对象一旦被创建,其字符序列便不可以被改变。
对于字符串String来说,常用的方法有:
- 重写Object的hashCode和equals方法
对于String来说,重写了继承自Object类的hashCode和equals方法,从而使得值相同的两个字符串,调用equals时返回true,调用hashCode方法时得到的结果一样。
Object和equals的示例代码如下所示:
public class StringTest {
public static void main(String[] args) {
// equals方法测试
String str = "hello world";
String str2 = "hello world";
System.out.println("str和str2执行equals方法结果:" + str.equals(str2));
// hashCode方法测试
System.out.println("str的hashCode结果为:" + str.hashCode());
System.out.println("str2的hashCode结果为:" + str2.hashCode());
}
}
执行结果如下图所示:
- 取子字符串
取字符串有两个方法,分别为:
- String substring(int beginIndex) :该方法从beginIndex开始,截取到最后一个字符结束的子字符串。
- substring(int beginIndex, int endIndex):该方法从beginIndex开始,截取到endIndex处不包括endIndex的子字符串。
两个方法的示例代码如下所示:
public class StringTest {
public static void main(String[] args) {
String str = "hello world";
// 索引从0开始,索引为6对应第7个字符,因此结果是world
System.out.println(str.substring(6));
/*
索引从0开始,索引6对应第7个字符,索引8代表第9个字符,取第7个到第9个不包括第9个字符,
结果为wo
*/
System.out.println(str.substring(6, 8));
}
}
执行结果如下图所示:
- 字符串使用空格缩径()
使用空格缩径的方法为:indent方法。接受参数是一个整数,表示缩径多少位。示例代码如下所示:
public class StringTest {
public static void main(String[] args) {
String str = "hello world";
System.out.println("str为:\n" + str);
System.out.println("str缩径4个空格为:\n" + str.indent(4));
}
}
执行结果如下图所示:
- 获取某个字符或某个子字符串在字符串的位置
获取某个字符或某个子字符串在字符串的位置的方法有四个,分别为:
- int indexOf(int ch):获取某个字符在字符串中首次出现的位置,这里之所以是ch类型,是因为所有字符类型在内存中是以Unicode编码的形式存在。而且本人使用JDK过高,也许之前的版本保留有indexOf(char ch)的方法。所以大家要区别对待。
- int indexOf(int ch, int fromIndex):从fromIndex处开始,获取某个字符在字符串中首次出现的位置。
- int indexOf(String str):获取某个子字符串在该字符串中首次出现的位置。
- int indexOf(String str, int fromIndex):从fromIndex处开始,获取某个子字符串在该字符串中首次出现的位置。
- int lastIndexOf(int ch): 获取某个字符在字符串中最后出现的位值。
- int lastIndexOf(int ch, int fromIndex):从fromIndex处开始,获取某个字符在该字符串中最后出现的位置。
- int lastIndexOf(String str):获取某个子字符串在该字符串中最后出现的位置。
- int lastIndexOf(String str, int fromIndex):从fromIndex处开始,获取某个子字符串在该字符串中最后出现的位置。
示例代码如下图所示:
public class StringTest {
public static void main(String[] args) {
String str = "how old are you";
System.out.println("str的值为:" + str);
System.out.println("'o'在str中首次出现位置为:" + str.indexOf('o'));
System.out.println("'o'在str中从2之后开始首次出现的位置为:" + str.indexOf('o', 2));
System.out.println("'o'在str中最后出现的位置为:" + str.lastIndexOf('o'));
System.out.println("'o'在str中从6往前最后出现的位置为:" + str.lastIndexOf('o', 6));
String str2 = "no zuo no die no say no bibi";
System.out.println("str2的值为:" + str2);
System.out.println("\"no\"在str2中首次出现的位置为:" + str2.indexOf("no"));
System.out.println("\"no\"在str2从1开始之后首次出现的位置为:" + str2.indexOf("no", 1));
System.out.println("\"no\"在str2中最后出现的位置为:" + str2.lastIndexOf("no"));
System.out.println("\"no\"在str2中从16往前最后出现的位置为:" + str2.lastIndexOf("no", 16));
}
}
执行结果如下图所示:
- 以某个字符串开始或结束
以某个字符串开始或结束的方法有三个,分别为:
- boolean startWith(String prefix):该方法表示该字符串是否以某个给定的字符串prefix开始。
- boolean startWith(String prefix, int toffset):该方法将该字符串偏移toffset位后,是否以某个给定的字符串prefix开始。
- boolean endWith(String suffix):该方法表示该字符串是否以某个给定的字符串suffix结尾。
示例代码如下图所示:
public class StringTest {
public static void main(String[] args) {
String str = "how are you, no zuo no die";
System.out.println("str是否以how开始:" + str.startsWith("how"));
System.out.println("str偏移4位后是否以are开始:" + str.startsWith("are", 4));
System.out.println("str是否以die结尾:" + str.endsWith("die"));
}
}
执行结果如下图所示:
- 大小写转换
大小写转换的方法有:
String toLowerCase():将字符串全部转换为小写字母,仅字母受影响,使用当前系统的语言环境
String toLowerCase(Locale locale):将字符串全部转换为小写,仅字母受影响,使用传入的语言环境。
String toUpperCase():将字符串全部转换为大写,仅字母受影响,使用当前系统的语言环境
String toUpperCase(Locale locale): 将字符串全部转换为大写,仅字母受影响, 使用传入的语言环境。
我想大家一定对toLowerCase(Locale locale)和ttoUpperCase(Locale locale)这两个方法有所疑惑。刚开始我也一样,在网上找了很久,才明白,实际上对有些国家来说,英文字母的大小写不见得跟我们认知的一样。典型的就是土耳其。比如"I"转换为小写后为“ı”,"i"转换为大写为“İ”。所以当系统环境默认为土耳其语言环境时,使用大小转换所得到的结果就未必如我们所料了。
示例代码如下所示:
public class StringTest {
public static void main(String[] args) throws IOException {
String str = "I like him";
Locale trLocale = new Locale("tr");
// 使用默认的语言环境转换大小写
System.out.println("str在默认语言环境下(zh_CN)转换为大写为:" + str.toUpperCase());
System.out.println("str在默认语言环境下(zh_CN)转换为小写为:" + str.toLowerCase());
// 使用土耳其语言环境转换大小写
System.out.println("str在土耳其语言环境下(tr)转换为小写为:" + str.toLowerCase(trLocale));
System.out.println("str在土耳其语言环境下(tr)转换为小写为:" + str.toUpperCase(trLocale));
}
}
执行结果如下图所示:
- 字符替换
字符替换的方法有:
- String replace(char oldChar, char newChar):用新字符替换字符串中的所有旧字符。
- String replace(CharSequence target, CharSequence replacement):用字符串中的target字符串全部替换为replacement字符串。需要注意的是,这里的字符串是广义的字符串。包括:String,StringBuffer和StringBuilder。
- String replaceAll(String regex, String replacement): 用新字符串替换匹配正则表达式的所有字符串。
- String replaceFirst(String regex, String replacement): 用新字符串替换首个匹配正则表达式的字符串。
示例代码如下图所示:
public class StringTest {
public static void main(String[] args) throws IOException {
String str = "no zuo no die";
System.out.println("str中'n'替换成'好'的结果为:" + str.replace('n', '好'));
System.out.println("str中的\"no\"替换为\"不\"的结果为:" + str.replace("no", new StringBuilder("不")));
String str2 = "tom2jerry4happy8";
System.out.println("str2中的数字全部替换为\"数字\"的结果为:" + str2.replaceAll("\\d", "数字"));
System.out.println("str2中的首个数字替换为\"数字\"的结果为:" + str2.replaceFirst("\\d", "数字"));
}
}
执行结果如下图所示:
- 字符串切分
字符串切分有两个方法,分别为:
- String[] split(String regex):根据指定的正则表达式来切分字符串
- String[] split(String regex, int limit):根据指定的正则表达式来切分字符串,切分结果限定为limit个。
示例代码如下所示:
public class StringTest {
public static void main(String[] args) throws IOException {
String str = "tom2jerry4hehe8oh";
System.out.println("str以数字分割后结果为:" + Arrays.toString(str.split("\\d")));
System.out.println("str以数字分割为三个数组的结果为:"
+ Arrays.toString(str.split("\\d", 3)));
}
}
示例代码如下图所示:
- 其他
除了以上列举的方法外,还有一些常用的方法:
- int length(): 获取字符串的长度
- boolean equalsIgnoreCase(String anotherString): 比较是否与另一个字符串相等,忽略大小写。
- char charAt(int index): 获取指定索引处的字符
- boolean matches(String regex):判断该字符串是否可以匹配指定的字符串。
- char[] toCharArray():将该字符串转换为字符串数组。
- String trim():截取两端的空格。
示例代码如下所示:
public class StringTest {
public static void main(String[] args) throws IOException {
String str = " hello world ";
System.out.println("str的长度为:" + str.length());
String str2 = " Hello World ";
System.out.println("str是否与str2在忽略大小写情况下相等:" + str.equalsIgnoreCase(str2));
System.out.println("str索引为4处的字符为:" + str.charAt(5));
System.out.println("str是否匹配正则表达式\" hello [\\w]* \":" + str.matches(" hello [\\w]* "));
System.out.println("str转换为字符数组为:" + Arrays.toString(str.toCharArray()));
System.out.println("str截取两侧的空格后结果为:" + str.trim());
}
}
执行结果如下图所示:
自此关于字符串String的介绍便已经完毕。