Java中String类的方法及说明

String : 字符串类型

一、构造函数
     String(byte[ ] bytes):通过byte数组构造字符串对象
     String(char[ ] value):通过char数组构造字符串对象
     String(Sting original):构造一个original副本。即:拷贝一个original
     String(StringBuffer buffer):通过StringBuffer数组构造字符串对象。  
例如:
      byte[] b = {'a','b','c','d','e','f','g','h','i','j'};
      char[] c = {'0','1','2','3','4','5','6','7','8','9'};
      String sb = new String(b);                 //abcdefghij
      String sb_sub = new String(b,3,2);     //de
      String sc = new String(c);                  //0123456789
      String sc_sub = new String(c,3,2);    //34
      String sb_copy = new String(sb);       //abcdefghij  
      System.out.println("sb:"+sb);
      System.out.println("sb_sub:"+sb_sub);
      System.out.println("sc:"+sc);
      System.out.println("sc_sub:"+sc_sub);
      System.out.println("sb_copy:"+sb_copy);
      输出结果sb:abcdefghij
                      sb_sub:de
                       sc:0123456789
                        sc_sub:34
                        sb_copy:abcdefghij

二、方法:

     说明:①、所有方法均为public。
           ②、书写格式: [修饰符] <返回类型><方法名([参数列表])>

      例如:static int parseInt(String s)
      表示此方法(parseInt)为类方法(static),返回类型为(int),方法所需要为String类型。

1. char charAt(int index) :取字符串中的某一个字符,其中的参数index指的是字符串中序数。字符串的序数从0开始到length()-1 。
    例如:String s = new String("abcdefghijklmnopqrstuvwxyz");
          System.out.println("s.charAt(5): " + s.charAt(5) );
          结果为: s.charAt(5): f
2. int compareTo(String anotherString) :当前String对象与anotherString比较相等关系返回0不相等时,从两个字符串第0个字符开始比较,返回第一个不相等的字符差,另一种情况,较长字符串的前面部分恰巧是较短的字符串,返回它们的长度差。
3. int compareTo(Object o) :如果o是String对象,和2的功能一样;否则抛出ClassCastException异常。
    例如:String s1 = new String("abcdefghijklmn");
            String s2 = new String("abcdefghij");
           String s3 = new String("abcdefghijalmn");
           System.out.println("s1.compareTo(s2): " + s1.compareTo(s2) ); //返回长度差
           System.out.println("s1.compareTo(s3): " + s1.compareTo(s3) ); //返回'k'-'a'的差
           结果为:s1.compareTo(s2): 4
                       s1.compareTo(s3): 10
4. String concat(String str) :将该String对象与str连接在一起。
5. boolean contentEquals(StringBuffer sb) 将该String对象与StringBuffer对象sb进行比较。
6. static String copyValueOf(char[] data) 
7. static String copyValueOf(char[] data, int offset, int count) :这两个方法将char数组转换成String,与其中一个构造函数类似。
8. boolean endsWith(String suffix) :该String对象是否以suffix结尾
    例如:String s1 = new String("abcdefghij");
           String s2 = new String("ghij");
           System.out.println("s1.endsWith(s2): " + s1.endsWith(s2) );
           结果为:s1.endsWith(s2): true
9. boolean equals(Object anObject) :当anObject不为空并且与当前String对象一样,返回true;否则,返回false
10. byte[] getBytes() :将该String对象转换成byte数组
11. void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) :该方法将字符串拷贝到字符数组中。其中,srcBegin为拷贝的起始位置、srcEnd为拷贝的结束位置、字符串数值dst为目标字符数组、dstBegin为目标字符数组的拷贝起始位置。
     例如:char[] s1 = {'I',' ','l','o','v','e',' ','h','e','r','!'};//s1=I love her!
           String s2 = new String("you!"); s2.getChars(0,3,s1,7); //s1=I love you!
           System.out.println( s1 );
           结果为:I love you!
12. int hashCode() :返回当前字符的哈希表码
13. int indexOf(int ch) :只找第一个匹配字符位置
14. int indexOf(int ch, int fromIndex) :fromIndex开始找第一个匹配字符位置
15. int indexOf(String str) :只找第一个匹配字符串位置
16. int indexOf(String str, int fromIndex) :从fromIndex开始找第一个匹配字符串位置
      例如:String s = new String("write once, run anywhere!");
              String ss = new String("run");
              System.out.println("s.indexOf('r'): " + s.indexOf('r') );
              System.out.println("s.indexOf('r',2): " + s.indexOf('r',2) );
              System.out.println("s.indexOf(ss): " + s.indexOf(ss) );
              结果为:s.indexOf('r'): 1
                      s.indexOf('r',2): 12
                      s.indexOf(ss): 12
17. int lastIndexOf(int ch)
18. int lastIndexOf(int ch, int fromIndex)
19. int lastIndexOf(String str)
20. int lastIndexOf(String str, int fromIndex) 以上四个方法与13、14、15、16类似,不同的是:找后一个匹配的内容
public class CompareToDemo {
      public static void main (String[] args) {
           String s1 = new String("acbdebfg");
      
           System.out.println(s1.lastIndexOf((int)'b',7));
     }
}
运行结果5
       (其中fromIndex的参数为 7,是从字符串acbdebfg的最后一个字符g开始往前数的位数。既是从字符c开始匹配,寻找最后一个匹配b的位置。所以结果为 5


21. int length() :返回当前字符串长度
22. String replace(char oldChar, char newChar) :将字符号串中第一个oldChar替换成newChar
23. boolean startsWith(String prefix) :该String对象是否以prefix开始
24. boolean startsWith(String prefix, int toffset) :该String对象从toffset位置算起,是否以prefix开始
     例如:String s = new String("write once, run anywhere!");
             String ss = new String("write");
             String sss = new String("once");
             System.out.println("s.startsWith(ss): " + s.startsWith(ss) );
             System.out.println("s.startsWith(sss,6): " + s.startsWith(sss,6) );
             结果为:s.startsWith(ss): true
                     s.startsWith(sss,6): true
25. String substring(int beginIndex) 取从beginIndex位置开始到结束的子字符串
26.String substring(int beginIndex, int endIndex) :取从beginIndex位置开始到endIndex位置的子字符串
27. char[ ] toCharArray() :将该String对象转换成char数组
28. String toLowerCase() :将字符串转换成小写
29. String toUpperCase() :将字符串转换成大写。
     例如:String s = new String("java.lang.Class String");
             System.out.println("s.toUpperCase(): " + s.toUpperCase() );
             System.out.println("s.toLowerCase(): " + s.toLowerCase() );
             结果为:s.toUpperCase(): JAVA.LANG.CLASS STRING
                  s.toLowerCase(): java.lang.class string
30. static String valueOf(boolean b)
31. static String valueOf(char c)
32. static String valueOf(char[] data)
33. static String valueOf(char[] data, int offset, int count)
34. static String valueOf(double d)
35. static String valueOf(float f)
36. static String valueOf(int i)
37. static String valueOf(long l)
38. static String valueOf(Object obj)
     以上方法用于将各种不同类型转换成Java字符型。这些都是类方法。

 

 

Java中String类的常用方法:

public char charAt(int index)

返回字符串中第index个字符;
public int length()
返回字符串的长度;
public int indexOf(String str)
返回字符串中第一次出现str的位置;
public int indexOf(String str,int fromIndex)
返回字符串从fromIndex开始第一次出现str的位置;
public boolean equalsIgnoreCase(String another)
比较字符串与another是否一样(忽略大小写);
public String replace(char oldchar,char newChar)
在字符串中用newChar字符替换oldChar字符
public boolean startsWith(String prefix)
判断字符串是否以prefix字符串开头;
public boolean endsWith(String suffix)
判断一个字符串是否以suffix字符串结尾;
public String toUpperCase()
返回一个字符串为该字符串的大写形式;
public String toLowerCase()
返回一个字符串为该字符串的小写形式
public String substring(int beginIndex)
返回该字符串从beginIndex开始到结尾的子字符串;
public String substring(int beginIndex,int endIndex)
返回该字符串从beginIndex开始到endsIndex结尾的子字符串
public String trim()
返回该字符串去掉开头和结尾空格后的字符串
public String[] split(String regex)
将一个字符串按照指定的分隔符分隔,返回分隔后的字符串数组
实例:  
public class SplitDemo{
     public static void main (String[] args) {

             String date = "2008/09/10";
            String[ ] dateAfterSplit= new String[3];
            dateAfterSplit=date.split("/");         //以“/作为分隔符来分割date字符串,并把结果放入3个字符串中。

            for(int i=0;i<dateAfterSplit.length;i++)
                       System.out.print(dateAfterSplit[i]+" ");
      }
}

运行结果2008 09 10          //结果为分割后的3个字符串

实例:
TestString1.java:
程序代码
public class TestString1
{
    public static void main(String args[]) {
        String s1 = "Hello World" ;
        String s2 = "hello world" ;
        System.out.println(s1.charAt(1)) ;
        System.out.println(s2.length()) ;
        System.out.println(s1.indexOf("World")) ;
        System.out.println(s2.indexOf("World")) ;
        System.out.println(s1.equals(s2)) ;
        System.out.println(s1.equalsIgnoreCase(s2)) ;

        String s = "我是J2EE程序员" ;
        String sr = s.replace('我','你') ;
        System.out.println(sr) ;
    }
}

TestString2.java:
程序代码

public class TestString2
{
    public static void main(String args[]) {
        String s = "Welcome to Java World!" ;
        String s2 = "   magci   " ;
        System.out.println(s.startsWith("Welcome")) ;
        System.out.println(s.endsWith("World")) ;
        String sL = s.toLowerCase() ;
        String sU = s.toUpperCase() ;
        System.out.println(sL) ;
        System.out.println(sU) ;
        String subS = s.substring(11) ;
        System.out.println(subS) ;
        String s1NoSp = s2.trim() ;
        System.out.println(s1NoSp) ;
    }

 

==========================================================

==========================================================

Java语法总结 -字符串

JavaString
太特别了,也太常用了,所以重要。我初学Java就被它搞蒙了,太多混淆的概念了,比如它的不变性。所以必须深入机制地去理解它。


1String
中的每个字符都是一个16位的Unicode字符,用Unicode很容易表达丰富的国际化字符集,比如很好的中文支持。甚至Java的标识符都可以用汉字,但是没人会用吧(只在一本清华的《Java2实用教程》看过)。

2、判断空字符串。根据需要自己选择某个或者它们的组合

    if ( s == null )   //从引用的角度

    if ( s.length() == 0 )    //从长度判别

    if ( s.trim().length () == 0 )    //是否有多个空白字符

trim()方法的作用是是移除前导和尾部的Unicode
值小于'"u0020'的字符,并返回修剪好的字符串。这种方法很常用,比如需要用户输入用户名,用户不小心加了前导或者尾部空格,一个好的程序应该知道用户不是故意的,即使是故意的也应该智能点地处理。
判断空串是很常用的操作,但是Java类库直到1.6才提供了isEmpty()方法。当且仅当 length() 0 时返回 true

3、未初始化、空串""
null。它们是不同的概念。对未初始化的对象操作会被编译器挡在门外;null是一个特殊的初始化值,是一个不指向任何对象的引用,对引用为null的对象操作会在运行时抛出异常NullPointerException;而空串是长度为0的字符串,和别的字符串的唯一区别就是长度为0
例子:
    public class StringTest{
        staticString s1;
        publicstatic void main(String[] args) {
           String s2;
           String s3 = "";
           System.out.print(s1.isEmpty());     //运行时异常

           System.out.print(s2.isEmpty());     //编译出错

           System.out.print(s3.isEmpty());     //ok!输出true

        }
    }

4String类的方法很多,在编写相关代码的时候看看JDK文档时有好处的,要不然花了大量时间实现一个已经存在的方法是很不值得的,因为编写、测试、维护自己的代码使项目的成本增加,利润减少,严重的话会导致开不出工资……

5、字符串的比较。
Java不允许自定义操作符重载,因此字符串的比较要用compareTo()
或者 compareToIgnoreCase()s1.compareTo(s2),返回值大于0则,则前者大;等于0,一般大;小于0,后者大。比较的依据是字符串中各个字符的Unicode值。

6toString()
方法。
Java的任何对象都有toString()
方法,是从Object对象继承而来的。它的作用就是让对象在输出时看起来更有意义,而不是奇怪的对象的内存地址。对测试也是很有帮助的。

7String
对象是不变的!可以变化的是String对象的引用。
String name = "ray";
name.concat("long");  //字符串连接

System.out.println(name); //输出name
ok,还是"ray"
name = name.concat("long");  //把字符串对象连接的结果赋给了name引用
System.out.println(name);  //输出name
oh!,变成了"raylong"
上述三条语句其实产生了3String对象,"ray""long""raylong"。第2条语句确实产生了"raylong"字符串,但是没有指定把该字符串的引用赋给谁,因此没有改变name引用。第3条语句根据不变性,并没有改变"ray"JVM创建了一个新的对象,把"ray""long"的连接赋给了name引用,因此引用变了,但是原对象没变。

8String
的不变性的机制显然会在String常量内有大量的冗余。如:"1" +"2" + "3" +......+ "n"产生了n+(n+1)String对象!因此Java为了更有效地使用内存,JVM留出一块特殊的内存区域,被称为“String常量池。对String多么照顾啊!当编译器遇见String常量的时候,它检查该池内是否已经存在相同的String常量。如果找到,就把新常量的引用指向现有的String,不创建任何新的String常量对象。

那么就可能出现多个引用指向同一个String常量,会不会有别名的危险呢?No problemString对象的不变性可以保证不会出现别名问题!这是String对象与普通对象的一点区别。

乍看起来这是底层的机制,对我们编程没什么影响。而且这种机制会大幅度提高String的效率,实际上却不是这样。为连接n个字符串使用字符串连接操作时,要消耗的时间是n的平方级!因为每两个字符串连接,它们的内容都要被复制。因此在处理大量的字符串连接时,而且要求性能时,我们不要用StringStringBuffer是更好的选择。

8StringBuffer
类。StringBuffer类是可变的,不会在字符串常量池中,而是在堆中,不会留下一大堆无用的对象。而且它可将字符串缓冲区安全地用于多个线程。每个StringBuffer对象都有一定的容量。只要StringBuffer对象所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。这个固定的容量是16个字符。我给这种算法起个名字叫添饭算法。先给你一满碗饭,不够了再给你一满碗饭。
例子:
    StringBuffer sb = newStringBuffer();    //初始容量为 16
个字符
   sb.append("1234");    //这是4
个字符,那么16个字符的容量就足够了,没有溢出
   System.out.println(sb.length());    //输出字符串长度是4

   System.out.println(sb.capacity());    //输出该字符串缓冲区的容量是16

    sb.append("12345678901234567");       //这是17个字符,16个字符的容量不够了,扩容为17+16个字符的容量
   System.out.println(sb.length());    //输出字符串长度是17

   System.out.println(sb.capacity());    //输出该字符串缓冲区的容量是34

   sb.append("890").reverse().insert(10,"-");   
   System.out.println(sb);        //输出0987654321-09876543214321

字符串的长度和字符缓冲区的容量是两个概念,注意区别。
还有串联的方式看起来是不是很酷!用返回值连接起来可以实现这种简洁和优雅。

10StringBuilder
类。J2SE 5.0提供了StringBuilder类,它和StringBuffer类是孪生兄弟,很像。它存在的价值在于:对字符串操作的效率更高。不足的是线程安全无法保证,不保证同步。那么两者性能到底差多少呢?很多!
请参阅:http://book.csdn.net/bookfiles/135/1001354628.shtml
实践:
单个线程的时候使用StringBuilder类,以提高效率,而且它的APIStringBuffer兼容,不需要额外的学习成本,物美价廉。多线程时使用StringBuffer,以保证安全。

11、字符串的比较。

下面这条可能会让你晕,所以你可以选择看或者不看。它不会对你的职业生涯造成任何影响。而且谨记一条,比较字符串要用equals()ok了!一旦用了“==”就会出现很怪异的现象。之所以把这部分放在最后,是想节省大家的时间,因为这条又臭又长。推荐三种人:一、没事闲着型。二、想深入地理解Java的字符串,即使明明知道学了也没用。三、和我一样爱好研究字有几种写法。

还是那句老话,String太特殊了,以至于某些规则对String不起作用。个人感觉这种特殊性并不好。看例子:
例子A
    String str1 = "java";
    String str2 = "java";
    System.out.print(str1==str2);
地球上有点Java基础的人都知道会输出false,因为==比较的是引用,equals比较的是内容。不是我忽悠大家,你们可以在自己的机子上运行一下,结果是true!原因很简单,String对象被放进常量池里了,再次出现“java”字符串的时候,JVM很兴奋地把str2的引用也指向了“java”对象,它认为自己节省了内存开销。不难理解吧呵呵
例子B
    String str1 = newString("java");
    String str2 = newString("java");
    System.out.print(str1==str2);
看过上例的都学聪明了,这次肯定会输出true!很不幸,JVM并没有这么做,结果是false。原因很简单,例子A中那种声明的方式确实是在String常量池创建“java”对象,但是一旦看到new关键字,JVM会在堆中为String分配空间。两者声明方式貌合神离,这也是我把如何创建字符串对象放到后面来讲的原因。大家要沉住气,还有一个例子。
例子C
    String str1 = "java";
    String str2 = "blog";
    String s = str1+str2;
   System.out.print(s=="javablog");
再看这个例子,很多同志不敢妄言是true还是false了吧。爱玩脑筋急转弯的人会说是false……恭喜你,你会抢答了!把那个字去掉你就完全正确。原因很简单,JVM确实会对型如String str1 ="java"; String对象放在字符串常量池里,但是它是在编译时刻那么做的,而String s = str1+str2;是在运行时刻才能知道(我们当然一眼就看穿了,可是Java必须在运行时才知道的,人脑和电脑的结构不同),也就是说str1+str2是在堆里创建的,s引用当然不可能指向字符串常量池里的对象。没崩溃的人继续看例子D
例子D
    String s1 = "java";
    String s2 = newString("java");
   System.out.print(s1.intern()==s2.intern());
intern()是什么东东?反正结果是true
。如果没用过这个方法,而且训练有素的程序员会去看JDK文档了。简单点说就是用intern()方法就可以用“==”比较字符串的内容了。在我看到intern()方法到底有什么用之前,我认为它太多余了。其实我写的这一条也很多余,intern()方法还存在诸多的问题,如效率、实现上的不统一……
例子E
    String str1 = "java";
    String str2 = newString("java");
   System.out.print(str1.equals(str2));
无论在常量池还是堆中的对象,用equals()方法比较的就是内容,就这么简单!看完此条的人一定很后悔,但是在开始我劝你别看了……

后记:用彪哥的话说有意思吗?,确实没劲。在写这段的时候我也是思量再三,感觉自己像孔乙己炫耀字有几种写法。我查了一下茴,回,囘,囬,还有一种是字里面有个字,后面这四个都加上草字头……



===============================================================


===============================================================

String类主要方法的使用:

1、获取长度 *.length();//这与数组中的获取长度不同,*.length;

2、比较字符串(1) equals() //判断内容是否相同

(2)compareTo() //判断字符串的大小关系

(3)compareToIgnoreCase(String int) //在比较时忽略字母大小写

(4)==   //判断内容与地址是否相同

(5)equalsIgnoreCase() //忽略大小写的情况下判断内容是否相同

如果想对字符串中的部分内容是否相同进行比较,可以用

(6)reagionMatches() //有两种 public boolean regionMatches(int toffset, String other,int ooffset,int len);表示如果String对象的一个子字符串与参数other的一个子字符串是相同的字符序列,则为true.要比较的String 对象的字符串从索引toffset开始,other的字符串从索引ooffset开始,长度为len。

public boolean reagionMatches(boolean ignoreCase,int toffset,String other,int ooffset,int len);//用布尔类型的参数指明两个字符串的比较是否对大小写敏感。

一、查找字符串中某个位置的字符

public char charAt(int index);//返回指定索引index位置上的字符,索引范围从0开始

四、查找指定字符串在字符串中第一次或最后一词出现的位置

在String类中提供了两种查找指定位置的字符串第一次出现的位置的方法

(1)public int indexOf(String str);//从字符串开始检索str,并返回第一次出现的位置,未出现返回-1

(2)public int indexOf(String str,int fromIndex);//从字符串的第fromIndex个字符开始检索str

查找最后一次出现的位置有两种方法

(1)public int lastIndexOf(String str);

(2)public int lastIndexOf(String str,int fromIndex);

如果不关心字符串的确切位置则可使用public boolean contains(CharSequence s);

二、检查字符串的起始字符和结束字符

开始的字符串两种方法

(1)public boolean starWith(String prefix,int toffset);//如果参数prefix表示的字符串序列是该对象从索引toffset处开始的子字符串,则返回true

(2)public boolean starWith(String prefix);

结束的字符串方法

public boolean endsWith(String suffix);

三、截取子串

(1)public String subString(int beginIndex);

(2)public String subString(int beginIndex,int endIndex);//返回的字符串是从beginIndex开始到endIndex-1的串

要返回后4位可以这样写Syetem.out.println(*.subString()(*.length()-4));

四、字符串的替换

两种方法

(1)public String replace(char oldChar,char newChar);

(2)public String replace(CharSequence target,CharSequence replacement);//把原来的etarget子序列替换为replacement序列,返回新串

(3)public String replaceAll(String regex,String replacement);//用正则表达式实现对字符串的匹配

五、字符串的大小写替转换

(1)public String toLowerCase(Locale locale);

(2)public String toLowerCase();

(3)public String toupperCase(Locale locale);

(4)public String toUpperCase();

六、去除字符串首尾空格

*.trim();

七、字符串转换

1、将字符串转换成字符数组

public char[] toCharArray();

2、将字符串转换成字符串数组

public String[] split(String regex);//regex 是给定的匹配

3、将其它数据类型转化为字符串

(1)public static String valueOf(boolean b);

(2)public static String valueOf(char c);

(3)public static String valueOf(int i);

(4)public static String valueOf(long i);

(5)public static String valueOf(float f);

(6)public static String valueOf(double d);

(7)public static String valueOf(char[] data);

(8)public static String valueOf(Object obj);

可变字符串的创建和初始化

两种方法:

public StringBuffer();

public StringBuffer(int caoacity);

StringBuffer类主要方法的使用:

一、获取可变字符串长度

(1)public int length();

(2)public int capacity();

(3)public void setLength(int newLength);

二、比较可变字符串

用String 类的equals()方法比较,但是不同。

类Object中的equals()方法比较的是两个对象的地址是否相等,而不仅仅是比较内容,但是String类在继承Object类的时候重写了equals()方法,只是比较两个对象的内容是否相等

而在StringBuffer类中没有重写Object类的equals()方法,所以比较的是地址和内容。

三、追加和插入字符串

(1)追加 public StringBuffer append(type t);

(2)插入 public StringBuffer insert(int offset,type t);//在offset处加入类型为type的字符串

四、反转和删除字符串

(1)反转 public StringBuffer reverse();

(2)删除 public StringBuffer delete(int start,int end);

五、减少用于可变字符序列的存储空间

public void trimToSize();

六、StringBuffer类转换成String类

public String toString();



你可能感兴趣的:(程序开发Java)