黑马程序员—String、StringBuffer、StringBuilder

------- android培训、java培训、期待与您交流! ----------

String 类
一. String s1 = "abc";//s1是一个类类型变量,"abc"是一个对象
String s2 = new String("abc");
String s3 = "abc";

字符串最大特点就是,一旦被初始化就不可以被更改

s1和s2有什么区别?
s1在内存中有一个对象,s2在内存中有两个对象

System.out.println(s1==s2);// false
System.out.println(s1==s3);// true
System.out.println(s1.equals(s2));// true
String类覆写了Object类中的equals方法,该方法用于判断字符串内同是否相同

二. 常见操作方法
1.  获取
   1.1 长度
int length();
   1.2 根据位置获取位置上某个字符
char charAt(int index);
1.3 根据字符(或字符串)获取该字符(或字符串)在字符串中首次出现的位置
int indexOf(char ch);
int indexOf(char ch, int fromIndex); // 从fromIndex位置开始,获取第一次出现的位置

int indexOf(String str);
int indexOf(String str, int fromIndex); // 从fromIndex位置开始,获取第一次出现的位置
1.4 返回指定字符(或字符串)最后一次出现处的索引
int lastIndexOf(char ch);
int lastIndexOf(char ch, int fromIndex));
int lastIndexOf(String str);
int lastIndexOf(String str, int fromIndex);

eg:
String str = "abcdadbf";
System.out.println(str.length());// 8
System.out.println(str.charAt(4));// a,当访问到字符串中不存在的角标时会发生StringIndexOutOfBoundsException
System.out.println(str.indexOf('a'));// 0,没有找到,返回-1
System.out.println(str.indexOf('a',4));// 4

2. 判断
2.1 字符串中是否包含某一个子串
boolean contains(String str);
注:indexOf(String str)也可判断
2.2 字符串中是否有内容
boolean isEmpty(); // 原理就是判断长度是否为0
2.3 字符串是否以指定内容开头
boolean startWith(str);
2.4 字符串是否以指定内容结尾
boolean endWith(str);
2.5 判断字符串内容是否相同,覆写了Object类中的equals方法
boolean equals(str);
2.6 判断内容是否相同,并忽略大小写
boolean equalsIgnoreCase();

eg:
String str = "ArrayDemo.java";// true
System.out.println(str.startWith("Array"));// true
System.out.println(str.endWith("java"));// true
System.out.println(str.contains("Demo"));// true

3. 转换
3.1 将字符数组转成字符串
构造函数
String(char[]);
String(char[],int offset, int count); // 将字符数组中一部分转成字符串
静态方法
static String copyValueOf(char[]);
static String copyValueOf(char[],int offset, int count);
static String valueOf(char[]);
3.2 将字符串转成字符数组
toCharArray();
3.3 将字节数组转成字符串
String(byte[]);
String(byte[],int offset, int count);
3.4 将字符串转成字节数组
getBytes();
3.5 将基本数据类型转成字符串
static String valueOf(int i);
static String valueOf(double d);

字符串和字节数组在转换过程中,是可以指定编码表的

eg:
char[] arr = {'a','b','c','d','e','f'};
System.out.println(new String(arr));// abcdef
System.out.println(new String(arr,1,3));// bcd

4. 替换
4.1 将指定字符串中的oldChar字符全部替换成newChar
String replace(char oldChar, char newChar);// 如果要替换的字符不存在,返回的是原字符串

replace(CharSequence target, CharSequence replacement);// 字符串替换


replace(String regex, String replacement)// 根据正则表达式替换


replaceFirst(String regex, String replacement)// 替换第一个出现的

5. 切割
String[] split(String regex);// 根据regex切割字符串,放到数组中

6. 子串,获取字符串中的一部分
String substring(int beginIndex, int endIndex);// 从beginIndex位置开始,到endIndex结束,含头不含尾

7. 转换,去空格,比较
7.1 将字符串大小写转换
String toUpperCase();
String toLowerCase();
7.2 将字符串两端的多个空格去掉
String trim();
7.3 对两个字符串进行自然顺序的比较
int compareTo(String str);

三. 关于字符串练习思路
1. 模拟一个trim方法,去除字符串两端的空格
public static String stringTrim(String str){
int start = 0, end = str.length()-1;
while(start<=end && str.charAt(start)=='') start++;
while(start<=end && str.charAt(end)=='') end--;
return str.substring(start,end+1);
}
2. 讲一个字符串进行翻转,将字符串中指定部分进行翻转,如:"abcdefg"->"abcfedcg"
public static String reverseString(String s, int start, int end){
char[] chs = s.toCharArray();
reverse(chs, start, end);
return new String(chs);
}
public static String reverseString(String s){

return reverseString(s,0,s.length());
}
private static void reverse(char[] arr, int x, int y){
for(int start=x,end=y-1;start<end;start++,end--){
swap(arr,start,end);
}
}
private static void swap(char[] arr, int x, int y){
char temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
3. 获取一个字符串在另一个字符串中出现的次数,如:"zbkkcdkkefkkgkk"
第一种:
public static int getSubCount(String str, String key){
int count = 0, index = 0;
while((index=str.indexOf(key))!=-1){
str = str.substring(index+key.length());
count++;
}
return count;
}
第二种:
public static int getSubCount(String str, String key){
int count = 0, index = 0;
while((index=str.indexOf(key,index))!=-1){
index = index+key.length();
count++;
}
return count;
}
4. 获取两个字符串中最大相同子串,第一个动作,将最短的哪个串进行长度依次递减的子串打印
public static String getMaxSubString(String s1, String s2){
String max = "", min = "";
max = (s1.length()>s2.length())?s1:s2;
min = (max==s1)?s2:s1;
for(int x=0;x<s2.length(); x++){
for(int y=0,z=s2.length()-x;z!=s2.length()+1;y++,z++){
String temp = s2.substring(y,z);
if(s1.contains(temp))// 或者if(s1.indexOf(temp)!=-1)
return temp;
}
}
}

StringBuffer
是字符串缓冲区,是一个容器
长度是可变化的
可以直接操作多种数据类型
可以通过toString()转换成字符串
1. 存储
1.1 StringBuffer append();
1.2 StringBuffer insert(index,内容); // 在index位置插入内容
2. 删除
2.1 StringBuffer delete(start,end);// 含头不含尾
2.2 StringBuffer deleteCharAt(Index);// 删除index位置的字符
3. 获取
3.1 char charAt();
3.2 int indexOf();
3.3 int lastIndexOf();
3.4 String substrng(int start, int end);
4. 修改
StringBuffer replace(int start, int end, String str);
void setCharAt(int index, char ch);// 某个位置字符替换成ch
5. 反转
StringBuffer reverse();

6. void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);// 将数据从srcBegin截取到srcEnd,存储到dst数组中,从数组的dstBegin开始存储

StringBuilder
JDK1.5版本之后出现
同StringBuffer功能相同
多线程时也可以用StringBuilder,只需加锁即可

同StringBuffer的区别?
StringBuffer是线程同步的
StringBuilder是线程不同步的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值