String、StringBuilder、StringBuffer的方法详解和三者的区别与联系(2)

上次我们介绍完了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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值