字符串 vs 字符串缓冲器 vs 字符串构造器

String是Java中使用最广泛的类之一. StringBuffer和StringBuilder类提供了操纵字符串的方法. 我们将研究StringBuffer和StringBuilder之间的区别。

String 对 StringBuffer 对 StringBuilder

字符串是核心Java采访中最重要的话题之一. 如果你正在编写一个在控制台上打印东西的程序,你正在使用字符串。本教程旨在专注于字符串类的主要特征。

Java 中的 String

  1. 联合国 字符串类代表字符串,我们可以以两种方式即时化字符串. QQ 字符串="ABC"; / 或 字符串=新字符串 ("ABC"); QQ
  2. 弦在爪哇语中是不可改变的. 因此它适合被多线性环境所使用. 我们可以在各种职能之间分享数据,因为不存在数据不一致的问题。 (_) (英语). 当我们使用双引号创建字符串时,JVM首先在字符串池中以相同值寻找字符串. 如果找到,则返回池中字符串对象的引用。 否则,它会在字符串池中创建字符串对象并返回引用. JVM通过在不同线程中使用相同的字符串来保存大量内存.
  3. 如果新运算符用于创建字符串,则会在堆积内存中被创建.
    • 运算符已超载 String 。 我们可以用它来调和两个弦。 虽然内部使用 StringBuffer 来进行此动作.
  4. 字符串覆盖[等 ()和散列Code ()] (/community/tutoris/java-equers-hashcode) 方法 。 两个字符串只有具有相同的字符序列时才相等. 等值()方法对大小写敏感。 如果您正在寻找对大小写不敏感的检查, 您应该使用等效的 IgnoreCase () 方法 。 7 。 字符串对字符流使用UTF-16编码.
  5. 弦是决赛 除了"私家散列"之外,所有栏目都是最后的 此字段包含 hashCode () 函数值 。 散列码值只有在第一次调用散列码( ()) 方法并在此字段中缓存时才会被计算出. 此外,散列是使用 String 类的最后字段生成的,并有一些计算. 因此,每次使用散列Code()方法时,都会产生相同的输出. 对于呼叫者来说,似乎每次都在进行计算,但内部却被缓存在散列场中. ( (英语)

String 与 StringBuffer

由于 String 在 Java 中是不可变的,所以每当我们进行 String 操纵时,它会生成一个新的 String,并将旧的 String 丢弃用于垃圾收集,这些操作是沉重的,并且在堆积中产生了大量垃圾,所以 Java 提供了 StringBuffer 和 StringBuilder 类,这些类应该用于 String 操纵。

StringBuffer 与 StringBuilder 相比

StringBuffer 在大多数情况下,我们不使用 String 在多线环境中,所以Java 1.5 引入了一个新的类 StringBuilder,它与 StringBuffer 类似,除了线程安全和同步之外。 StringBuffer 提供线程安全,但具有性能成本。在大多数情况下,我们不使用 String 在多线环境中。因此,Java 1.5 引入了一个新的类 StringBuilder,除了线程安全和同步之外,StringBuffer 还有一些额外的方法,如基线,长度,容量,TrimToSize等。然而,这些方法不需要,因为你在 String 中都有所有这些。这就是为什么这些方法在 StringBuilder 类中从未实施过。 StringBuffer 在 Java 1.0 中引入,而 StringBuilder 在 Java 1.5 中引入了 String

StringBuilder 与 StringBuffer 性能

我试图检查性能的影响,因为它与一个实例程序同步,该程序在 StringBuffer 和 StringBuilder 对象上执行 append() 多次。

 1package com.journaldev.java;
 2
 3import java.util.GregorianCalendar;
 4
 5public class TestString {
 6
 7    public static void main(String[] args) {
 8    	System.gc();
 9    	long start=new GregorianCalendar().getTimeInMillis();
10    	long startMemory=Runtime.getRuntime().freeMemory();
11    	StringBuffer sb = new StringBuffer();
12    	//StringBuilder sb = new StringBuilder();
13    	for(int i = 0; i<10000000; i++){
14    		sb.append(":").append(i);
15    	}
16    	long end=new GregorianCalendar().getTimeInMillis();
17    	long endMemory=Runtime.getRuntime().freeMemory();
18    	System.out.println("Time Taken:"+(end-start));
19    	System.out.println("Memory used:"+(startMemory-endMemory));
20    }
21}

我也为 StringBuffer 对象运行了相同的代码,以检查时间和内存值. 我为每个案例执行了代码 5 次,然后计算了平均值。

Value of iStringBuffer (Time, Memory)StringBuilder (Time, Memory)
10,00,000808, 149356704633, 149356704
1,00,00,0007448, 1477838886179, 147783888

显而易见,StringBuilder 即使在单线程环境中也比 StringBuffer 更出色,这种性能差异可能是 StringBuffer 方法中的同步造成的。

String 对 StringBuffer 对 StringBuilder

  1. StringBuilder 是不可变的,而 StringBuffer 和 StringBuilder 是可变的类
  2. StringBuffer 是线程安全和同步的,而 StringBuilder 不是。这就是为什么 StringBuilder 比 StringBuffer 更快
  3. Stringconcatenation 操作员 (+) 内部使用 StringBuffer 或 StringBuilder 类
  4. 对于非多线程环境中的 String 操作,我们应该使用 StringBuilder 否则使用 StringBuffer 类

这就是 String、StringBuffer 和 StringBuilder 之间的差异的快速整合。StringBuilder 在大多数一般编程场景中比 StringBuffer 更适合。

Published At
Categories with 技术
Tagged with
comments powered by Disqus