黑马程序员--字符串以及字符串缓冲区

来源:互联网 发布:php剔除数组重复数据 编辑:程序博客网 时间:2024/06/08 04:22

字符串以及字符串缓冲区

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 的值。

例子:

[java] view plaincopyprint?
  1. package pack;  
  2. // String类时用于描述字符串事物。  
  3. // 那么他就提供了多个方法对字符串进行操作。  
  4. // 常见的操作有哪些?“abcd”  
  5. // 1,获取。  
  6. //  1.1:字符串中包含的字符数,也就是字符串的长度。  
  7. //      int length:获取长度。  
  8. //  1.2:根据位置获取位置上的某个字符。  
  9. //      char charAt(int index);获取某一位置上的字符。  
  10. //  1.3:根据字符获取该字符在字符串中的位置。  
  11. //      int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。  
  12. //      int indesOf(int ch,int fromIndex);从fromIndex指定位置开始,获取ch在字符串中出现的位置。  
  13. //      int indexOf(String str);返回的是str在字符串中第一次出现的位置。  
  14. //      int indesOf(String str,int fromIndex);从fromIndex指定位置开始,获取str在字符串中出现的位置。   
  15. //        
  16. //      int lastIndexOf(int ch);反向索引。  
  17. // 2,判断。  
  18. //  2.1:字符串中是否包含某一个子串。  
  19. //      boolean contains(str);判断字符串是否存在,判断字符串是否包含。  
  20. //      特殊之处:indexOf(str);可以索引str第一次出现的位置,如果返回-1,表示该str不再字符串中存在。  
  21. //      所以,也可以使用对指定判断是否包含。  
  22. //      if(str.indexOf("aa"!=-1));而且该方法既可以判断,又可以获取出现的位置。  
  23. //  2.2:字符串中是否有内容。  
  24. //      boolean isEmpty();原理就是判断长度是否为0。  
  25. //  2.3:字符串是否是以指定内容开头。  
  26. //      boolean startsWith(str);  
  27. //  2.4:字符串是否是以指定内容结尾。  
  28. //      boolean endsWith(str);  
  29. //  2.5:判断字符串内容是否相同。复写了Object类中的equals方法。  
  30. //      booleam equals(str);  
  31. //  2.6:判断内容是否相同,并忽略大小写。  
  32. //      boolean equalsIgnoreCase();  
  33. // 3,转换。  
  34. //  3.1:将字符数组转成字符串。  
  35. //      构造函数:String(char[])  
  36. //                String(char[],offset,count):将字符数组中的一部分转成字符串。  
  37. //      静态方法:  
  38. //              static String copyValueOf(char[]);  
  39. //              static String copyValueOf(char[] data,int offset,int count);  
  40. //              static String valueOf(char[]);  
  41. //  3.2:将字符串转成字符数组。**  
  42. //      char[] toCharArray();  
  43. //  3.3:将字节数组转成字符串。  
  44. //      String(byte[]);  
  45. //      String(byte[],offset,count);将字节数组中的一部分转成字符串。  
  46. //  3.4:将字符串转成字节数组。  
  47. //      byte[] getBytes();  
  48. //  3.5:将基本数据类型转换成字符串。  
  49. //      static String valueOf(int);  
  50. //      static String valueOf(double);  
  51. //      3+"";//String.valueOf(3);  
  52. //  特殊:字符串和字节数组在转换过程中,是可以指定编码表的。  
  53. // 4,替换。  
  54. //  String replace(dchar,newchar);  
  55. // 5,切割。  
  56. //  String[] split(regex);  
  57. // 6,字串。获取字符串中的一部分。  
  58. //  String substring(begin);  
  59. //  String substring(begin,end);  
  60. // 7,转换,去除空格,比较。  
  61. //  7.1:将字符串转成大写或者小写。  
  62. //      String toUpperCase();  
  63. //      String toLowerCase();  
  64. //  7.2:将字符串两端的多个空格去除。  
  65. //      String trim();  
  66. //  7.3:对两个字符串进行自然顺序的比较。  
  67. //      int compareTo(string);  
  68. class StringMethodDemo{  
  69.     public static void sop(Object obj){  
  70.         System.out.println(obj);  
  71.     }  
  72.     public static void main(String[] args){  
  73.           
  74.     }  
  75.     public static void method_get(){  
  76.         String s="abcdefg";  
  77.         sop(s.length());// 打印长度  
  78.         sop(s.charAt(2));// 根据索引获取字符。  
  79.         // 当访问到字符串中不存在的角标时,  
  80.         // 会发生StringIndexOutOfBoundsException:字符串角标越界异常。  
  81.         sop(s.indexOf("a"));//根据字符获取索引。如果没有找到,返回-1.  
  82.         sop(s.lastIndexOf("a"));// 反向索引一个字符出现的位置。角标不被反向。所以打印的还是0角标  
  83.     }  
  84.     public static void method_is(){  
  85.         String s="ArrayTool.java";  
  86.         sop(s.startsWith("Array"));// 判断文件名称是否是Array单词开头。  
  87.         sop(s.contains("Tool"));// 判断文件名中是否包含Tool。  
  88.         sop(s.endsWith(".java"));// 判断文件名称是否是.java的文件。  
  89.     }  
  90.     public static void method_trans(){  
  91.         char[] arr={'a','b','c','d','e'};  
  92.         String s=new String(arr,1,3);// 将字节数组中的一部分转成字符串。  
  93.         sop("s="+s);  
  94.         String s1="abcdefg";  
  95.         char[] chs=s1.toCharArray();// 将字符串转成字节数组。  
  96.         for(int x=0; x<chs.length; x++){  
  97.             sop(chs[x]);  
  98.         }  
  99.     }  
  100.     public static void method_replace(){  
  101.         String s="Hello JAVA";  
  102.         String s1=s.replace("a","b");// 如果要替换的字符不存在,返回的还是原字符串。  
  103.         sop(s);sop(s1);  
  104.     }  
  105.     public static void method_7(){  
  106.         String s="  Hello JAVA  ";  
  107.         sop(s.toUpperCase());// 将字符串转成大写。  
  108.         sop(s.toLowerCase());// 将字符串转成小写。  
  109.         sop(s.trim());// 去除字符串两端的空格。  
  110.         String s1="aaa";  
  111.         String s2="abc";  
  112.         sop(s.compareTo(s2));// 对字符串进行比较排序。  
  113.     }  
  114. }  

练习1:

[java] view plaincopyprint?
  1. package pack;  
  2. // 1,模拟一个trim方法,去除字符串两端的空格。  
  3. //  思路:  
  4. //  1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。  
  5. //      结尾处判断空格也是如此。  
  6. //  2,当开始和结尾都判断到不是空格,就是要获取的字符串。  
  7. // 2,将一个字符串进行反转,将字符串中指定部分进行反转,"abcdefg";abfedcg.  
  8. //  思路:  
  9. //  1,曾静学习过对数组的元素进行反转。  
  10. //  2,将字符串变成数组,对数组进行反转。  
  11. //  3,将反转后的数组变成字符串。  
  12. //  4,只要将或反转的部分的开始和结束为止作为参数传递即可。  
  13. class StringTest1{  
  14.     public static void main(String[] args){  
  15.           
  16.     }  
  17.     // 练习一:去除字符串两端空格。  
  18.     public static String myTrim(String s){  
  19.         int start=0,end=s.length()-1;  
  20.         while(start<=end&&s.charAt(start)==' ')  
  21.             start++;  
  22.         while(start<=end&&s.charAt(end)==' ')  
  23.             end--;  
  24.         return s.substring(start,end+1);  
  25.     }  
  26.     // 练习二:将字符串反转。  
  27.     // 将字符串变成数组,对数组进行反转,将数组变成字符串。  
  28.     public static String reverseString(String s,int start,int end){  
  29.         char[] chs=s.toCharArray();  
  30.         reverse(chs,start,end);  
  31.         return new String(chs);  
  32.     }  
  33.     public static String reverseString(String s){  
  34.         return reverseString(s,0,s.length()-1);  
  35.     }  
  36.     public static void reverse(char[] arr,int x,int y){  
  37.         for(int start=x,end=y; start<end; start++,end--){  
  38.             swap(arr,start,end);  
  39.         }  
  40.     }  
  41.     public static void swap(char[] arr,int x,int y){  
  42.         char temp=arr[x];  
  43.         arr[x]=arr[y];  
  44.         arr[y]=temp;  
  45.     }  
  46. }  

练习2:

[java] view plaincopyprint?
  1. package pack;  
  2. // 3,获取一个字符串在另一个字符串中出现的次数。  
  3. //  “adkkkcdkkefkkskk”  
  4. //  思路:  
  5. //  1,定义一个计数器。  
  6. //  2,获取kk第一次出现的位置。  
  7. //  3,从第一次出现的位置后剩余的字符串中继续获取kk出现的位置。  
  8. //      每获取一次就计数一次。  
  9. //  4,当获取不到时,计数完成。  
  10. class StringTest2{  
  11.     public static void sop(Object obj){  
  12.         System.out.println(obj);  
  13.     }  
  14.     public static void main(String[] args){  
  15.           
  16.     }  
  17.     // 方式一。  
  18.     public static int getSubCount(String s,String key){  
  19.         int count=0;  
  20.         int index=0;  
  21.         while((index=s.indexOf(key))!=-1){  
  22.             sop(s);  
  23.             s=s.substring(index+key.length());  
  24.             count++;  
  25.         }  
  26.         return count;  
  27.     }  
  28.     // 方式二。  
  29.     public static int getSubString(String s,String key){  
  30.         int count=0;  
  31.         int index=0;  
  32.         while((index=s.indexOf(key,index))!=-1){  
  33.             sop(index);  
  34.             index=index+key.length();  
  35.             count++;  
  36.         }  
  37.         return count;  
  38.     }  
  39. }  

练习2:

[java] view plaincopyprint?
  1. package pack;  
  2. // 4,获取两个字符串中最大相同子串,第一个动作:将断的哪个串进行长度一次递减的子串打印。  
  3. //  “abcwerthelloyuiodef”  
  4. //  “cvhellobnm”  
  5. //  思路:  
  6. //  1,将短的哪个子串按照长度递减的方式获取到。  
  7. //  2,将每获取到的子串去长传中判断是否包含。  
  8. //      如果包含,已经找到。  
  9. class StringTest3{  
  10.     public static void main(String[] args){  
  11.         String s1="abcwerthelloyuiodef";  
  12.         String s2="cvhellobnm";  
  13.         System.out.println(getMaxSubString(s1,s2));  
  14.     }  
  15.     public static String getMaxSubString(String s1,String s2){  
  16.         String max="",min="";  
  17.         max=(s1.length()>s2.length())?s1:s2;  
  18.         min=(max==min)?s1:s2;  
  19.         System.out.println(max);  
  20.         System.out.println(min);  
  21.         for(int x=0; x<min.length(); x++){  
  22.             for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++){  
  23.                 String temp=min.substring(y,z);  
  24.                 if(max.contains(temp))  
  25.                     return "相同子串: "+temp;  
  26.             }  
  27.         }  
  28.         return "";  
  29.     }  
  30. }  



------------------------------------

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 安全。


练习:

[java] view plaincopyprint?
  1. package pack;  
  2. // StringBuffer是字符串缓冲区,是一个容器。特点:  
  3. // 1,而且长度是可变化的。  
  4. // 2,可以直接操作多个数据类型。  
  5. // 3,最终会通过toString方法变成字符串  
  6. // c create U update Rread Ddelete  
  7. //  1,存储。  
  8. //      StringBuffer append();将指定数据作为参数添加到已有数据的结尾处。  
  9. //      StringBuffer insert(index,数据);可以将数据插入到指定index位置。  
  10. //  2,删除。  
  11. //      StringBuffer delete(start,end);删除缓冲区中的数据,包含start,不包含end。  
  12. //      StringBuffer deleteCharAt(index);删除指定位置的字符。  
  13. //  3,获取。  
  14. //      char charAt(int index);  
  15. //      int indexOf(String str);  
  16. //      int laseIndexOf(String str);  
  17. //      int length();  
  18. //      String substring(int start,int end);  
  19. //  4,修改。  
  20. //      StringBuffer replace(start,end,string);  
  21. //      void setCharAt(int index,char ch);  
  22. //  5,反转。  
  23. //      StringBuffer reverse();  
  24. //  6,缓冲区中指定数据存在到指定数组中。  
  25. //      void getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)  
  26. // 在JDK1.5版本之后出现了StringBuilder  
  27. // 不同在于:StringBuffer是线程同步。  
  28. //          StringBuilder是线程不同步。  
  29. //  以后开发,建议使用StringBuilder。  
  30. // 升级三个因素:1,提高效率。2,简化书写。3,提高安全性。  
  31. class StringBufferDemo{  
  32.     public static void sop(Object obj){  
  33.         System.out.println(obj);  
  34.     }  
  35.     public static void main(String[] args){  
  36.           
  37.     }  
  38.     public static void method_add(){  
  39.         StringBuffer sb=new StringBuffer();  
  40.         sb.append("abc");sb.append(123);sb.append(true);  
  41.         StringBuffer sb1=sb.append(123);  
  42.         sop("sb: "+sb);sop("sb1: "+sb1);  
  43.         sb.insert(1,"qq");  
  44.         sop(sb.toString());  
  45.         sop(sb1.toString());  
  46.     }  
  47.     public static void method_delete(){  
  48.         StringBuffer sb=new StringBuffer("abcdefg");  
  49.         sb.delete(1,3);  
  50.         sb.delete(0,sb.length());  
  51.         sb.delete(2,3);sb.deleteCharAt(2);  
  52.         sop(sb.toString());  
  53.     }  
  54.     public static void method_udapter(){  
  55.         StringBuffer sb=new StringBuffer("abcdefg");  
  56.         sb.replace(1,3,"java");  
  57.         sb.setCharAt(2,'K');  
  58.         sop(sb.toString());  
  59.     }  
  60.     public static void getChars(){  
  61.         StringBuffer sb=new StringBuffer("abcdefg");  
  62.         char[] chs=new char[4];  
  63.         sb.getChars(1,4,chs,1);  
  64.         for(int x=0; x<chs.length; x++)  
  65.             sop("chs["+x+"]"+chs[x]+";");  
  66.     }  
  67. }  
0 0
原创粉丝点击