-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
字符串以及字符串缓冲区
String字符串:★★★
java中用String类进行描述。对字符串进行了对象的封装。这样的好处是可以对字符串这种常见数据进行方便的操作。对象封装后,可以定义N多属性和行为。
如何定义字符串对象呢?String s = "abc";只要是双引号引起的数据都是字符串对象。
特点:字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中。
------------------------------------------------------
String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容中有两个对象abc、new 。
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true ,字符串中equals比较的是字符串内容是否相同。
-------------------------------------------------------
字符串的方法:
1:构造方法:将字节数组或者字符数组转成字符串。
String s1 = new String();//创建了一个空内容的字符串。
String s2 = null;//s2没有任何对象指向,是一个null常量值。
String s3 = "";//s3指向一个具体的字符串对象,只不过这个字符串中没有内容。
//一般在定义字符串时,不用new。
String s4 = new String("abc");
String s5 = "abc"; 一般用此写法
new String(char[]);//将字符数组转成字符串。
new String(char[],offset,count);//将字符数组中的一部分转成字符串。
2:一般方法:
按照面向对象的思想:
2.1 获取:
2.1.1:获取字符串的长度。length();
2.1.2:指定位置的字符。char charAt(int index);
2.1.3:获取指定字符的位置。如果不存在返回-1,所以可以通过返回值-1来判断某一个字符不存在的情况。
int indexOf(int ch);//返回第一次找到的字符角标
int indexOf(int ch,int fromIndex); //返回从指定位置开始第一次找到的角标
int indexOf(String str); //返回第一次找到的字符串角标
int indexOf(String str,int fromIndex);
int lastIndexOf(int ch);
int lastIndexOf(int ch,int fromIndex);
int lastIndexOf(String str);
int lastIndexOf(String str,int fromIndex);
2.1.4:获取子串。
String substring(int start);//从start位开始,到length()-1为止.
String substring(int start,int end);//从start开始到end为止。//包含start位,不包含end位。
substring(0,str.length());//获取整串
2.2 判断:
2.2.1:字符串中包含指定的字符串吗?
boolean contains(String substring);
2.2.2:字符串是否以指定字符串开头啊?
boolean startsWith(string);
2.2.3:字符串是否以指定字符串结尾啊?
boolean endsWith(string);
2.2.4:判断字符串是否相同
boolean equals(string);//覆盖了Object中的方法,判断字符串内容是否相同。
2.2.5:判断字符串内容是否相同,忽略大小写。
boolean equalsIgnoreCase(string) ;
2.3 转换:
2.3.1:通过构造函数可以将字符数组或者字节数组转成字符串。
2.3.2:可以通过字符串中的静态方法,将字符数组转成字符串。
static String copyValueOf(char[] );
static String copyValueOf(char[],int offset,int count);
static String valueOf(char[]);
static String valueOf(char[],int offset,int count);
2.3.3:将基本数据类型或者对象转成字符串。
static String valueOf(char);
static String valueOf(boolean);
static String valueOf(double);
static String valueOf(float);
static String valueOf(int);
static String valueOf(long);
static String valueOf(Object);
2.3.4:将字符串转成大小写。
String toLowerCase();
String toUpperCase();
2.3.5:将字符串转成数组。
char[] toCharArray();//转成字符数组。
byte[] getBytes();//可以加入编码表。转成字节数组。
2.3.6:将字符串转成字符串数组。切割方法。
String[] split(分割的规则-字符串);
2.3.7:将字符串进行内容替换。注意:修改后变成新字符串,并不是将原字符串直接修改。
String replace(oldChar,newChar);
String replace(oldstring,newstring);
2.3.8: String concat(string); //对字符串进行追加。
String trim();//去除字符串两端的空格
int compareTo();//如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。
例子:
package pack;
// String类时用于描述字符串事物。
// 那么他就提供了多个方法对字符串进行操作。
// 常见的操作有哪些?“abcd”
// 1,获取。
// 1.1:字符串中包含的字符数,也就是字符串的长度。
// int length:获取长度。
// 1.2:根据位置获取位置上的某个字符。
// char charAt(int index);获取某一位置上的字符。
// 1.3:根据字符获取该字符在字符串中的位置。
// int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。
// int indesOf(int ch,int fromIndex);从fromIndex指定位置开始,获取ch在字符串中出现的位置。
// int indexOf(String str);返回的是str在字符串中第一次出现的位置。
// int indesOf(String str,int fromIndex);从fromIndex指定位置开始,获取str在字符串中出现的位置。
//
// int lastIndexOf(int ch);反向索引。
// 2,判断。
// 2.1:字符串中是否包含某一个子串。
// boolean contains(str);判断字符串是否存在,判断字符串是否包含。
// 特殊之处:indexOf(str);可以索引str第一次出现的位置,如果返回-1,表示该str不再字符串中存在。
// 所以,也可以使用对指定判断是否包含。
// if(str.indexOf("aa"!=-1));而且该方法既可以判断,又可以获取出现的位置。
// 2.2:字符串中是否有内容。
// boolean isEmpty();原理就是判断长度是否为0。
// 2.3:字符串是否是以指定内容开头。
// boolean startsWith(str);
// 2.4:字符串是否是以指定内容结尾。
// boolean endsWith(str);
// 2.5:判断字符串内容是否相同。复写了Object类中的equals方法。
// booleam equals(str);
// 2.6:判断内容是否相同,并忽略大小写。
// boolean equalsIgnoreCase();
// 3,转换。
// 3.1:将字符数组转成字符串。
// 构造函数:String(char[])
// String(char[],offset,count):将字符数组中的一部分转成字符串。
// 静态方法:
// static String copyValueOf(char[]);
// static String copyValueOf(char[] data,int offset,int count);
// static String valueOf(char[]);
// 3.2:将字符串转成字符数组。**
// char[] toCharArray();
// 3.3:将字节数组转成字符串。
// String(byte[]);
// String(byte[],offset,count);将字节数组中的一部分转成字符串。
// 3.4:将字符串转成字节数组。
// byte[] getBytes();
// 3.5:将基本数据类型转换成字符串。
// static String valueOf(int);
// static String valueOf(double);
// 3+"";//String.valueOf(3);
// 特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
// 4,替换。
// String replace(dchar,newchar);
// 5,切割。
// String[] split(regex);
// 6,字串。获取字符串中的一部分。
// String substring(begin);
// String substring(begin,end);
// 7,转换,去除空格,比较。
// 7.1:将字符串转成大写或者小写。
// String toUpperCase();
// String toLowerCase();
// 7.2:将字符串两端的多个空格去除。
// String trim();
// 7.3:对两个字符串进行自然顺序的比较。
// int compareTo(string);
class StringMethodDemo{
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args){
}
public static void method_get(){
String s="abcdefg";
sop(s.length());// 打印长度
sop(s.charAt(2));// 根据索引获取字符。
// 当访问到字符串中不存在的角标时,
// 会发生StringIndexOutOfBoundsException:字符串角标越界异常。
sop(s.indexOf("a"));//根据字符获取索引。如果没有找到,返回-1.
sop(s.lastIndexOf("a"));// 反向索引一个字符出现的位置。角标不被反向。所以打印的还是0角标
}
public static void method_is(){
String s="ArrayTool.java";
sop(s.startsWith("Array"));// 判断文件名称是否是Array单词开头。
sop(s.contains("Tool"));// 判断文件名中是否包含Tool。
sop(s.endsWith(".java"));// 判断文件名称是否是.java的文件。
}
public static void method_trans(){
char[] arr={'a','b','c','d','e'};
String s=new String(arr,1,3);// 将字节数组中的一部分转成字符串。
sop("s="+s);
String s1="abcdefg";
char[] chs=s1.toCharArray();// 将字符串转成字节数组。
for(int x=0; x
package pack;
// 1,模拟一个trim方法,去除字符串两端的空格。
// 思路:
// 1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。
// 结尾处判断空格也是如此。
// 2,当开始和结尾都判断到不是空格,就是要获取的字符串。
// 2,将一个字符串进行反转,将字符串中指定部分进行反转,"abcdefg";abfedcg.
// 思路:
// 1,曾静学习过对数组的元素进行反转。
// 2,将字符串变成数组,对数组进行反转。
// 3,将反转后的数组变成字符串。
// 4,只要将或反转的部分的开始和结束为止作为参数传递即可。
class StringTest1{
public static void main(String[] args){
}
// 练习一:去除字符串两端空格。
public static String myTrim(String s){
int start=0,end=s.length()-1;
while(start<=end&&s.charAt(start)==' ')
start++;
while(start<=end&&s.charAt(end)==' ')
end--;
return s.substring(start,end+1);
}
// 练习二:将字符串反转。
// 将字符串变成数组,对数组进行反转,将数组变成字符串。
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()-1);
}
public static void reverse(char[] arr,int x,int y){
for(int start=x,end=y; start
package pack;
// 3,获取一个字符串在另一个字符串中出现的次数。
// “adkkkcdkkefkkskk”
// 思路:
// 1,定义一个计数器。
// 2,获取kk第一次出现的位置。
// 3,从第一次出现的位置后剩余的字符串中继续获取kk出现的位置。
// 每获取一次就计数一次。
// 4,当获取不到时,计数完成。
class StringTest2{
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args){
}
// 方式一。
public static int getSubCount(String s,String key){
int count=0;
int index=0;
while((index=s.indexOf(key))!=-1){
sop(s);
s=s.substring(index+key.length());
count++;
}
return count;
}
// 方式二。
public static int getSubString(String s,String key){
int count=0;
int index=0;
while((index=s.indexOf(key,index))!=-1){
sop(index);
index=index+key.length();
count++;
}
return count;
}
}
package pack;
// 4,获取两个字符串中最大相同子串,第一个动作:将断的哪个串进行长度一次递减的子串打印。
// “abcwerthelloyuiodef”
// “cvhellobnm”
// 思路:
// 1,将短的哪个子串按照长度递减的方式获取到。
// 2,将每获取到的子串去长传中判断是否包含。
// 如果包含,已经找到。
class StringTest3{
public static void main(String[] args){
String s1="abcwerthelloyuiodef";
String s2="cvhellobnm";
System.out.println(getMaxSubString(s1,s2));
}
public static String getMaxSubString(String s1,String s2){
String max="",min="";
max=(s1.length()>s2.length())?s1:s2;
min=(max==min)?s1:s2;
System.out.println(max);
System.out.println(min);
for(int x=0; x
------------------------------------
StringBuffer字符串缓冲区:★★★
构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
特点:
1:可以对字符串内容进行修改。
2:是一个容器。
3:是可变长度的。
4:缓冲区中可以存储任意类型的数据。
5:最终需要变成字符串。
容器通常具备一些固定的方法:
1,添加。
StringBuffer append(data):在缓冲区中追加数据。追加到尾部。
StringBuffer insert(index,data):在指定位置插入数据。
2,删除。
StringBuffer delete(start,end);删除从start至end-1范围的元素
StringBuffer deleteCharAt(index);删除指定位置的元素
//sb.delete(0,sb.length());//清空缓冲区。
3,修改。
StringBuffer replace(start,end,string);将start至end-1替换成string
void setCharAt(index,char);替换指定位置的字符
void setLength(len);将原字符串置为指定长度的字符串
4,查找。(查不到返回-1)
int indexOf(string); 返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(string,int fromIndex);从指定位置开始查找字符串
int lastIndexOf(string); 返回指定子字符串在此字符串中最右边出现处的索引。
int lastIndexOf(string,int fromIndex); 从指定的索引开始反向搜索
5,获取子串。
string substring(start); 返回start到结尾的子串
string substring(start,end); 返回start至end-1的子串
6,反转。
StringBuffer reverse();字符串反转
StringBuilder字符串缓冲区:★★★
JDK1.5出现StringBuiler;构造一个其中不带字符的字符串生成器,初始容量为 16 个字符。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
方法和StringBuffer一样;
StringBuffer 和 StringBuilder 的区别:
StringBuffer线程安全。
StringBuilder线程不安全。
单线程操作,使用StringBuilder 效率高。
多线程操作,使用StringBuffer 安全。
//想要使用缓冲区,先要建立对象。
StringBuffer sb = new StringBuffer();
sb.append(12).append("haha");//方法调用链。
String s = "abc"+4+'q';
s = new StringBuffer().append("abc").append(4).append('q').toString();
t-size:10.5000pt; mso-font-kerning:1.0000pt; " >
单线程操作,使用StringBuilder 效率高。
多线程操作,使用StringBuffer 安全。
练习:
package pack;
// StringBuffer是字符串缓冲区,是一个容器。特点:
// 1,而且长度是可变化的。
// 2,可以直接操作多个数据类型。
// 3,最终会通过toString方法变成字符串
// c create U update Rread Ddelete
// 1,存储。
// StringBuffer append();将指定数据作为参数添加到已有数据的结尾处。
// StringBuffer insert(index,数据);可以将数据插入到指定index位置。
// 2,删除。
// StringBuffer delete(start,end);删除缓冲区中的数据,包含start,不包含end。
// StringBuffer deleteCharAt(index);删除指定位置的字符。
// 3,获取。
// char charAt(int index);
// int indexOf(String str);
// int laseIndexOf(String str);
// int length();
// String substring(int start,int end);
// 4,修改。
// StringBuffer replace(start,end,string);
// void setCharAt(int index,char ch);
// 5,反转。
// StringBuffer reverse();
// 6,缓冲区中指定数据存在到指定数组中。
// void getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)
// 在JDK1.5版本之后出现了StringBuilder
// 不同在于:StringBuffer是线程同步。
// StringBuilder是线程不同步。
// 以后开发,建议使用StringBuilder。
// 升级三个因素:1,提高效率。2,简化书写。3,提高安全性。
class StringBufferDemo{
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args){
}
public static void method_add(){
StringBuffer sb=new StringBuffer();
sb.append("abc");sb.append(123);sb.append(true);
StringBuffer sb1=sb.append(123);
sop("sb: "+sb);sop("sb1: "+sb1);
sb.insert(1,"qq");
sop(sb.toString());
sop(sb1.toString());
}
public static void method_delete(){
StringBuffer sb=new StringBuffer("abcdefg");
sb.delete(1,3);
sb.delete(0,sb.length());
sb.delete(2,3);sb.deleteCharAt(2);
sop(sb.toString());
}
public static void method_udapter(){
StringBuffer sb=new StringBuffer("abcdefg");
sb.replace(1,3,"java");
sb.setCharAt(2,'K');
sop(sb.toString());
}
public static void getChars(){
StringBuffer sb=new StringBuffer("abcdefg");
char[] chs=new char[4];
sb.getChars(1,4,chs,1);
for(int x=0; x