String类
字符串是一个特殊的对象。
字符串一旦初始化就不可以被改变。
public class StringDemo
{
public static void string(){
String str="abc"; //创建一个对象abc
String ste1=new String("abc");//创建两个对象new String;abc
System.out.println(s==s1);//false
System.out.println(s.equals(s1));
/*
String类中的equals复写Object中equals方法建立了string类自己的判断字符串是否相等的依据。
其实就是比较字符串的内容。
*/
/*
字符串建立存储在常量池中 ,池中没有就建立新的对象,池中存在就直接使用对象的地址值。
*/
}
}
按照面向对象的思想对字符串进行功能分类
"abcd";
1获取
A获取字符串中的字符个数(长度)
int length();
B根据位置获取字符
char charAt(int index);
C根据字符获取在字符串中的第一次出现的位置
int indexOf(String str);
int indexOf(String atr,int fromIxdex);根据字符串获取字符串中第一次出现的位置,String字符串找首字母
int lastIndexOf(String str);
int lastIndexOf(String atr,int fromIxdex);根据字符串获取字符串中最后一次出现的位置
D获取字符串中一部分字符串,也叫字串
String substring(int beginIndex,int endIndex);包含begin,不包含end;
2转换
A将字符串变成字符串数组(字符串的切割)
String[] split(String regex);涉及到正则表达式
B将字符串变成字符数组
char[] toCharArray();
C将字符串变成字节数组
byte[] getBytes();
D将字符便变成字节数组
String toUpperCase();
String toLowerCase();
E将字符串中的内容进行替换
String replace(char oldch,char newch);
String replace(String s1,String s2);
F将字符串两端的空格取出
String trim();
G将字符串进行连接
String concat(String str);将指定字符串连接到此字符串的结尾
将数组转成字符串,字节,字符,字节数组查询本机默认编码表GBK
String(字节数组 byte[] bytes);
String(字节数组 byte[] bytes,开始下标,个数);
字符数组转成字符串,不查询编码表
String(字节数组 char[] ch);
String(字节数组 char[] ch,开始下标,个数);
3判断
A两个字符串内容是否相同
boolean equals(Object obj);
boolean equalsIgnoreCase(String str);忽略大写比较字符串内容
B字符串是否包含指定字符串
boolean contains(String str);
C字符串是否以指定字符串开头,是否以字符串结尾
boolean startsWith(String prefix);
boolean endsWith(String prefix);
D字符串是否有内容
boolean isEmpty();
4比较
int compareTo(String anotherString);按字典顺序比较两个字符串
StringBuffer字符缓冲区
线程安全的可变字符序列。
1长度的可变的
2可以存储不同类型的数据
3最终要转成字符串进行使用
4可以对字符串进行修改
既然是一个容器对象,应该具备什么功能?
1添加
StringBuffer append(date);
StringBuffer insert(index,data);
append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
2删除
StringBuffer delete(start,end)//包含头,不包含尾
StringBuffer deleteCharAt(int index);删除指定位置的元素
3查找
char charAt(index);返回此序列中指定索引处的 char 值。
int indexOf(string);返回第一次出现的指定子字符串在该字符串中的索引。
int lastIndexOf(string);
4修改
StringBuffer repalce(start,end,string);使用给定 String 中的字符替换此序列的子字符串中的字符,将指定的 String 插入 start.
void setCharAt(index,char); 将给定索引处的字符设置为 ch。
增删改查C(create)U(update)R(repalce)D(delete);
}
}
jdk1.5后出现了功能和StringBuffer一模一样的对象。就是StringBuildeer
不同的是:Stringbuffer是线程同步的,通常用于多线程。
Stringbuilder是线程不同步的,通常用于单线程,它的出现提高效率
public class Test
{
//一个子串在整串中出现的次数。
public static void main(String[[] args){
String str="nbaernbatnbaynbauinbaopnba";
String key= "nba";
int count=getKeyStringCount_1(str,key);
System.out.println(count);
}
public static int getKeyStringCount_1(String str,String key){
//定义计数器
int count=0;
//定义变量记录key出现的位置
int index=0;
while ((index=str.indexOf(key))!=-1){
/*indexOf(String str);返回指定子字符串在此字符串中第一次出现处的索引。
当为-1时,如果它不作为一个子字符串出现,则返回 -1。*/
str=str.substring(index+key.length());
/*substring(int beginIndex);返回一个新的字符串,它是此字符串的一个子字符串。
循环执行的是index+key.length();每一次循环从key出现位置的下一次开始.*/
count++;
}
return count;
}
}
public class Test2
{
//两个字符串中最大相同的子串
public static void main(String[] args){
String s1="qwerabcdtyuiop";;
String s2="xcabcdvbn";
String s=getMaxSubString(s1,s2);
System.out.println(s);
}
public static String getMaxSubString(String s1,String s2){
String man=null.min=null;
//定义两个变量获取两个字符串的长度
max=(s1.length()>s2.length())?s1:s2;
min=max.equals(s1)?s2:s1;
System.out.println(max,min);
for (int x=0;x<min.length() ;x++ ){
//为什么x<min.length(),从较小字串开始循环,直到这个字符循环结束来判断是否有相同的子串
for (int a=0,b=min.length()-x;b!=min.length()+1 ; a++,b++){
/*b的初始化变量为min.length()-x(从a++,b--获取一段子串),
substring(int beginIndex,int endIndex)返回一个新字符串,它是此字符串的一个子字符串。
该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。
因此,该子字符串的长度为 endIndex-beginIndex。*/
String sub=min.substring(a,b);
if (max.contains(sub){
return sub;
}
}
return null;
}
}
} |
|