黑马程序员_day016_String类和StringBuffer类

来源:互联网 发布:数据监控系统 编辑:程序博客网 时间:2024/05/29 16:26

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

一、String

 String类的特点:

1Java语言中用于描述最常见的字符串数据的对象。

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)chchar的简写。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) chschar[]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);//trueappend返回的还是原来的缓冲区。

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一模一样。

StringBuildertringBuffer的区别

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学习型技术博客、期待与您交流! ----------------------

原创粉丝点击