上次我们介绍完了String类的构造方法,这次我们从String类的成员方法开始介绍。
在介绍之前,我们先总结一下String的不可修改性。
我们在上一篇也说过,我们所有的String对象都是指向常量池的。而常量是不可以发生改变的。即便是:
public static void main(String[] args) {
String s = "abcdefg";
System.out.println(s);
s += "aaaaa";
System.out.println(s);
}
abcdefg
abcdefgaaaaa
虽然这里看起来是发生了变化,但是其实是,再进行+后,在常量池中重新创建了“abcdefgaaaaa”的常量,而原来的s又重新指向了这个常量,所以,其实之前的abcdefg并没有发生变化。
public static void main(String[] args) {
String s = "abcdefg";
System.out.println(s);
System.out.println(s.hashCode());
s += "aaaaa";
System.out.println(s);
System.out.println("abcdefg".hashCode());
}
abcdefg
-1206291356
abcdefgaaaaa
-1206291356
所以我们得出:常量池中的常量不变,那么所有内容和这个常量一样的字符串,都是一样的指向这个字符串,String对象的指向可以变,但是这个常量一直不回变。
String类的成员方法
我们把String类的成员方法大致分为这么几类:
判断功能的方法
- equals(Object obj):判断调用者和参数对象描述的字符串内容是否相同
- equalsIgnoreCase(String otherStr):忽略大小写判断两个字符串内容是否相同
- contains(String str):判断调用者是否包含了str这个子串
- startsWith(String prefix):判断调用者是否以prefix开头
- endsWith(String suffix):判断调用者是否以suffix结尾
- isEmpty():判断调用者是否是空串
代码示例:
//equals方法
public static void main(String[] args) {
String str1 = "abccc";
String str2 = "abcccd";
System.out.println(str1.equals(str2));
String str3 = "好吃的都给你";
String str4 = "好吃的都给你";
System.out.println(str3.equals(str4));
}
false
true
//equalsIgnoreCase()方法
public static void main(String[] args) {
String str1 = "aBccc";
String str2 = "AbCCC";
System.out.println(str1.equalsIgnoreCase(str2));
}
true
//contains()方法
public static void main(String[] args) {
String str1 = "aBcccddefggg";
String str2 = "ccc";
System.out.println(str1.contains(str2));
}
true
//startsWith方法
public static void main(String[] args) {
String str1 = "aBcccddefggg";
String str2 = "aBc";
System.out.println(str1.startsWith(str2));
}
true
//endsWith()方法
public static void main(String[] args) {
String str1 = "aBcccddefggg";
String str2 = "ggg";
System.out.println(str1.endsWith(str2));
}
true
获取功能的方法
- length():获取字符串字符的个数
- charAt(int index):返回调用者字符串中索引为index的字符(和length方法结合之后可以遍历字符串)substring(int beg
- substring(int beginIndex):获取一个字符串,内容是从当前字符串的beginIndex索引开始
- substring(int beginIndex, int endIndex):获取一个指定索引范围的子串
注意事项:1、包含头不包含尾,返回的结果中,不包含endIndex索引指向的字符;2、所有的方法都无法修改字符串对象本身,一般都是返回一个新的字符串对象
indexOf家族:
- indexOf(int ch):返回ch字符在当前调用者字符串中,第一次出现的索引
- indexOf(int ch, int fromIndex):从fromIndex索引开始寻找,找到ch字符在当前字符串中第一次出现的索引
- indexOf(String str):返回的是str这个字符串在调用者字符串中第一次出现的索引
- indexOf(String str, int fromIndex):从fromIndex索引开始寻找,找到str字符串在当前字符串中第一次出现的索引(注意:无论从哪个位置开始找,所有字符的索引都不会变化)
lastIndexOf家族:
和IndexOf基本一样,只不过是从后往前找,所有字符和字符串的索引也都不会发生变化
//length()方法
public static void main(String[] args) {
String str1 = "aBcccddefggg";
System.out.println(str1.length());
}
12
//charAt()方法
public static void main(String[] args) {
String str1 = "aBcccddefggg";
System.out.println(str1.charAt(5));
}
d
//substring()方法
public static void main(String[] args) {
String str1 = "aBcccddefggg";
System.out.println(str1.substring(4));
System.out.println(str1.substring(4, 7));
}
cddefggg
cdd
//indexOf()方法
public static void main(String[] args) {
String str1 = "aBcccddefggg";
System.out.println(str1.indexOf(97));
System.out.println(str1.indexOf(66));
System.out.println(str1.indexOf(99,3));
System.out.println(str1.indexOf("ccc"));
System.out.println(str1.indexOf("ggg", 5));
}
0
1
3
2
9
我们可以看出来,前两个方法中传入的int类型数值都根据ASCII码值进行了转化。
转换功能方法
- byte[] getBytes():将当前字符串,转成字节数组
- char[] toCharArray():将当前的字符串,转成字符数组
- toUpperCase():将当前的字符串,转成全大写形式
- toLowerCase():将当前的字符串,转成全小写形式
- concat(String str):将当前调用者,和参数str进行拼接,返回拼接后的长字符串(不常用,因为更多使用的是运算符+)
valueOf家族:可以将任意数据类型的数据,转换成字符串
//getBytes()方法
public static void main(String[] args) {
byte[] b;
String s = "abcdefg";
b=s.getBytes();
for(byte i:b) {//加强for循环,前面定义一个数组中的子类型的变量,然后:后面是要循环的数组
System.out.println(i);
}
}
97
98
99
100
101
102
103
这里输出的是ASCII码值。
//toCharArray()方法
public static void main(String[] args) {
char[] c;
String s = "abcdefg";
c=s.toCharArray();
for(char i:c) {//加强for循环,前面定义一个数组中的子类型的变量,然后:后面是要循环的数组
System.out.println(i);
}
}
a
b
c
d
e
f
g
//toUpperCase()方法
public static void main(String[] args) {
String s = "abcdefg";
System.out.println(s.toUpperCase());
}
ABCDEFG
//toLowerCase()方法
public static void main(String[] args) {
String s = "abcdefg";
System.out.println(s.toUpperCase().toLowerCase());
}
abcdefg
//concat()方法
public static void main(String[] args) {
String s = "abcdefg";
System.out.println(s.concat("sdfsfsdfsf"));
System.out.println(s+"sdfsfsfdsf");
System.out.println(s);
}
abcdefgsdfsfsdfsf
abcdefgsdfsfsfdsf
abcdefg
从这里可以看出,即便添加也是返回一个新的字符串,原字符串是绝对不会发生改变的。
其他方法
- replace(String oldStr, String newStr):将调用者中的旧串替换成新串
- trim():去掉字符串左右两边的空格、制表符
- split():字符串拆分
//replace()方法
public static void main(String[] args) {
String s = "abcdefg";
System.out.println(s.replace("bcd", "BCD"));
}
aBCDefg
//trim()方法
public static void main(String[] args) {
String s = " abcdefg ";
System.out.println(s);
System.out.println(s.trim());
}
abcdefg
abcdefg
//split()方法
public static void main(String[] args) {
String[] str;
String s = "abacdaefag";
str = s.split("a");
for(String ss:str) {
System.out.print(ss+"#");
}
}
#b#cd#ef#g#
欲知后事如何,请看下回————String、StringBuilder、StringBuffer的方法详解和三者的区别与联系(3)