Java中, String, StringBuilder 和StringBuffer的对比

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

Java中, String, StringBuilder 和StringBuffer的对比

考虑下面的代码,其中包含三个不同类型的参数(String,StringBuffer和StringBuilder)的连接函数。

// Java program to demonstrate difference between String,
// StringBuilder and StringBuffer
class Geeksforgeeks
{
    // Concatenates to String
    public static void concat1(String s1)
    {
        s1 = s1 + "forgeeks";
    }

    // Concatenates to StringBuilder
    public static void concat2(StringBuilder s2)
    {
        s2.append("forgeeks");
    }

    // Concatenates to StringBuffer
    public static void concat3(StringBuffer s3)
    {
        s3.append("forgeeks");
    }

    public static void main(String[] args)
    {
        String s1 = "Geeks";
        concat1(s1);  // s1 is not changed
        System.out.println("String: " + s1);

        StringBuilder s2 = new StringBuilder("Geeks");
        concat2(s2); // s2 is changed
        System.out.println("StringBuilder: " + s2);

        StringBuffer s3 = new StringBuffer("Geeks");
        concat3(s3); // s3 is changed
        System.out.println("StringBuffer: " + s3);
    }
}

输出:

String: Geeks
StringBuilder: Geeksforgeeks
StringBuffer: Geeksforgeeks

说明:
1. Concat1:在这个方法中,我们传递一个字符串“Geeks”并执行“s1 = s1 +”forgeeks“。从main()传递的字符串没有改变,这是由于String是不可变的。更改字符串的值将创建另一个对象,并且concat1()中的s1存储新字符串的引用。main()和cocat1()中的引用s1引用不同的字符串。

2. Concat2:在这个方法中,我们传递一个字符串“Geeks”并执行“s2.append(”forgeeks“)”,它将字符串的实际值(主要)改为“Geeksforgeeks”。这是由于一个简单的事实,即StringBuilder是可变的,因此改变了它的值。

2. Concat3:StringBuffer类似于StringBuilder,不同之处在于StringBuffer是线程安全的,即多线程可以毫无问题地使用它。线程安全带来了性能的损失。
何时使用哪一个:

  • 如果一个字符串在整个程序中保持不变,那么使用String类对象是因为String对象是不可变的。
  • 如果一个字符串可以改变(例如:字符串构造中的大量逻辑和操作)并且只能从单个线程访问,那么使用StringBuilder就足够了。
  • 如果一个字符串可以改变,并且会从多个线程访问,那么使用一个StringBuffer,因为StringBuffer是同步的,所以你有线程安全性。

Java中字符串类型之间的转换

有时需要将诸如String,StringBuffer,StringBuilder等不同类的字符串对象转换为另一个类。以下是一些相同的技术。

  1. 从String到StringBuffer和StringBuilder:这个很简单。我们可以直接将String类对象传递给StringBuffer和StringBuilder类的构造函数。由于String类在java中是不可变的,因此为了编辑字符串,我们可以通过将其转换为StringBuffer或StringBuilder类对象来执行它。下面是展示相同的Java程序。
    // Java program to demonstrate conversion from 
    // String to StringBuffer and StringBuilder.
    public class Test 
    {
    	public static void main(String[] args)
    	{
    		String str = "Geeks";
    		
    		// conversion from String object to StringBuffer
    		StringBuffer sbr = new StringBuffer(str);
    		sbr.reverse();
    		System.out.println(sbr);
    		
    		// conversion from String object to StringBuilder
    		StringBuilder sbl = new StringBuilder(str);
    		sbl.append("ForGeeks");
    		System.out.println(sbl);
    	}
    }
    

    输出:

    skeeG
    GeeksForGeeks
    
  2. 从StringBuffer和StringBuilder到String:可以使用在StringBuffer和StringBuilder类中都被覆盖的toString()方法执行此转换。
    下面是展示相同的Java程序。请注意,虽然我们使用toString()方法,但是一个新的String对象(在堆区域中)被分配并初始化为当前由StringBuffer对象表示的字符序列,这意味着对StringBuffer对象的后续更改不会影响String对象的内容。

    // Java program to demonstrate conversion from 
    // String to StringBuffer and StringBuilder.
    public class Test 
    {
    	public static void main(String[] args)
    	{
    		StringBuffer sbr = new StringBuffer("Geeks");
    		
    		// conversion from StringBuffer object to String
    		String str = sbr.toString();
    		System.out.println(str);
    		
    		// conversion from StringBuilder object to String
    		String str1 = sbr.toString();
    	    System.out.println(str1);
    	    
    	    // changing StringBuffer object sbr
            // but String object(str) doesn't change
    	    sbr.append("ForGeeks");
    	    System.out.println(sbr);
    	    System.out.println(str);
    	    
    	}
    }
    

    输出:

    Geeks
    Geeks
    GeeksForGeeks
    Geeks
  3. 从StringBuffer到StringBuilder或反之亦然:这种转换是棘手的。没有直接的方法来转换它。在这种情况下,我们可以使用一个String类对象。我们首先使用toString()方法将StringBuffer / StringBuilder对象转换为String ,然后使用构造函数将String转换为StringBuilder / StringBuffer。下面是展示相同的Java程序。
    // Java program to demonstrate conversion from 
    // String to StringBuffer and StringBuilder.
    public class Test 
    {
    	public static void main(String[] args)
    	{
    		StringBuffer sbr = new StringBuffer("Geeks");
    		
    		// conversion from StringBuffer object to StringBuilder
    		String str = sbr.toString();
    		StringBuilder sbl = new StringBuilder(str);
    		
    		System.out.println(sbl);
    		
    	}
    }
    

    输出:

    Geeks

结论:

  • String的对象是不可变的,StringBuffer和StringBuilder的对象是可变的。
  • StringBuffer和StringBuilder类似,但对于单线程程序,StringBuilder比StringBuffer更快,更受欢迎。如果需要线程安全,则使用StringBuffer。
  •   本文标题:Java中, String, StringBuilder 和StringBuffer的对比 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/3958.html
    扫描二维码添加微信 
  • ,领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘优惠券!添加微信后,分享淘宝选中的机械键盘给淘宝机器人即可领取!
    支持我们,就用微信淘宝!

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读