Java中, String, StringBuilder 和StringBuffer的对比

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

    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 字符串
  •   本文标题:Java中, String, StringBuilder 和StringBuffer的对比 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/3958.html

    发表笔记

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

    更多阅读