Java - 字符串

来源:互联网 发布:软件测试活动周期 编辑:程序博客网 时间:2024/06/06 06:29

String对象的常用方法

[java] view plain copy
  1. package com.itlwc;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) throws Exception {  
  5.         // 返回字符串中索引2的char值  
  6.         System.out.println("abcdefg".charAt(2));  
  7.   
  8.         // 返回第一次出现索引值  
  9.         System.out.println("abcdefg".indexOf('c'));  
  10.         System.out.println("abcdefg".indexOf('c'3));  
  11.         System.out.println("abcdefg".indexOf("c"));  
  12.         System.out.println("abcdefg".indexOf("c"3));  
  13.         // 返回最后一次出现索引值  
  14.         System.out.println("abcdefg".lastIndexOf('c'));  
  15.         System.out.println("abcdefg".lastIndexOf('c'3));  
  16.         System.out.println("abcdefg".lastIndexOf("c"));  
  17.         System.out.println("abcdefg".lastIndexOf("c"3));  
  18.   
  19.         // 字符串转换为char数组  
  20.         System.out.println("abcdefg".toCharArray());  
  21.         char[] cccc = new char["abcdef".length()];  
  22.         "abcdef".getChars(06, cccc, 0);  
  23.         System.out.println(cccc);  
  24.   
  25.         // char数组转换为String  
  26.         char[] ccc = { 'a''b''c' };  
  27.         System.out.println(new String(ccc));  
  28.         System.out.println(new String(ccc, 12));  
  29.         System.out.println(String.copyValueOf(ccc));  
  30.         System.out.println(String.copyValueOf(ccc, 12));  
  31.         System.out.println(String.valueOf(ccc));  
  32.         System.out.println(String.valueOf(ccc,1,2));  
  33.   
  34.         // byte数组转型为字符串  
  35.         System.out.println(new String("123abc".getBytes(), "gb2312"));  
  36.   
  37.         // 字符串的长度  
  38.         System.out.println("abcdefg".length());  
  39.         // 比较两个字符串内容是否相同  
  40.         System.out.println("abcdefg".equals("123456"));  
  41.         // 比较两个字符串内容是否相同不区分大小写  
  42.         System.out.println("abcdefg".equalsIgnoreCase("ABCDEFG"));  
  43.         // 返回两个字符串首次出现不同字符时编码值的差值  
  44.         System.out.println("abcdefg".compareTo("ABCDEFG"));  
  45.         // 不考虑大小写,按字典顺序比较两个字符串  
  46.         System.out.println("abcdefg".compareToIgnoreCase("ABCDEFG"));  
  47.   
  48.         // 连接字符串  
  49.         System.out.println("abcdefg".concat("123456"));  
  50.         // 子串  
  51.         System.out.println("abcdefg".substring(3));  
  52.         System.out.println("abcdefg".substring(36));  
  53.         // 是否包含  
  54.         System.out.println("abcdefg".contains("abc"));  
  55.         // 全部包含  
  56.         System.out.println("abcdefg".contentEquals("abcdefg"));  
  57.         // 转换为小写  
  58.         System.out.println("abcdefg".toLowerCase());  
  59.         // 转换为大写  
  60.         System.out.println("abcdefg".toUpperCase());  
  61.         // 去掉前后空格  
  62.         System.out.println(" abcdefg ".trim());  
  63.         // 是否以某一个字符串开始  
  64.         System.out.println("javaSE".startsWith("java"));  
  65.         // 是否以某一个字符串结尾  
  66.         System.out.println("student.java".endsWith("java"));  
  67.   
  68.         // 字符串是否匹配给定的正则表达式  
  69.         System.out.println("abcdefg".matches("\\w*"));  
  70.         // 字符串替换  
  71.         System.out.println("abcdefg".replace("abc""123"));  
  72.         // 正则表达式字符串替换  
  73.         System.out.println("abcdefg".replaceAll("[a-b]"""));  
  74.         // 正则表达式字符串替换  
  75.         System.out.println("abcdefg".replaceFirst("[a-b]"""));  
  76.           
  77.         //基本数据转型为String  
  78.         System.out.println(String.valueOf(1));  
  79.     }  
  80. }  
  81. /* 
  82. 打印结果: 
  83.     c 
  84.     2 
  85.     -1 
  86.     2 
  87.     -1 
  88.     2 
  89.     2 
  90.     2 
  91.     2 
  92.     abcdefg 
  93.     abcdef 
  94.     abc 
  95.     bc 
  96.     abc 
  97.     bc 
  98.     abc 
  99.     bc 
  100.     123abc 
  101.     7 
  102.     false 
  103.     true 
  104.     32 
  105.     0 
  106.     abcdefg123456 
  107.     defg 
  108.     def 
  109.     true 
  110.     true 
  111.     abcdefg 
  112.     ABCDEFG 
  113.     abcdefg 
  114.     true 
  115.     true 
  116.     true 
  117.     123defg 
  118.     cdefg 
  119.     bcdefg 
  120.     1 
  121. */  

String对象

[plain] view plain copy
  1. 简单语法创建字符串对象  
  2.     String str1 = "abc";  
  3.     String str2 = "abc";  
  4.     创建字符串str1的时候,字符串常量池中没有abc对象,创建abc对象,并让引用str1指向abc对象  
  5.     创建字符串str2的时候,字符串常量中已经有abc对象,不创建abc对象,让引用str2指向abc对象  
  6. new语言创建字符串对象  
  7.     String str3 = new String("abc");  
  8.     创建字符串str3的时候,直接在堆中创建内容为abc对象,并让引用str3指向abc对象  
  9.         再去字符串常量池中查看,是否已经有了abc对象  
  10.         如果有了,new出来的aaa对象与字符串常量池的对象联系起来  
  11.         如果没有,在字符串常量池再创建一个aaa对象,并将堆中aaa对象与字符串常量池的对象联系起来  
  12. 字符串连接  
  13.     String str1 = "abc";  
  14.     String str2 = "很简单";  
  15.     str2 = str1.concat(str2);  
  16.     分别创建str1,str2对象,将str2内容追加到str1内容后面,  
  17.     并查找字符串常量池中有没有abc很简单对象,  
  18.     如果有,则将引用str2指向abc很简单对象,  
  19.     如果没有,则创建abc很简单对象,并将引用str2指向新创建的abc很简单对象  
  20. String str=""与String str=null的区别  
  21.     前者是没有内容,后者是没有对象  

String分隔案例

[java] view plain copy
  1. package com.itlwc;  
  2.   
  3. import java.util.StringTokenizer;    
  4. public class Test {    
  5.     public static void main(String[] args) {    
  6.         //分隔一    
  7.         String str = "1987-04-09";    
  8.         StringTokenizer st = new StringTokenizer(str,"-");    
  9.         String n = st.nextToken();    
  10.         String y = st.nextToken();    
  11.         String r = st.nextToken();    
  12.         System.out.println(n+"年"+y+"月"+r+"日");  
  13.         //分隔二    
  14.         String[] ss = str.split("-");  
  15.         System.out.println(ss[0]+"年"+ss[1]+"月"+ss[2]+"日");  
  16.     }    
  17. }    
  18. /*  
  19. 打印结果:  
  20.     1987年04月09日 
  21.     1987年04月09日  
  22. */  

String特殊机制付出的代价

[java] view plain copy
  1. 比较两个字符串内容是否相同时,  
  2.     只需比较两个字符串联系的常量池中对象是否是同一个即可,  
  3.     这样将内容的比较转换为对引用的比较大大提高了速度  
  4.     如果没有特殊需求我们尽量避免使用new来创建字符串对象,这样可以节省内存,提高比较效率  
  5. 字符串的特殊内存机制带来了很多好处,也需要付出一些代价  
  6.     因为字符串永远不变,在需要大量连接字符串的代码中,性能大幅下降,创建大量无用中间对象  
  7.     String str = "";  
  8.     for(int i=0;i<100;i++){  
  9.         s=s+i  
  10.     }  
  11.     将100以内的数字连接成一个字符串,在连接过程中产生了很多中间对象,  
  12.     每次执行一次连接操作诞生一个新对象丢弃一个老对象,这样会造成性能的急剧下降  

StringBuffer基本概念

[java] view plain copy
  1. 在大量字符串连接操作时,产生大量无用的中间对象,StringBuffer拟补了String的不足  
  2. 三个构造器  
  3.     StringBuffer sb1 = new StringBuffer();  
  4.     StringBuffer sb2 = new StringBuffer(16);  
  5.     StringBuffer sb3 = new StringBuffer("a");  

StringBuffer方法链

[plain] view plain copy
  1. 方法链书写格式  
  2.     引用变量.方法1.方法2.方法3...;  
  3. 方法链需要注意的问题  
  4.     非最后一个方法必须有返回类型不能为void,且返回类型不许为引用数据类型  
  5. 方法链执行步骤  
  6.     通过引用变量调用方法1  
  7.     方法1将返回一个对象的引用,然后通过该引用调用指向的对象中的方法2  
  8.     方法2将返回一个对象的引用,然后通过该引用调用指向的对象中的方法3  
  9.     以此类推  
案例
[java] view plain copy
  1. package com.itlwc;  
  2.   
  3. class MyClass {  
  4.     public MyClass a() {  
  5.         System.out.println("成功使用方法链调用了a()");  
  6.         return this;  
  7.     }  
  8.   
  9.     public MyClass b() {  
  10.         System.out.println("成功使用方法链调用了b()");  
  11.         return this;  
  12.     }  
  13.   
  14.     public MyClass c() {  
  15.         System.out.println("成功使用方法链调用了c()");  
  16.         return this;  
  17.     }  
  18.   
  19.     public void d() {  
  20.         System.out.println("成功使用方法链调用了d()");  
  21.     }  
  22. }  
  23.   
  24. public class Test {  
  25.     public static void main(String[] args) {  
  26.         // 调用方法链  
  27.         new MyClass().a().b().c().d();  
  28.     }  
  29. }  
  30. /* 
  31. 打印结果: 
  32.     成功使用方法链调用了a() 
  33.     成功使用方法链调用了b() 
  34.     成功使用方法链调用了c() 
  35.     成功使用方法链调用了d() 
  36. */  

StringBuffer常用方法

[java] view plain copy
  1. package com.itlwc;    
  2.     
  3. public class Test {    
  4.     public static void main(String[] args) {    
  5.         StringBuffer sb1 = new StringBuffer("abc");    
  6.         // 把123追加到sb1末尾    
  7.         sb1.append("123");    
  8.         System.out.println(sb1);    
  9.         // 把---增加到sb1索引为3的位置    
  10.         sb1.insert(3"---");    
  11.         System.out.println(sb1);    
  12.         // 删除sb1索引3到6之间的字符串    
  13.         sb1.delete(36);    
  14.         System.out.println(sb1);    
  15.         // sb1颠倒    
  16.         sb1.reverse();    
  17.         System.out.println(sb1);    
  18.         // sb1转换为字符串    
  19.         sb1.toString();    
  20.         System.out.println(sb1);    
  21.         // 方法链    
  22.         sb1.reverse().append("def").insert(00);    
  23.         System.out.println(sb1);  
  24.         //修改单个字符的值  
  25.         sb1.setCharAt(0,'A');  
  26.         System.out.println(sb1);  
  27.     }    
  28. }    
  29. /*  
  30. 打印结果:  
  31.     abc123  
  32.     abc---123  
  33.     abc123  
  34.     321cba  
  35.     321cba  
  36.     0abc123def 
  37.     Aabc123def 
  38. */   

String vs StringBuffer

[plain] view plain copy
  1. String是不可变的类,StringBuffer是可变类  
  2. StringBuffer操作字符串要比String效率高很多  
案例
[java] view plain copy
  1. package com.itlwc;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         Test.getString();  
  6.         Test.getStringBuffer();  
  7.     }  
  8.     public static void getString(){  
  9.         String tempstr = "lkasjdflkasdjfdsfdsfassdfdsfdssdfdssdf";  
  10.         long lstart1 = System.currentTimeMillis();  
  11.         String str ="";  
  12.         for (int i = 0; i < 5000; i++) {  
  13.             str+=tempstr;  
  14.         }  
  15.         long lend1 = System.currentTimeMillis();  
  16.         System.out.println("String使用的时间: "+(lend1 - lstart1));  
  17.     }  
  18.     public static void getStringBuffer(){  
  19.         String tempstr = "lkasjdflkasdjfdsfdsfassdfdsfdssdfdssdf";  
  20.         long lstart1 = System.currentTimeMillis();  
  21.         StringBuffer sb = new StringBuffer();  
  22.         for (int i = 0; i < 5000; i++) {  
  23.             sb.append(tempstr);  
  24.         }  
  25.         long lend1 = System.currentTimeMillis();  
  26.         System.out.println("StringBuffer使用的时间:"+(lend1 - lstart1));  
  27.     }  
  28. }  
  29. /* 
  30. 打印结果: 
  31.     String使用的时间: 7469 
  32.     StringBuffer使用的时间:0 
  33. */  

StringBuffer VS StringBuilder

[plain] view plain copy
  1. 都是对字符串进行操作的,构造器方法基本相同  
  2. StringBuffer是线程安全的,效率慢一点  
  3. StringBuilder是线程不安全的,效率快一点  
  4. 如果是单线程使用StringBuilder,多线程使用StringBuffer  
0 0
原创粉丝点击