黑马程序员_day016_String类和StringBuffer类
2013-03-28 17:11
302 查看
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
一、String类
String类的特点:
1,Java语言中用于描述最常见的字符串数据的对象。
2,字符串数据都是一个对象。
3,字符串数据一旦初始化就不可以被改变了。双引号表示的都是字符串常量。
4,字符串对象都存储在常量池中。 字符串常量池。
String str = "abcd";
String s1 = "abcd";这时在常量池中创建了一个字符串对象。
System.out.println(str==s1);true
String s2 = new String("abcd");这是在堆内存创建一个String类的对象。并在常量池创建了"abcd"对象。
System.out.println(s1==s2);false
对于字符串对象的比较,应该用equals方法完成。
记住,基本数据用==进行比较相同。 对象比较相同都用equals方法。
对象的比较用的是compareTo方法。
System.out.println(s1.equals(s2));String类覆盖了Object中的equals方法,比较的是字符串内容是否相同。
String s3 = "ab"+"cd";
System.out.println(s1==s3);true.
二、String类方法查找的基本思路、练习、综合练习
一旦操作字符串,先找String对象中的方法。没有时在进行自定义,而自定义过程中,往往是多个String方法的组合完成
1、明确所需功能的有无参数 ,返回值类型。另外,若明确了返回值类型,可以这样写 来缩小查找范围
字符串中多少个字符串啊?字符串的长度
int len = str.length();
2、其中一个字符在字符串中的哪个位置上?
indexOf(int ch):ch是char的简写。char根据ACII码转换成数字。
int index = str.indexOf('a');//'a'在字符串中第一次出现的位置。
而lastIndexOf('a');反向索引第一次出现的角标位置。
int index = str.indexOf('a',2);是从字符串2角标位置向后索引'a'第一次出现的位置。
3、具体一个子串在该字符串的哪个位置出现?
字符串是"abcnbacd"
int index2 = str.indexOf("cba");
System.out.println("index2="+index2); 象这样的索引方法
好处一:获取具体的位置。好处二:还可以判断被索引的内容是否存在。通过-1来判断即可。
4、指定位置上的字符是什么?
char ch = str.charAt(8);//StringIndexOutOfBoundsException 访问到字符串中不存在的角标就会发生该异常。
5、能不能获取到字符串中的指定的子串。
结果:string,参数:两个int。索引index。
String sub_str = str.substring(2, 5);包含头角标,不包含尾角标。这是规律。
str.substring(0,str.length());截取整个字符串
6、如何将这个字符串变成大写的字符串呢?
结果:String,参数,无。
String upper_str = str.toUpperCase();都变成了大写
toLowerCase();都变成了小写。
String类中的toString()方法:返回此对象本身(它已经是个字符串)
练习1、将字符串中的指定字符串替换成给定字符串。
replaceAll(String regex ,String replacement):regex:正则表达式
replace(CharSequence target,CharSequence replacement)
String s = str.replace("nba", "haha");
如果要被替换的字符串不存在,结果又是什么?返回原串。
练习2、将字符串变成多个字符(char[]字符数组).
char[] chs = str.toCharArray();//将字符串转成字符数组。
练习3、字符串是否包含指定的子串。以及是否是以指定字符串开头或者结尾。
结果:boolean 参数:string.
boolean b = str.contains("Demo");是否包含
boolean b1 = str.endsWith(".java");是否以指定的字符串结尾
startsWith:是否以指定字符串开头
练习4、将给定的字符串"zhangsan,lisi,wangwu"获取其中每一个人的姓名。意味着获取多个字符串。
结果:String[] 参数:指定的方式。
str = "zhangsan,lisi,wangwu";
String[] names = str.split(",");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
练习5、字符串在书写时往往不注意会在字符串的两端加有空格,找出取出两端空白的方法。 trim
结果:string。参数:无。
str = " ab c ";
str = str.trim();
System.out.println("-"+str+"-");
trim:返回字符串的副本,忽略前导空白和尾部空白。
综合练习1
获取一个子串在字符串中出现的次数。
"nbawernbatyunbaidfnbaghjnba" nba出现了几次
思路:
1,需要对nba在整串中进行查找。
2,如果找到了,记录nba出现的位置,
3,再从这个位置+nba长度的位置开始继续查找剩下的字符串中是否还有nba。
4,通过计数器来记录每次查找的次数
String s1 = "nbawernbatyunbaidfnbaghjnba";
String key = "nba";
int count = getSubCount(s1,key);
System.out.println(key+",count="+count);
public static int getSubCount(String str,String key){
int count = 0;
int index = 0;
while((index = str.indexOf(key,index))!=-1){
index = index + key.length();
count++;
}
return count;
}
综合练习2、
对字符串进行反转。 如:"abcd"-->"dcba";
思路
1,可以将字符串转成数组
2,数组进行反转。(无非就是头尾角标元素的位置置换。)
3,将数组变成字符串。
String s2 = "abcde";
s2 = reverseString(s2);
System.out.println("reverse:"+s2);
public static String reverseString(String str) {
//1,将字符串转成字符数组。
char[] chs = str.toCharArray();
reverseArrary(chs);
return new String(chs);//1、通过构造器将字符数组转成字符串。 构造方式。2、还可以return String.copyValueOf(chs) ,chs即char[]data,这是通过类调用类中的静态方法。静态方式。
}
private static void reverseArrary(char[] chs) {
for (int start = 0,end = chs.length - 1; start < end; start++,end--) {
swap(chs,start,end);
}
}
综合练习3、
对一个字符串中的字符进行字典顺序的排序生成一个有序的字符串。
思路:
1,一看排序,就想到数组。
2,将字符串先转成数组。
3,对数组排个序。
4,将排序的数组变成字符串。
其中Arrays.sort();不仅可以给int型排序还可以给char类型的排序。
综合练习4、
获取两个字符串中最大相同子串。
思路:
1,既然获取的最大子串,找到其中一个比较短的为参照,
去判断大中的是否包含短串。
2,如果不包含,将短的长度按照依次递减的方式获取短串中的子串。
并不断地判断是否在长串中存在,
3,如果存在,视为找到,结束。
/**
* 获取两个字符串中最大相同的子串。
* @param s1
* @param s2
* @return
*/
public static String getMaxSubstring(String s1, String s2) {
String max,min;
max = s1.length()>s2.length()?s1:s2;
min = max.equals(s1)?s2:s1;
// System.out.println("max="+max+",,min="+min);
for(int x=0; x<min.length(); x++){
for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++){
//获取短字符串的子串
String temp = min.substring(y,z);
// System.out.println(temp);
if(max.contains(temp)){//s1.indexOf(temp)!=-1
return temp;
}
}
}
return null;
}
三、字符串缓冲区。StringBuffer
特点:
1,缓冲区就是用来缓存数据,意味着它是一个容器。
2,该容器的长度是可变的。
3,提供了对容器中内容的操作的方法(最多无外乎四种:增删改查.)
4,该缓冲区中可以添加多种类型的元素,基本类型和引用类型。
5,无论怎么样的改变容器中的数据,最终要使用结果,还是必须要将其转成字符串,使用toString方法。
String str = "abc"+4+'c';这句话的实际底层操作其实是:
str = new StringBuffer().append("abc").append(4).append('c').toString();
创建一个字符串缓冲区。StringBuffer sb = new StringBuffer("abcd");
StringBuffer s1 = sb.append(45);
System.out.println(sb==s1);//true,append返回的还是原来的缓冲区。
sb.append(45).append(true).append("abc");//连续添加,调用动作:方法调用链
append():追加:在结尾处添加。
在任意位置添加 insert方法。sb.insert(1, true);
删除内容不是delete就是remove
sb.delete(0,sb.length());//清空缓冲区。
修改内容:sb.replace(1, 3, "ak47");修改(替换)一段内容
字符串反转System.out.println(sb.reverse());
四、StringBuffer类-应用
将一个int类型数组变成字符串
public static void main(String[] args) {
int[] arr = { 78, 43, 1, 5, 6, 34 };
String s1 = toString_2(arr);
System.out.println(s1);
//使用StringBuffer来完成。
public static String toString_2(int[] arr) {
StringBuffer sb = new StringBuffer();//创建一个容器:字符串缓冲区
sb.append("[");
for (int x = 0; x < arr.length; x++) {
if (x != arr.length - 1)
sb.append(arr[x] + ". ");
else
sb.append(arr[x] + "]");
}
return sb.toString();返回的是字符串,要变回字符串。
}只有在输出语句中可以不写。
一旦数据多了,就想到容器存。数组的局限性是长度固定的同时,类型也是固定的。而StringBuffer是长度可以变,类型可以变,它的局限性是最终得变成字符串才能用。
五、StringBuilder
jdk1.5版本出现了一个新的字符串缓冲区。
功能和stringBuffer一模一样。
StringBuilder和tringBuffer的区别
StringBuffer是线程安全的。
StringBuilder是线程不安全的。为了提高效率。 因为不用判断同步锁。StringBuilder更快。
实际开发时,建议使用StringBuilder,只有在多线程时,才使用StringBuffer。
升级:
1,简化书写。
2,提高效率。
3,提高安全性。
StringBuffer和数组容器的区别?
1、数组容器是固定长度的。
StringBuffer是可变长度的。
2、数组容器一旦初始化就明确了元素的类型。
StringBuffer可以存储任意类型。包括基本和引用。
3、组存储完元素可以对元素进行操作(通过角标)。
StringBuffer存储完元素后,都会变成字符串,只能用字符串的方法来操作。
什么时候用StringBuffer或者StringBuilder?
数据个数可以是固定的,可是是不固定的,数据类型也可以是固定的,或者不固定的。 只要最终这些数据都需要变成字符串来操作时,就可以使用字符串缓冲区。
六、字符串数组排序
有一个字符串数组{"cba","abc","nba","zz","qq","aaa"}.
对这个字符串数组进行字典顺序的排序。
{"aaa","abc","cba","nba","qq","zz"}
String[] strs = {"cba","abc","nba","zz","qq","aaa"};
sortString(strs);
for (int i = 0; i < strs.length; i++) {
System.out.print(strs[i]+",");
}
public static void sortString(String[] strs) {
for (int i = 0; i < strs.length-1; i++) {
for (int j = i+1; j < strs.length; j++) {
if(strs[i].compareTo(strs[j])>0)
swap(strs,i,j);
}
}
}
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
一、String类
String类的特点:
1,Java语言中用于描述最常见的字符串数据的对象。
2,字符串数据都是一个对象。
3,字符串数据一旦初始化就不可以被改变了。双引号表示的都是字符串常量。
4,字符串对象都存储在常量池中。 字符串常量池。
String str = "abcd";
String s1 = "abcd";这时在常量池中创建了一个字符串对象。
System.out.println(str==s1);true
String s2 = new String("abcd");这是在堆内存创建一个String类的对象。并在常量池创建了"abcd"对象。
System.out.println(s1==s2);false
对于字符串对象的比较,应该用equals方法完成。
记住,基本数据用==进行比较相同。 对象比较相同都用equals方法。
对象的比较用的是compareTo方法。
System.out.println(s1.equals(s2));String类覆盖了Object中的equals方法,比较的是字符串内容是否相同。
String s3 = "ab"+"cd";
System.out.println(s1==s3);true.
二、String类方法查找的基本思路、练习、综合练习
一旦操作字符串,先找String对象中的方法。没有时在进行自定义,而自定义过程中,往往是多个String方法的组合完成
1、明确所需功能的有无参数 ,返回值类型。另外,若明确了返回值类型,可以这样写 来缩小查找范围
字符串中多少个字符串啊?字符串的长度
int len = str.length();
2、其中一个字符在字符串中的哪个位置上?
indexOf(int ch):ch是char的简写。char根据ACII码转换成数字。
int index = str.indexOf('a');//'a'在字符串中第一次出现的位置。
而lastIndexOf('a');反向索引第一次出现的角标位置。
int index = str.indexOf('a',2);是从字符串2角标位置向后索引'a'第一次出现的位置。
3、具体一个子串在该字符串的哪个位置出现?
字符串是"abcnbacd"
int index2 = str.indexOf("cba");
System.out.println("index2="+index2); 象这样的索引方法
好处一:获取具体的位置。好处二:还可以判断被索引的内容是否存在。通过-1来判断即可。
4、指定位置上的字符是什么?
char ch = str.charAt(8);//StringIndexOutOfBoundsException 访问到字符串中不存在的角标就会发生该异常。
5、能不能获取到字符串中的指定的子串。
结果:string,参数:两个int。索引index。
String sub_str = str.substring(2, 5);包含头角标,不包含尾角标。这是规律。
str.substring(0,str.length());截取整个字符串
6、如何将这个字符串变成大写的字符串呢?
结果:String,参数,无。
String upper_str = str.toUpperCase();都变成了大写
toLowerCase();都变成了小写。
String类中的toString()方法:返回此对象本身(它已经是个字符串)
练习1、将字符串中的指定字符串替换成给定字符串。
replaceAll(String regex ,String replacement):regex:正则表达式
replace(CharSequence target,CharSequence replacement)
String s = str.replace("nba", "haha");
如果要被替换的字符串不存在,结果又是什么?返回原串。
练习2、将字符串变成多个字符(char[]字符数组).
char[] chs = str.toCharArray();//将字符串转成字符数组。
练习3、字符串是否包含指定的子串。以及是否是以指定字符串开头或者结尾。
结果:boolean 参数:string.
boolean b = str.contains("Demo");是否包含
boolean b1 = str.endsWith(".java");是否以指定的字符串结尾
startsWith:是否以指定字符串开头
练习4、将给定的字符串"zhangsan,lisi,wangwu"获取其中每一个人的姓名。意味着获取多个字符串。
结果:String[] 参数:指定的方式。
str = "zhangsan,lisi,wangwu";
String[] names = str.split(",");
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]);
}
练习5、字符串在书写时往往不注意会在字符串的两端加有空格,找出取出两端空白的方法。 trim
结果:string。参数:无。
str = " ab c ";
str = str.trim();
System.out.println("-"+str+"-");
trim:返回字符串的副本,忽略前导空白和尾部空白。
综合练习1
获取一个子串在字符串中出现的次数。
"nbawernbatyunbaidfnbaghjnba" nba出现了几次
思路:
1,需要对nba在整串中进行查找。
2,如果找到了,记录nba出现的位置,
3,再从这个位置+nba长度的位置开始继续查找剩下的字符串中是否还有nba。
4,通过计数器来记录每次查找的次数
String s1 = "nbawernbatyunbaidfnbaghjnba";
String key = "nba";
int count = getSubCount(s1,key);
System.out.println(key+",count="+count);
public static int getSubCount(String str,String key){
int count = 0;
int index = 0;
while((index = str.indexOf(key,index))!=-1){
index = index + key.length();
count++;
}
return count;
}
综合练习2、
对字符串进行反转。 如:"abcd"-->"dcba";
思路
1,可以将字符串转成数组
2,数组进行反转。(无非就是头尾角标元素的位置置换。)
3,将数组变成字符串。
String s2 = "abcde";
s2 = reverseString(s2);
System.out.println("reverse:"+s2);
public static String reverseString(String str) {
//1,将字符串转成字符数组。
char[] chs = str.toCharArray();
reverseArrary(chs);
return new String(chs);//1、通过构造器将字符数组转成字符串。 构造方式。2、还可以return String.copyValueOf(chs) ,chs即char[]data,这是通过类调用类中的静态方法。静态方式。
}
private static void reverseArrary(char[] chs) {
for (int start = 0,end = chs.length - 1; start < end; start++,end--) {
swap(chs,start,end);
}
}
综合练习3、
对一个字符串中的字符进行字典顺序的排序生成一个有序的字符串。
思路:
1,一看排序,就想到数组。
2,将字符串先转成数组。
3,对数组排个序。
4,将排序的数组变成字符串。
其中Arrays.sort();不仅可以给int型排序还可以给char类型的排序。
综合练习4、
获取两个字符串中最大相同子串。
思路:
1,既然获取的最大子串,找到其中一个比较短的为参照,
去判断大中的是否包含短串。
2,如果不包含,将短的长度按照依次递减的方式获取短串中的子串。
并不断地判断是否在长串中存在,
3,如果存在,视为找到,结束。
/**
* 获取两个字符串中最大相同的子串。
* @param s1
* @param s2
* @return
*/
public static String getMaxSubstring(String s1, String s2) {
String max,min;
max = s1.length()>s2.length()?s1:s2;
min = max.equals(s1)?s2:s1;
// System.out.println("max="+max+",,min="+min);
for(int x=0; x<min.length(); x++){
for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++){
//获取短字符串的子串
String temp = min.substring(y,z);
// System.out.println(temp);
if(max.contains(temp)){//s1.indexOf(temp)!=-1
return temp;
}
}
}
return null;
}
三、字符串缓冲区。StringBuffer
特点:
1,缓冲区就是用来缓存数据,意味着它是一个容器。
2,该容器的长度是可变的。
3,提供了对容器中内容的操作的方法(最多无外乎四种:增删改查.)
4,该缓冲区中可以添加多种类型的元素,基本类型和引用类型。
5,无论怎么样的改变容器中的数据,最终要使用结果,还是必须要将其转成字符串,使用toString方法。
String str = "abc"+4+'c';这句话的实际底层操作其实是:
str = new StringBuffer().append("abc").append(4).append('c').toString();
创建一个字符串缓冲区。StringBuffer sb = new StringBuffer("abcd");
StringBuffer s1 = sb.append(45);
System.out.println(sb==s1);//true,append返回的还是原来的缓冲区。
sb.append(45).append(true).append("abc");//连续添加,调用动作:方法调用链
append():追加:在结尾处添加。
在任意位置添加 insert方法。sb.insert(1, true);
删除内容不是delete就是remove
sb.delete(0,sb.length());//清空缓冲区。
修改内容:sb.replace(1, 3, "ak47");修改(替换)一段内容
字符串反转System.out.println(sb.reverse());
四、StringBuffer类-应用
将一个int类型数组变成字符串
public static void main(String[] args) {
int[] arr = { 78, 43, 1, 5, 6, 34 };
String s1 = toString_2(arr);
System.out.println(s1);
//使用StringBuffer来完成。
public static String toString_2(int[] arr) {
StringBuffer sb = new StringBuffer();//创建一个容器:字符串缓冲区
sb.append("[");
for (int x = 0; x < arr.length; x++) {
if (x != arr.length - 1)
sb.append(arr[x] + ". ");
else
sb.append(arr[x] + "]");
}
return sb.toString();返回的是字符串,要变回字符串。
}只有在输出语句中可以不写。
一旦数据多了,就想到容器存。数组的局限性是长度固定的同时,类型也是固定的。而StringBuffer是长度可以变,类型可以变,它的局限性是最终得变成字符串才能用。
五、StringBuilder
jdk1.5版本出现了一个新的字符串缓冲区。
功能和stringBuffer一模一样。
StringBuilder和tringBuffer的区别
StringBuffer是线程安全的。
StringBuilder是线程不安全的。为了提高效率。 因为不用判断同步锁。StringBuilder更快。
实际开发时,建议使用StringBuilder,只有在多线程时,才使用StringBuffer。
升级:
1,简化书写。
2,提高效率。
3,提高安全性。
StringBuffer和数组容器的区别?
1、数组容器是固定长度的。
StringBuffer是可变长度的。
2、数组容器一旦初始化就明确了元素的类型。
StringBuffer可以存储任意类型。包括基本和引用。
3、组存储完元素可以对元素进行操作(通过角标)。
StringBuffer存储完元素后,都会变成字符串,只能用字符串的方法来操作。
什么时候用StringBuffer或者StringBuilder?
数据个数可以是固定的,可是是不固定的,数据类型也可以是固定的,或者不固定的。 只要最终这些数据都需要变成字符串来操作时,就可以使用字符串缓冲区。
六、字符串数组排序
有一个字符串数组{"cba","abc","nba","zz","qq","aaa"}.
对这个字符串数组进行字典顺序的排序。
{"aaa","abc","cba","nba","qq","zz"}
String[] strs = {"cba","abc","nba","zz","qq","aaa"};
sortString(strs);
for (int i = 0; i < strs.length; i++) {
System.out.print(strs[i]+",");
}
public static void sortString(String[] strs) {
for (int i = 0; i < strs.length-1; i++) {
for (int j = i+1; j < strs.length; j++) {
if(strs[i].compareTo(strs[j])>0)
swap(strs,i,j);
}
}
}
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员-----String类和StringBuffer类总结
- 黑马程序员_Java面对对象——String类和StringBuffer类
- 黑马程序员————Java基础之String类与StringBuffer类
- 黑马程序员:String类和StringBuffer类
- 黑马程序员_学习日记五_String类、StringBuffer类、基本数据包装类
- 黑马程序员 Java面向对象——String类 StringBuffer类 StringBuiler类
- 黑马程序员——Java常用类笔记(上)【Object类/Scanner类、String类/StringBuffer类、包装类】
- 黑马程序员—JAVA基础—String类、StringBuffer类
- 黑马程序员--String类和StringBuffer类
- 黑马程序员——String类和StringBuffer类
- 黑马程序员_面向对象3_(异常Exception、包package、String类、StringBuffer类)
- 黑马程序员--- 字符串的重要性, String类的定义方法, StringBuffer类的构造方法
- 黑马程序员——Java基础---常用类--Object类,Scanner类,String类,StringBuffer类,StringBuilder类
- 黑马程序员_String类 StringBuffer类
- 黑马程序员------毕老师视频笔记第13-17天------JavaAPI(String类、StringBuffer类)(1)
- 黑马程序员——Java基础——String类、StringBuffer类、StringBuilder类、基本数据类型对象包装类操作、正则表达式应用
- 黑马程序员------毕老师视频笔记第13-17天------JavaAPI(String类、StringBuffer类)(2)
- 黑马程序员:String类和StringBuffer类的总结
- 黑马程序员——JAVA学习笔记七(String类)
- Java学习笔记(十)String类和StringBuffer类