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类型。

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.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中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) ;
     }

面试题中常见的String类问题



问题1:

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);

这里的结果是true. 由于字符串是常量(内存中创建对象后不能修改), 而且字符串在程序中经常使用. 所以Java对其提供了缓冲区. 缓冲区内的字符串会被共享. 使用双引号的形式定义字符串常量就是存储在缓冲区中的. 使用"abc"时会先在缓冲区中查找是否存在此字符串, 没有就创建一个, 有则直接使用. 第一次使用"abc"时会在缓冲区中创建, 第二次则是直接引用之前创建好的了.


问题2:

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);

这里的结果是false. 使用构造函数创建的字符串都是在缓冲区外面创建一个新的. 所以只要是使用构造函数创建的字符串, 和任何字符串都不会相等.


问题3:

String s1 = "abc";
String s2 = "a";
String s3 = "bc";
String s4 = s2 + s3;
System.out.println(s1 == s4);

这里的结果是false. Java中字符串的相加其内部是使用StringBuilder类的append()方法和toString()方法来实现的. 而StringBuilder类toString()方法返回的字符串是通过构造函数创建的.


问题4:



String s1 = "abc";
String s2 = "a" + "bc";
System.out.println(s1 == s2);

这里的结果是true. 其实这里的s2并没有进行字符串相加, 两个双引号形式的字符串常量相加, 在编译的时候直接会被转为一个字符串"abc".


问题5:

String str = "abc";
str.substring(3);
str.concat("123");
System.out.println(str);           

这里结果是"abc". 由于字符串是常量(内存中创建对象后不能修改), 该类中所有方法都不会改变字符串的值. 如果希望使用一个可变的字符串, 可以使用StringBuilder或StringBuffer类.
String类型的面试题



String类型的面试题

1.       String是最基本的数据类型吗?

基本数据类型包括byte,int,char,long,float,double,boolean,short一共八个.

Java.lang.String类是final类型的,因此不能继承,修改这个类.为了提高效率节省空间,应该用StringBuffer类.

2.       Strings=”Hello”;s=s+”world!”;这两句代码执行后,原始的String对象中的内容变没?

没有,因为String被设计成为不可变类,不能修改,继承,代码执行后,s所指向的对象”hello”没有改变.不过s不指向s,而是指向了另外一个String.原来的对象还在内存中,只是不指向了.

们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。

3.       String是否可以被继承?

不可以,因为String类似final类.

4.       Strings=new String(“xyz”);创建了几个String Object?二者之间有什么区别?

两个或一个,

”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。

5.       String和StringBuffer的区别是什么?

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。String类表示内容不可改变的字符串。

而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。

另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,

而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。

接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。

1. StringBuffer sbf =new StringBuffer();    
2.   
3. for(inti=0;i<100;i++)  
4.   
5. {  
6.   
7.          sbf.append(i);  
8.   
9. }


上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。



1. String str = newString();    
2.   
3. for(inti=0;i<100;i++)  
4.   
5. {  
6.   
7.          str = str + i;  
8.   
9. }


在讲两者区别时,应把循环的次数搞成10000,然后用endTime-beginTime来比较两者执行的时间差异,最后还要讲讲StringBuilder与StringBuffer的区别。

String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。

6.StringBuffer与StringBuilder的区别

StringBuffer和StringBuilder类都表示内容可以被修改的字符串,

StringBuilder是线程不安全的,运行效率高,

如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。

如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。