String vs StringBuffer vs StringBuilder

String vs StringBuffer vs StringBuilder

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

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

  1. 字符串类表示字符串,我们可以用两种方式实例化字符串。
String str = "ABC";
// or
String str = new String("ABC");
  1. 字符串在Java中是不可变的。因此,它适用于多线程环境。我们可以跨函数共享它,因为不需要担心数据不一致。
  2. 当我们使用双引号创建字符串时,JVM首先在字符串池中查找具有相同值的字符串。如果找到,则返回池中字符串对象的引用。否则,它将在字符串池中创建字符串对象并返回引用。JVM通过在不同线程中使用相同的字符串来节省大量内存。
  3. 如果使用新运算符创建字符串,则会在堆内存中创建该字符串。
  4. 字符串的+运算符重载。我们可以用它连接两个字符串。尽管在内部它使用StringBuffer来执行此操作。
  5. 字符串重写equals()和hashCode()方法。只有当两个字符串具有相同的字符序列时,它们才相等。equals()方法区分大小写。如果要查找不区分大小写的检查,则应使用equalsIgnoreCase()方法。
  6. 字符串对字符流使用UTF-16编码。
  7. 字符串是最后一个类。所有字段均为最终字段,但”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(); endmemory="Runtime.getRuntime().freeMemory();" system.out.println("time taken:"+(end-start)); system.out.println("memory used:"+(startmemory-endmemory)); < code></10000000;>

我还为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

  1. 字符串是不可变的,而StringBuffer和StringBuilder是可变的类。
  2. StringBuffer是线程安全和同步的,而StringBuilder不是。这就是为什么StringBuilder比StringBuffer快。
  3. 字符串连接运算符(+)在内部使用StringBuffer或StringBuilder类。
  4. 对于非多线程环境中的字符串操作,我们应该使用StringBuilder,否则使用StringBuffer类。 以上是对字符串、StringBuffer和StringBuilder之间差异的简要总结。在大多数一般编程场景中,StringBuilder比StringBuffer更适合。 参考文献:

  5. String API Doc

  6. StringBuffer API Doc
  7. StringBuilder API Doc

欢迎关注公众号:愚生浅末。

Original: https://www.cnblogs.com/kohler21/p/16625194.html
Author: 愚生浅末
Title: String vs StringBuffer vs StringBuilder

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599337/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • ORA-12012: error on auto execute of job “SYS”.”ORA$AT_OS_OPT_SY_128403″

    刚接手的一个Oracle 12C数据库,配置监控告警日志的作业时,发现告警日志中有大量下面错误,而且这些错误一般是晚上22点出现 数据库版本信息如下所示: 查了一下官方文档,结合当…

    数据库 2023年6月11日
    059
  • MySQL的文件系统(Linux环境)

    /var/lib/mysql/ 可通过以下sql命令查看: mysql> show variables like ‘datadir’; +—————+–…

    数据库 2023年5月24日
    075
  • JUC学习笔记(一)

    1、什么是 JUC 1.1、JUC简介 在 Java 中,线程部分是一个重点,本篇文章说的 JUC 也是关于线程的。JUC 就是 java.util .concurrent 工具包…

    数据库 2023年6月6日
    0102
  • CSS进阶内容——布局技巧和细节修饰

    CSS进阶内容——布局技巧和细节修饰 我们在之前的文章中已经掌握了CSS的大部分内容,但仍有一些内容我们没有涉略,这篇文章就是为了补充前面没有涉及的内容,为我们的知识做出补充并且介…

    数据库 2023年6月14日
    083
  • 老板:把系统从单体架构升级到集群架构!

    首发于公众号:BiggerBoy 如题,本文针对工作中实际经验,整理了把一个单体架构的系统升级成集群架构需要做的准备工作,以及为集群架构的升级做指导方针。 本文首先分析了单体架构存…

    数据库 2023年6月11日
    076
  • MySQL InnoDB缓存

    1. 背景 对于各种用户数据、索引数据等各种数据都是需要持久化存储到磁盘,然后以”页”为单位进行读写。 相对于直接读写缓存,磁盘IO的成本相当高昂。 对于读…

    数据库 2023年6月14日
    0153
  • mac(m1)配置my.cnf

    今天开始学习了数据库,在安装MySQL之后启动一直报错,然后在网上找了很多解决方法,最后用以下方法解决 对于习惯了windows的小伙伴来说,直接去安装目录里边修改my.ini就可…

    数据库 2023年5月24日
    0103
  • 删除chrome的域名安全策略

    使用过程中总有特殊情况必须使用http请求、又或者必须使用https请求 目前有两种思路,一种是浏览器默认开了http转https请求,像chrome和Firefox,另一种就是服…

    数据库 2023年6月6日
    0101
  • 爬虫基础

    1.爬虫是什么? 爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。 2.爬虫原理 _3.第一个爬虫程序 _ 1.扒取网页 : 扒取网页和基本代码 首先我们调…

    数据库 2023年6月11日
    080
  • LeetCode 58. 最后一个单词的长度

    给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:…

    数据库 2023年6月11日
    085
  • Redis和Mysql保持数据一致性

    1、简述 在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数…

    数据库 2023年6月16日
    087
  • jdbc-实现用户登录业务(解决sql注入问题)

    package com.cqust; import java.sql.*;import java.util.HashMap;import java.util.Map;import …

    数据库 2023年5月24日
    071
  • MySQL8.0 DDL原子性特性

    1. DDL原子性概述 8.0之前并没有统一的数据字典dd,server层和引擎层各有一套元数据,sever层的元数据包括(.frm,.opt,.par,.trg等),用于存储表定…

    数据库 2023年6月9日
    061
  • haproxy服务部署

    haproxy haproxy 一、haproyx是什么 二、负载均衡类型 三、部署haproxy 1.源码部署haproxy 2.Haproxy搭建http负载均衡 一、hapr…

    数据库 2023年6月14日
    0111
  • com.mysql.cj.jdbc.Driver和com.mysql.jdbc.Driver的区别

    今天,我在写作考试中发现了一个问题,如下所示: [En] Today, I found a problem during the writing test, as follows:…

    数据库 2023年5月24日
    071
  • MySQL DQL 去重教程表代码

    垃圾的撒娇的风景色谱发票为菩萨的搭配覅色谱法配色【】we9rfpqsoedufoiewrun拍摄跑调覅就怕是东风破一坚实的皮肤的胜多负少的 的食品发票速度发票首都非破损的赔付喷水电…

    数据库 2023年5月24日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球