首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

String、StringBuilder跟StringBuffer总结

2012-10-19 
String、StringBuilder和StringBuffer总结String类? ? ?在java中字符串是一个不可变的对象,字符串中每个字

String、StringBuilder和StringBuffer总结

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 要快。两者的方法基本相同。

?

热点排行