String vs StringBuffer vs StringBuilder
String vs StringBuffer vs StringBuilder
本文翻译自:https://www.digitalocean.com/community/tutorials/string-vs-stringbuffer-vs-stringbuilder

字符串是Java中使用最广泛的类之一。StringBuffer和StringBuilder类提供了操作字符串的方法。本文将研究StringBuffer和StringBuilder之间的区别。StringBuffer vs StringBuilder是一个流行的Java面试问题。
String vs StringBuffer vs StringBuilder
字符串是核心java访谈中最重要的主题之一。如果您正在编写一个在控制台上打印内容的程序,则使用字符串。本文旨在关注字符串类的主要特性。然后比较StringBuffer和StringBuilder类。
String in Java
字符串类表示字符串,我们可以用两种方式实例化字符串。
String str = "ABC";
// or
String str = new String("ABC");
字符串在Java中是不可变的。因此,它适用于多线程环境。我们可以跨函数共享它,因为不需要担心数据不一致。
当我们使用双引号创建字符串时,JVM首先在字符串池中查找具有相同值的字符串。如果找到,则返回池中字符串对象的引用。否则,它将在字符串池中创建字符串对象并返回引用。JVM通过在不同线程中使用相同的字符串来节省大量内存。
如果使用新运算符创建字符串,则会在堆内存中创建该字符串。
字符串的+运算符重载。我们可以用它连接两个字符串。尽管在内部它使用StringBuffer来执行此操作。
字符串重写equals()和hashCode()方法。只有当两个字符串具有相同的字符序列时,它们才相等。equals()方法区分大小写。如果要查找不区分大小写的检查,则应使用equalsIgnoreCase()方法。
字符串对字符流使用UTF-16编码。
字符串是最后一个类。所有字段均为最终字段,但“private int hash”除外。此字段包含hashCode())函数值。只有在第一次调用hashcode()方法并将其缓存在此字段中时,才会计算hashcode值。此外,通过一些计算,使用字符串类的最终字段生成哈希。因此,每次调用hashCode()方法时,都会产生相同的输出。对于调用者来说,似乎每次都在进行计算,但在内部,它被缓存在哈希字段中。
String vs StringBuffer
由于字符串在Java中是不可变的,每当我们进行字符串操作(如连接、子字符串等)时,它会生成一个新字符串,并丢弃旧字符串进行垃圾收集。这些都是繁重的操作,并在堆中生成大量垃圾。因此,Java提供了StringBuffer和StringBuilder类,它们应该用于字符串操作。StringBuffer和StringBuilder是Java中的可变对象。它们为字符串操作提供了append()、insert()、delete()和substring()方法。
StringBuffer vs StringBuilder
在Java1.4之前,StringBuffer是字符串操作的唯一选择。但是,它有一个缺点,它的所有公共方法都是同步的。StringBuffer提供线程安全性,但以性能为代价。在大多数情况下,我们不会在多线程环境中使用字符串。因此,Java1.5引入了一个新的类StringBuilder,除了线程安全和同步之外,它与StringBuffer类似。StringBuffer有一些额外的方法,如子字符串、长度、容量、trimToSize等。然而,这些方法不是必需的,因为您在字符串中也有这些方法。这就是为什么这些方法从未在StringBuilder类中实现。StringBuffer是在Java 1.0中引入的,而StringBuilder类是在查看了StringBufer的缺点之后在Java 1.5中引入的。如果您处于单线程环境中或不关心线程安全,则应使用StringBuilder。否则,请使用StringBuffer进行线程安全操作。
StringBuilder vs StringBuffer Performance
我试图检查对性能的影响,因为与一个示例程序同步,该程序多次对StringBuffer和StringBuilder对象执行“append()”。
package com.journaldev.java;
import java.util.GregorianCalendar;
public class TestString {
public static void main(String[] args) {
System.gc();
long start=new GregorianCalendar().getTimeInMillis();
long startMemory=Runtime.getRuntime().freeMemory();
StringBuffer sb = new StringBuffer();
//StringBuilder sb = new StringBuilder();
for(int i = 0; i<10000000; i++){
sb.append(":").append(i);
}
long end=new GregorianCalendar().getTimeInMillis();
long endMemory=Runtime.getRuntime().freeMemory();
System.out.println("Time Taken:"+(end-start));
System.out.println("Memory used:"+(startMemory-endMemory));
}
}
我还为StringBuffer对象运行了相同的代码,以检查时间和内存值。我对每种情况执行了5次代码,然后计算了平均值。
| Value of i | StringBuffer (Time, Memory) | StringBuilder (Time, Memory) |
|---|---|---|
| 10,00,000 | 808, 149356704 | 633, 149356704 |
| 1,00,00,000 | 7448, 147783888 | 6179, 147783888 |
很明显,即使在单线程环境中,StringBuilder的性能也优于StringBuffer。这种性能差异可能是由StringBuffer方法中的同步引起的。
String vs StringBuffer vs StringBuilder
字符串是不可变的,而StringBuffer和StringBuilder是可变的类。
StringBuffer是线程安全和同步的,而StringBuilder不是。这就是为什么StringBuilder比StringBuffer快。
字符串连接运算符(+)在内部使用StringBuffer或StringBuilder类。
对于非多线程环境中的字符串操作,我们应该使用StringBuilder,否则使用StringBuffer类。
以上是对字符串、StringBuffer和StringBuilder之间差异的简要总结。在大多数一般编程场景中,StringBuilder比StringBuffer更适合。
参考文献:
String vs StringBuffer vs StringBuilder的更多相关文章
- String、StringBuffer与StringBuilder之间区别
关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下 1.三者在执行速度方面的比较:StringBuilder > String ...
- (转)String、StringBuffer与StringBuilder之间区别
原文地址: http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺 ...
- Java中String、StringBuffer、StringBuilder区别与理解
一.先比较String.StringBuffer.StringBuilder变量的HashCode值 使用System.out.println(obj.hashcode())输出的时对象的哈希码, 而 ...
- String、Stringbuffer、StringBuilder的区别(转载)
最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那 ...
- String、StringBuffer、StringBuilder的区别
在日常开发过程中String字符串估计是被用到最多的变量了,最近看了一些String.StringBuffer和StringBuilder的东西,三者都可以对字符串进行操作,他们究竟有什么区别,以及适 ...
- String、StringBuffer、StringBuilder的一些小经验……
一说String.StringBuffer和StringBuilder,想必大家都很熟悉,这三者经常在我们的面试题中出现,我也是看到了关于这三个的经典面试题,才触动了我之前工作中的一些经历,故而根据我 ...
- java中String、StringBuffer、StringBuilder的区别
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- String、StringBuffer与StringBuilder之间区别[全屏看文]
String.StringBuffer与StringBuilder之间区别[全屏看文] 最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,S ...
- Java中的String、StringBuffer以及StringBuilder的用法和区别
String String的构造方式有n种(据说n==11),常见的例举一二: String s1 = "hello world"; String s2 = new String( ...
- 浅析String、StringBuffer、StringBuilder的区别以及性能区别
前奏: 比较三者之间的区别在与区别他们做相同的事情的时候的区别,那就是在我们常见的拼接字符串的时候,StringBuffer.StringBuilder调用的是appende()方法,而String很 ...
随机推荐
- 定制.NET 6.0的依赖注入
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 在本章中,我们将学习ASP.NET Core的依赖项注入(DI)以及如何自定义它. ...
- [pwn基础]动态链接原理
目录 [pwn基础]动态链接原理 动态链接概念 动态链接调用so例子 GOT(全局偏移表) got表劫持小实验 PLT(延迟绑定) PLT概念 延迟绑定(PLT表) 实战学习 [pwn基础]动态链接原 ...
- 『忘了再学』Shell流程控制 — 33、if条件判断语句(一)
目录 1.单分支if条件语句 2.双分支if条件语句 (1)示例1 (2)示例2 什么是流程控制? 普通理解:Shell编写的程序是顺序执行的,也就是说第一命令先执行,然后接着执行第二条命令,然后再下 ...
- ShardingSphere-proxy-5.0.0分布式哈希取模分片实现(四)
一.说明 主要是对字符串的字段进行hash取模 二.修改配置文件config-sharding.yaml,并重启服务 # # Licensed to the Apache Software Found ...
- 华为AppLinking中统一链接的创建和使用
运营的同学近期在准备海外做一波线下投放,涉及到海外的Google Play,iOS设备的App Store,以及华为渠道的AppGallery. 其中运营希望我们能够将三个平台的下载整合到一个链接 ...
- 【python基础】第08回 流程控制 for循环
本章内容概要 1.循环结构之 for 循环 本章内容详解 1.循环结构之for循环 1.1 语法结构 for 变量名 in 可迭代对象: #字符串 列表 字典 元组 for 循环的循环体代码 针对变量 ...
- 不存在的!python说不给数据的浏览器是不存在的!
有时候我们些代码是总发此疑惑? 为什么别人采集 xx 网站的时候能成功,而我却总是不返回给数据出现这种原因时往往是我们没有给够伪装, 被识别了出来~ 就像人,你出门肯定是要穿衣服的对不,如果你不穿! ...
- 爬虫(9) - Scrapy框架(1) | Scrapy 异步网络爬虫框架
什么是Scrapy 基于Twisted的异步处理框架 纯python实现的爬虫框架 基本结构:5+2框架,5个组件,2个中间件 5个组件: Scrapy Engine:引擎,负责其他部件通信 进行信号 ...
- 活动报名 | 如何基于开源项目 Tapdata PDK,快速完成数据源和目标的开发?
近日,Tapdata 启动 PDK 插件生态共建计划,宣布开源插件开发框架 Tapdata PDK,将自身的数据接口能力开放出来,帮助开发者根据实际需求,自助接入数据源和目标,快速开启「Data ...
- 常用类-LocalDate、LocalTime、LocalDateTime
详情解释请看下方代码区 点击查看代码 @Test public void test1(){ //实例化:now()获取当前日期.时间.日期 + 时间 LocalDate localDate = Loc ...