String是一个特殊的对象,在计算机里是很重要的角色,很多都是以String的形式存储在计算机里。
对字符串基本的操作有:
1、获取:
A、获取长度:int length();
B、根据角标获取元素:char charAt(int index);
C、根据元素获取角标:
int indexOf(char ch);
int indexOf(char ch,int fromIndex);
int lastIndexOf(char ch)
int indexOf(String str);
int indexOf(String str,int fromIndex);
2、判断:
A、字符串是否包含某一子串:boolean contains(CharSequence s);
B、是否有内容:boolean isEmpty();
C、是否以某字符串开头:boolean startsWith(String str);
D、是否以某字符串结尾:boolean endsWith(String str);
E、判断两个字符串的内容是否相同:boolean equals(String str);
F、忽略大小写比较:hboolean equalsIgnoreCase(String str) ;
3、转换:
A、字符串转换成字符数组:char[] toCharArray();
B、字符数组转换字符串:new String(char[] chs); static String copyValueOf(char[] chs); 可以只转部分,需要提供角标和位数。
C、字符串转换字节数组:byte[] getBytes(Charset charset);
D、字节数组转字符串:new String(byte[] bts,Charset charset);
注:charset参数可以省略,省略是按照每人编码表。
4、替换:
String replace(char oldChar,char newChar) ,若要替换的字符不存在,则返回原串。
5、切割:
String[] split(String regex); 如:string[] str = s.split(“,”);
6、获取子串:
String substring(int beginIndex);String substring(int beginIndex,int endIndex);
7、转换、去除空格、比较:
A、将字符串转换成大写或小写:String toUpperCase();String toLowerCase();
B、将字符串两端的多个空格去除:String trim();
C、将字符串进行自然顺序的比较,不区分大小写:int compareTo(String str);
StringBuffer:字符串缓冲区,是一个容器,长度可变,可直接操作多个数据类型(不支持byte和short),最终会通过toString的方法变成字符串。数组也是一个容器,长度固定的,操作的数据类型是在定义数组的时候就确定的。StringBuffer的基本操作(增、删、改、查):
1、存储:
A、StringBuffer append(数据类型 变量);数据类型不能为byte和short;
B、StringBuffer insert(int offset,数据类型 变量);
2、删除:
StringBuffer delete(int start,int end)
3、修改:
A、StringBuffer replace(int start,int end,String str)
B、StringBuffer setCharAt(int index,char ch);将指定角标处的字符更改为ch;
4、获取:
A、char charAt(int index):获取指定角标处的字符;
B、int indexOf(String str):获取第一次出现指定字符串的位置;
int lastIndexOf(String str):获取最后一次出现指定字符的位置;
C、int indexOf(String str,int fromIndex):从指定角标开始,返回第一次出现指定字符串的角标;
D、int length():获取StringBuffer的长度;
E、String subString(int start,int end):获取子串。
5、反转:
StringBuffer reverse();
6、将StringBuffer中指定的数据复制到字符数组中:
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
Jdk1.5之后出现了StringBuilder,两者的区别是StringBuffer是同步的,StringBuilder是不同步的。StringBuilder的效率高于StringBuffer,在多线程中StringBuilder的安全性低。
字符串的相应练习代码:
/*
1、去除字符串两端的空格;
2、将字符串进行反转;
3、获取一个字符串在另一个字符串中出现的次数;"kk"
4、获取两个字符串中最大相同子串。
" abkkcwkkerkkthellokkykkuiokkdefkkkk "
"cvhellobnm"
"kk"
分析:1、去除前端空格的方法:先判断第一位是否为空,若是,从第二位开始取子串,再判断,
再取子串,直至第一位不空为止;去除后端空格的方法:先判断最后一位是否为空,
如是,去子串:第一位到倒数第二位,再判断,再取子串,直至倒数第一位不为空
为止;
2、StringBuffer有反转输出的功能,String没有,当然也可以先把字符串存储到StringBuffer
中,再将其反转输出。这里我用的方法是:通过char[] toCharArray()将字符串转变为
字符数组,字符数组反转之后,通过new String(char[] chs)方法将字符数组转换为字符串
输出。
3、获取一个字符串(s1)在另一个字符串(s2)出现的次数:先判断s2中是否包含s1,如果包含,
从s1在s2中出现的第一角标加上s1的长度的位置开始取子串,并且计数器加1,再判断,再
取子串,直至s2不包含s1为止。
4、获取两个字符串最大的相同子串。先判断长的字符串是否包含短的字符串,如果不包含,
将短的字符串去掉一位,再判断长的字符串是否包含短的字符串,如果不包含,将短的
字符串去掉两位,再判断,依次类推,如果短的字符串的长度为0,还是长的字符串还是
不包含短的字符串,那说明这两个字符串没有共同的元素。
*/
class StringTest
{
public static void main(String[] args)
{
String s1 = " abkkcwkkerkkthellokkykkuiokkdefkkkk ";
String s2 = "cvhellobnm";
//去除字符串两端空格的方法
System.out.println("练习1:---------------------------------------------------------");
String s = myTrim(s1);
//将字符串反转输出
System.out.println("练习2:---------------------------------------------------------");
myReverse(s);
//获取一个字符串在另一个字符串中出现的次数
System.out.println("练习3:---------------------------------------------------------");
int count = myCount(s,"kk");
System.out.println("字符串“kk”在字符串s中出现的次数为:"+count);
//获取两个字符串的最大相同子串
System.out.println("练习4:---------------------------------------------------------");
mySubstring(s,s2);
}
//去除字符串两端空格
public static String myTrim(String s)
{
System.out.println("原来的字符串:"+s);
System.out.println("原来字符串长度:"+s.length());
//去除前端空格
for(int i=0;i<s.length();i++)
{
//如果字符串的第一位为空格,则取子串,继续循环判断子串中的第一位是否为空
if(s.charAt(i) == ' ')
s = s.substring(i+1,s.length());
//如果第一位不为空,则循环结束
else
break;
}
System.out.println("去除前端的空格后的字符串:"+s);
System.out.println("去除字符串前端空格后的字符串长度:"+s.length());
//去除后端空格
for(int i=s.length()-1;i>0;i--)
{
//如果字符串的最后一位为空,则取子串,继续循环判断字符串中的最后一位是否为空
if(s.charAt(i) == ' ')
s = s.substring(0,i);
//如果字符串的最后一位不为空,则退出循环
else
break;
}
System.out.println("去除字符串后端空格的字符串:"+s);
System.out.println("去除字符串后端空格的字符串长度:"+s.length());
return s;
}
//将字符串反转输出
public static void myReverse(String s)
{
System.out.println("原来的字符串:"+s);
//定义一个中间变量,便于交换字符位置
char temp = ' ';
//将字符串转换成字符数组
char[] chs = s.toCharArray();
//将字符数组反转
for(int i=0;i<s.length()/2;i++)
{
temp = chs[i];
chs[i] = chs[s.length()-1-i];
chs[s.length()-1-i] = temp;
}
//将反转后的字符数组转换成字符串并打印
System.out.println("反转后的字符串:"+new String(chs));
}
//获取一个字符串在另一个字符串中出现的次数
public static int myCount(String s,String key)
{
//定义一个计数器
int count = 0;
while(true)
{
//如果字符串中包含字符串key,计数器加1,,取子串,继续判断
if(s.contains(key))
{
count++;
s = s.substring(s.indexOf(key)+key.length(),s.length());
}
//如果不包含,则计数结束,退出循环
else
break;
}
return count;
}
//获取两个字符串的最大相同子串
public static void mySubstring(String s1,String s2)
{
//定义两个变量分别存放大、小字符串
String max = "";
String min = "";
//判断两个字符串的长短并赋值给相应的变量
max = s1.length() > s2.length()?s1:s2;
min = s1.length() < max.length()?s1:s2;
//System.out.println(max+"::"+min);
//定义一个变量来存储两个字符串的最大子串
String submax = "";
/*获取最大子串:外循环控制最短字符串的最少子串数;内循环控制最短字符串的所有子串;
取子串所需的角标跟外循环无关。
*/
for(int i=0;i<min.length();i++)
{
for(int j=min.length()-i,k=0;j>k && j<min.length()+1;j++,k++)
{
String temp = min.substring(k,j);
//System.out.println(temp);
//如果长字符串包含短字符串的子串,则结束循环,并将该子串赋值为submax
if(max.contains(temp))
{
submax = temp;
break;
}
}
//如果submax不为空,说明已找到最大相同子串,结束外循环
if(!submax.isEmpty())
break;
}
//根据submax是否为空,来判断是否找到最大相同子串
if(!submax.isEmpty())
System.out.println("这两字符串的最大相同子串为:"+submax);
else
System.out.println("这两个字符串没有相同的字符!");
}
}