------<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,当str为null时。
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:当fromIndex或toIndex超出字符串的长度时。
练习:
返回字符串,或反转字符串的一部分
思路:
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"
比较找出str1和str2两者之间最大的相同的字符串。
思路:给短的字符串设置两个指针变量: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. 自动扩容