java中String stringBuffer StringBuider 深入理解

首先要明白,java只用的wrapper类型都是不可变的,什么是不可变类型呢?顾名思义,就是这种类型的对象一旦创建好之后,无论调用何种方法都无法改变该对象的任何的属性。String 源码中,它的所有属性都是private final的,因此,只有在构造string对象的时候,这些属性才是可以修改的,string类的方法中需要返回一个string的,如subString,concat等方法,都会先构造一个新的string对象,然后再返回,而原来的string对象是不会发生改变的。

StringBuffer与数组的区别:

stringbuffer:长度可变,而数组的长度不可变。

StringBuffer 与 StringBuider :

StringBuffer 是synchronized,线程安全的,在多线程中使用。

StringBuider 是非线程安全的,在单线程中使用(比较普遍)。该类是作为StringBuffer 类的一个简单的替换。

String类和StringBuider主要性能区别:

String:  每次对String类型对象改变时,都会生成一个新的String对象,然后将指针指向新的string对象,所以经常改变内容的字符串最             好不要使用String。因为每次生成的对象都会对系统性能产生影响,特别当内存中无引用的对象多了以后,JVM的GC就开始工          
    作,系统的性能就会降低。

StringBuffer:  使用StringBuffer对象时,每次都会对对象本身进行操作,而不是生成新的对象并改变对象引用,所以多次情况下,尤                         其在字符串对象经常改变的情况下使用StringBuffer。

但是使用:String s1="this"+"is"+"a"+"simple"+"test";

比  StringBuffer sb=new StringBuffer("this is a ").append("simple").append("test");

快,因为在JavaCompiler中,会把第一个语句自动编译为:String s1="this is a simple test";

但,拼接的字符串来自另外的String对象的话,JavaCompiler就不会自动转换了,速度也就慢了,比如下面这样的。

String s2="this is a";

String s3="simple";

String s4="test";

String s1=s2+s3+s4;

这时候,Java compiler会股规矩矩的按照原来的方式去做。String的concatenation(即+)操作利用了StringBuffer(或StringBuider)的append方法实现,此时,对于上述情况,若,s2,s3,s4采用String定义,拼接时需要额外创建一个

StringBuffer(或StringBuider)之后将StringBuffer转换为String;而且S1在运行时才能知道具体的值。若采用StringBuffer

则,不需要额外创建StringBuffer 。

 使用原则:

1.如果操作少量数据,用String;单线程操作大量数据用StringBuider 。多线程大量数据用StringBuffer

2.不要使用String类的"+"操作,来频繁拼接,因为那样性能极差,应该使用StringBuffer 或者StringBuider。这在java的优化上 
 也是一条重要原则。

3.为了获得更好的性能,在构造StringBuffer 或者StringBuider的时候应该尽量可能指定他们的容量。如果操作的字符串长度 (length)不超过容量为16个字符的对象就不用了。超过的话,不指定容量会降低性能。

4.StringBuider一般使用在方法内部来完成类似"+"的功能。因为是线程不安全的,所以用完就可以丢弃。StringBuffer
主要用 在全局变量。

5.相同情况下,使用StringBuider相比使用StringBuffer
仅能获得10%~·5%左右的性能提升,却要冒着多线程不安全的风险。

非可变类(immutable)的真正唯一缺点:对于每一个不同的值都要求一个单独的对象。

                   优点:容易设计,实现和使用,不易出错,线程安全,在其生命周期内它的值永远不变。

StringBuffer 充当了String的Companying class(配套累)

StringBuffer的常用方法:

StringBuffer append("data");//将指定的数据(各种数据)作为参数,添加到已有的数据结尾处

StringBuffer  insert(index,"data");//可以将数据插入到指定Index的位置

StringBuffer  delete(start,end);//删除start(包含)到end(不包含)

等等。。可以去手册查询。这里不再列出。

最后再举个例子:

package com.test;
public class test {
    public static void main(String[] args) {
      String[] arr=new String[10];
        for(int i=0;i<arr.length;i++){
           arr[i]="value"+i;
         }
        String result="";
        for(String s:arr){//这个foreach语句产生了10个对象,九个没用的垃圾对象,最终被GC回收,降低系统性能,最后只剩下一个我们想要的有<span style="white-space:pre">			</span>//用的对象。
            result+=s;
        }
        System.out.println(result);
     }
} 

输出结果:

value0value1value2value3value4value5value6value7value8value9;

再举一个例子:

String s=new String("abc");

上述语句中"abc"在编译时候,本身就是pool中的一个对象,而在运行时执行new String("abc")时,将pool中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给了s。所以上面这句话,就创建了两个String对象,一个在String pool 中一个在heap中。

例题:以下程序创建了几个对象?

package com.test;
public class test {
    public static void main(String[] args) {
      String A,B,C;
      A="a";//第一个对象
      B="b";//第二个
      A=A+B;//第三个,此时引用变量A指向"ab"对象,原来指向的"a"对象成为垃圾对象,会被GC回收
      StringBuffer D=new StringBuffer("abc");//直接产生两个对象。一个在string pool 一个在heap
      D=D.append("567");//在D对象本身上修改的操作,不产生新的对象。
     }
}   

结论,一共产生了5个对象。

时间: 2024-10-03 03:47:14

java中String stringBuffer StringBuider 深入理解的相关文章

Java中String,StringBuffer与StringBuilder的差别

String 字符串常量: StringBuffer 字符串变量〈缓冲区〉(线程安全): StringBuilder 字符串变量〈缓冲区〉(非线程安全): 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响

java中String&amp;StringBuffer&amp;StringBuilder

1. String,字符串常量 StringBuffer,字符串变量(线程安全) StringBuilder,字符串变量(非线程安全) 2.String and StringBuffer String和StringBuffe的主要区别在于String是不可变对象,每次对String进行改变的时候其实 等于生成了一个新的String对象,因此经常改变内容的字符串不要使用String类型,因为每次形成新的对象都会对系统的性能产生影响,特别当内存中的无引用的对象多了之后,JVM的GC就会开始工作,那速

java中string,stringBuffer和StringBuider

最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 0.string是内容不可变的字符串.底层使用了不可变的字符数组(final char[]) 而StringBuffer,StringBuilder底层使用的是可变的字符数组 1.三者在执行速度方面的比较:StringBuil

java中string , StringBuffer , StringBuilder 区别

1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这样的值,虚拟机则会另外在方法区中划分出一块内存空间存储字符串常量,然后把这块地址赋给String变量. 因此,String类的内容声明后不可被改变,改变的只是其内存地址的指向. 2.StringBuffer StringBuffer是使用缓冲区存储字符串对象的,对象的内容可以改变.并且是线程安全的.

Java中String, StringBuffer, StringBuilder

String: 1,是字符串常量,一旦创建就不能修改.对于已经存在了的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. 2,String也是final类,不能被继承. 3,而且String是对象而不是基本类型. 4,string重写了equals方法和hashCode()方法. StingBuffer: 1,是字符串可变对象,可以对字符串进行操作,修改字符串原有值时不会新建一个对象. 2,执行效率较慢,但是线程安全 3,StringBuffer没有覆盖equals方法和ha

java中String、StringBuffer、StringBuilder的区别

java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的. private final char value[]; StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在Abstra

Java基础——java中String、StringBuffer、StringBuilder的区别

(转自:http://www.cnblogs.com/xudong-bupt/p/3961159.html) java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的. private final char value[]; Strin

java中String、StringBuffer、StringBuilder的总结

看了很多关于java的string的相关知识,这里做一个较为全面的总结,内容转自不同地方的博客,鉴于出处较多,就不一一列举了. java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 1.可变与不可变 String类中使用字符数组保存字符串

探秘Java中String、StringBuilder以及StringBuffer

探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它们的异同点以及了解各个类适用的场景.下面是本文的目录大纲: 一.你了解String类吗? 二.深入理解String.StringBuffer.StringBuilder 三.不同场景下三个类的性能测试 四.常见的关于