黑马程序员-String-StringBuffer-StringBuilder

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

字符串是一种特殊的对象

public final class String

一旦初始化成功,就不可能被改变了。其放置在常量池中。

 

特点:

一、

String str = “abc”

str是一个类类型变量,“abc”是一个对象。

 

二、

1. String str1 = new String(“abc”); 调用了构造方法:String(String original)

这种方式生成了两个字符串对象:

① 括号中,双引号里面的是一个。

② new关键字,使用构造方法又生成一个。

2. String str2 = “abc”;

这种方式值生成了一个String对象。

 

三、

1. str1 == str2

比较的两个字符串对象在内存中的地址。

2. str1.equals(str2)

String重写了equals方法, 不同于Object中的equals方法,其比较的是字符串的内容。

 

四、

str = “first”;

str = “second”

如果使用输出语句的话,str指向的值是second,但这两条语句在内存的常量池中,实际生成了两个String对象,只是str变量从指向first,转换到指向second

 

l String str1 = "abc";

引号内包含对象是String类特有创建对象的方式,但是==返回的结果为true,因为JVM内,存在字符串池,其中保存着很多String对象,并且可以被共享使用,这样可以提高效率。

*结论:

1.使用String str = “abc”; 的格式定义类的时候,未必创建了String类的对象,因为编译器先会在栈中找是否存在地址指向”abc”字符串的引用变量。所以可以肯定的是,此语句一定创建了一个指向String对象”abc”的引用变量。

 

l String str2 = new String("abc");

new 出来的String对象,是不放入到字符串池内的。

*结论:

1.传递进来的就是String类型,所以用这种构造器共创建了两个对象。

2.String str = new String(“abc”) 的方式,无论堆内存里是否存在”abc”,都会在堆内创建新对象。这样增加了JVM的负担。

方法:

1. 获取

1.1 int length()

数组中也有长度,但其length是数组的属性。

1.2 char charAt(int index) :返回字符串某个位置的字符

索引index范围从[ 0 ~ (length-1) ],类似于数组的索引。

异常:IndexOutOfBoundsException,当index为负数或大于字符串的长度时。

1.3 

int indexOf(int ch) :返回某ASCII码对应的字符在字符串中第一次出现的位置。如果不是字符串中的字符,返回-1.

int indexOf(int ch , int fromIndex) :返回指定字符ch从字符串的fromIndex索引处开始,第一次出现的位置。

int indexOf(String str) :返回指定字符串在字符串中第一次出现的位置。如果不是子字符串,则返回-1.

int indexOf(String str , int fromIndex) :返回指定字符串从fromIndex索引处第一次出现的索引。

int lastIndexOf(int ch/String str) :从后向前执行indeOf()相同的工作。

 

2. 判断

2.1 字符串是否包含指定字符串

boolean contains(String str)

对比indexOf(String str)indexOf即可以判断str是否是字符串的子串,又可以判断返回该子串的位置。

异常 :NullPointerException,当strnull时。

2.2 字符串是否为空

boolean isEmpty()

2.3 字符串是否以指定的字符开通

boolean startsWith(String prefix)

boolean startsWith(String prefix , int fromIndex )

2.4 字符串是否以指定的字符结尾

boolean endsWith(String suffix)

2.5 判断字符串的内容是否相等

boolean equals(String str)

2.6 判断字符串的内容并忽略大小写

boolean equalsIgnoreCase(String str)

 

3. 转换

3.1 将字符数组转换成字符串

构造函数:

String(char[] array)

String(char[] array , int offset , count)

静态方法:

String static copyValueOf(char[] array)

String static copyValueOf(char[] array , int offset , count)

3.2 将字符串转成字符数组

char[] toCharArray()

3.3 将字节数组转成字符串

构造方法:

String(bytes[])

String(bytes[] , int offset , int length)

String(bytes[] , Charset c)

String(bytes[] , int offset , int length , Charset c)

注意 :字节数组与字符串之间可以通过不同的字节编码来转换。

3.4 将字符串转换成字节数组

byte[] getBytes()

byte[] getBytes(Charset c)

3.5 将基本数据类型转换成字符串

静态方法:

String static valueOf(boolean b || int i || long l || float f || double d)

String static valueOf(char c || char[] array || char[] array , int offset , int count)

类型提升:

3 + “”;

 

4. 替换

4.1 将字符串中的一个字符替换成新的字符。

String replace(Char oldChar , Char newChar)

如果被替换的字符不存在于字符串中,则返回原字符串。

4.2 将字符中的子串替换成新的字符串

String replace(CharSequence oldSequence , CharSequence newSequence )

 

5. 切割

String[] split(regex);

 

6. 获取子字符串

String substring(int fromIndex):从指定位置开始到结尾

String substring(int fromIndex , int toIndex):从指定开始位置到指定结束位置。

异常:IndexOutOfBoundsException:当fromIndextoIndex超出字符串的长度时。


练习:

返回字符串,或反转字符串的一部分

思路:

1. 将字符串转换成字符数组。

对字符数组反转。

package com.lxh.string;

public class MyReverse {
	/**
	将一个字符串进行反转。将字符串中指定部分进行反转,"abcdefg";abfedcg
	思路:
	1,曾经学习过对数组的元素进行反转。
	2,将字符串变成数组,对数组反转。
	3,将反转后的数组变成字符串。
	4,只要将或反转的部分的开始和结束位置作为参数传递即可。
	 */
	public static void main(String[] args) {
		String str = "abcdefg";
		// 获得字符串的字符数组
		char[] arrays = str.toCharArray();
		System.out.println(reverse(arrays,2,3));
	}
	
	public static String reverse(char[] arrays,int x,int y) {
		for(int start = x,end = y; start < end ; start++,end--)
			swap(arrays,start,end);
		return new String(arrays);
	}
	
	public static String reverse(char[] arrays) {
		return reverse(arrays,0,arrays.length);
	}
	
	public static void swap(char[] arrays,int x,int y) {
		char mid = arrays[x];
		arrays[x] = arrays[y];
		arrays[y] = mid;
	}
	
}


练习:

查找在字符串"abkkfekkfwekkfwefkksefw"中,"kk"出现的次数

思路:indexOf(String str , int fromIndex)既可以判断字符串,又可以返回子串在字符串中的位置。

每当找到一个str时,计数器加一,fromIndex的位置后移str的长度位置。

package com.lxh.string;

public class SubStringCount {

	/**
	 * 查找在字符串"abkkfekkfwekkfwefkksefw"中,"kk"出现的次数
	 * 思路:indexOf(String str , int fromIndex)既可以判断字符串,又可以返回子串在字符串中的位置。
	 * 每当找到一个str时,计数器加一,fromIndex的位置后移str的长度位置。
	 */
	public static void main(String[] args) {
		System.out.println(substringCount("abkkfekkfwekkfwefkksefw","kk"));
	}
	
	public static int substringCount(String str , String key) {
		// 定义一个计数器
		int count = 0;
		int index = 0;
		while((index = str.indexOf(key,index)) != -1) {
			count++;
			index += key.length();
		}
		return count;
	}

}

练习:

tr1 = "abcdefghelloxxxyz"

str2 = "opqhellohijklm"

比较找出str1str2两者之间最大的相同的字符串。

 

思路:给短的字符串设置两个指针变量:begin = 0,end = str2.length()-1。从字符串的最大长度到最小长度递减1

每一次递减后,用段字符串剩余长度来遍历其全部的可能性。

end-0 : 1

end-1 : 2

end-2 : 3

...

到将短字符串遍历到只剩一个字符为止。

双重循环:

外层循环结束标志:end <= 1

内层循环结束标志:end >= str2.length()-1

StringBuffer字符串缓冲区

是一个容器

特点:

1. 长度可以变化。

2. 可以操作多个数据类型

3. 可以通过toString()方法,返回一个字符串。

4. 当内部缓冲区溢出,自动扩容

5. 线程同步,安全,效率相对较低

 

常用方法

① append() boolean, char , char[] , String , int , long, double, float ,Object , StringBuffer

② 在指定位置添加数据。

insert(int index , 数据

异常 :StringIndexOutOfBoundsException

① 删除指定范围的数据

StringBuffer delete(int start , int end) :包含前面,不包含后面。

清空:delete(0 , stringBuffer.length())

② 删除指定索引的字符

StringBuffer deleteCharAt(int index)

StringBuffer replace(int start , int end , String str)

用指定的内容替换指定范围的内容。

setCharAt(int index , Char c)

 

反转

StringBuffer reverse()

 

复制

void getChars(int srcBegin , int srcEnd , char[] array , int index)

将缓冲区的指定范围的数据,复制到指定的字符串中,从指定的位置开始。

 

StringBuilder

是一个容器

特点:

1. 线程不安全,效率相对较高

2. 长度可以变化

3. 可以存储不同的数据

4. 自动扩容


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值