现在的位置: 首页 > 综合 > 正文

String、StringBuilder和StringBuffer总结

2013年08月10日 ⁄ 综合 ⁄ 共 3247字 ⁄ 字号 评论关闭


String类

     在java中字符串是一个不可变的对象,字符串中每个字符都是一个16位的Unicode字符,由于Unicode字符是16位的,所以用Unicode能够轻松的表示国际化字符集。

    下面先来看下三种String类对象的创建方法:

1. String s = new String();

    s = "abcdef";

  2. String s = "abcdef";

3. String s = new String("abcdef");

     这三个方法都可以创建一个String的对象,之前提到过,String是一个不可以变的对象。我们来看一个例子:

     String s = "abcdef";

     String s2 = s;

     s = s.concat("more stuff"); 

     System.out.println("s = " + s);

     System.out.println("s2 =" + s2);

     VM取得String s 的值,并将"more stuff"添加到其尾部,为我们提供一个"abcdef more stuff"。因为String是不可变的,所以VM不能将这个新的String填充到被s引用的旧的String内。所以它创建了一个新的string对象来存放。而使s引用这个新的对象。所以这个例子有两个String对象:一个是"abcdef"一个是"abcdef more stuff"。

 

      String x = "java";

      x.concat("rules !");

      System.out.println("x = " + x);   //输出"x = java"

      VM创建了一个新的新的对象来存放"java rules !"。但是没有任何变量引用它。第二个String对象会立即丢失,无法访问它。引用变量x仍然引用原来值为"java"的String。

 

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

经典题目:

        String s1 = "spring";

        String s2 = s1 + "summer";

        s1.concat("fall");

        s2.concat(s1);

        s1 += "winter";

        System.out.println(s1 + " " + s2);

        输出是什么?总共创建了几个String对象?和几个引用变量?

 

        答案:

              运行结果为:spring winter spring summer

              总共创建了8个String对象:"spring", "summer" ,"spring summer" ,"fall", "spring fall",

                                                     "spring summer spring ", "winter" ,"spring winter".

              两个引用变量: s1 与 s2

 

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

      随着应用程序的增长,String字面值占用大量的程序内存,对于程序而言,全部的String的字面值往往有大量的冗余。为了使java更高效的使用内存,JVM留出一块特殊的内存区域,称为"String常量池"。当编译器遇到String字面值时,它先检查该池内是否存在一个相同的String字面值。如果找到了,则将新的引用指向这个现有的String,而不是创建新的String对象。如果在String常量池没有这个String则java将在常规内存创建一个新的String对象,并且引用它,而这个String也会放入池中。

String类的重要方法

  1.public char charAt(int index)。该方法返回位于字符串指定索引处的字符。记住字符串索引值是从0开始计算的。       2.public String concat(String s)。该方法返回一个String,其值为将传递给该方法的String后面加入字符串s。

  3.public boolean equalslgnoreCase(String s)。 调用的String与s是否相同,只是字符大小写不同也返回true。

  4.public int length()。返回字符串长度。

  5.public String replace(char old,char new)。用new字符替换old这个字符。

  6.public String substring(int begin)。从begin开始往后的所有字符都截取返回。

  7.public String substring(int begin,int end)。从begin开始到end的所有字符都截取返回。

  8.public String toLowerCase()。返回一个String,大写字符都换成小写字符。

  9.public String toUpperCase()。返回一个String,小写字符都换成大写字符。

  10.public String trim()。去掉String前后的所有空格。

 

StringBuffer与StringBuilder区别

     String对象是不可变的,所以如果决定对String对象进行大量的处理。则最终导致String池中产生大量的被丢弃的String对象。但是StringBuffer与StringBuilder类型的对象就能够被一次次的修改而不会遗留下大量的被丢弃的String对象。

     先来看一下StringBuffer与StringBuilder的使用:

     StringBuffer sb = new StringBuffer("abc");

     sb.append("def");

     System.out.println("sb =" + sb);

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

     StringBuilder sb = new StringBuilder("abc");

     sb.append("def");

     System.out.println("sb =" + sb);

     这个两个例子都不会产生额外的对象,只有对new的一次调用。

 

    Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

       StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

       java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与
StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

抱歉!评论已关闭.