String、StringBuffer、StringBuilder三者的异同?

news2024/11/26 0:28:40
  • String
  • 字符串
  • 不可变的字符序列
  • jdk1.8,我们底层用 char [ ] 存储
  • 在 jdk 17,我们底层用 byte  [ ] 存储 
  • StringBuffer
  • 字符串缓冲区类
  • 可变的字符序列,线程安全的(synchronized),效率低
  • jdk1.8,我们底层用 char [ ] 存储
  • 在 jdk 17,我们底层用 byte  [ ] 存储 
  • StringBuilder
  • 字符串生成器类
  • 可变的字符序列,jdk5.0新增的,线程不安全的,效率高
  • jdk1.8,我们底层用 char [ ] 存储
  • 在 jdk 17,我们底层用 byte  [ ] 存储 

1、那么在开发当中我们应该到底怎么选择呢?

  • 首先看是不是一个多线程问题。
  • 不是多线程问题,就用StringBuilder
  • 因为只有多个线程操作共享数据的时候,我们才会考虑用StringBuffer
  • 否则不是多线程,或者不存在多线程的安全问题,我们都建议用StringBuilder。

2、jdk8源码分析String

  • String str = new String();                    //char[ ] value = new char[0];
  • String str1 = new String("abc")         //char[ ]  value = new char[ ]{  'a',  'b',  'c'  };

3、jdk8源码分析StringBuffer

  • StringBuffer sb1 = new StringBuffer();        //char[ ] value = new char[16];   底层创建了一个长度是16的数组。
  • sb1.append('a');    //value[0] = 'a';
  • sb1.append('b')     //value[1] = 'b';

package stringdemo;

public class StringBufferTest {
    public static void main(String[] args) {

        StringBuffer sb = new StringBuffer();
        System.out.println(sb.capacity());//16
        
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=34469:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception stringdemo.StringBufferTest
16

Process finished with exit code 0
  • StringBuffer   sb2 = new StringBuffer(“abc”);//char[ ] value= new char["abc".length()+16]

package stringdemo;

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer("abc");
        System.out.println(sb1.capacity());//3+16=19
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=35502:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception stringdemo.StringBufferTest
19

Process finished with exit code 0

 3.1、扩容问题

  • 如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
  • 默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素赋值到新的数组中。
  • new StringBuilder();     创建的时候是不会扩容的,容量是(字符串参数的长度 加上16)。
package stringdemo;

public class StringBufferTest {
    public static void main(String[] args) {
        //new  StringBuffer();创建的时候是不会扩容的
        StringBuffer sb1 = new StringBuffer("66666666666666666666666666666666666666666666666666666666");
        System.out.println(sb1.length());//56
        System.out.println(sb1.capacity());//56+16=72

    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=37260:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception stringdemo.StringBufferTest
56
72

Process finished with exit code 0
  • sb1.append();的时候,追加的时候才会发生扩容。超出(字符串参数的长度+16)的时候才会发生扩容。

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer("44444444");//new创建的时候不会发生扩容
        System.out.println(sb1.length());//8
        System.out.println(sb1.capacity());//8+16=24
        System.out.println("===================");

        sb1.append("44444444");
        System.out.println(sb1.length());//16
        System.out.println(sb1.capacity());//16+16=24
        System.out.println("===================");

        sb1.append("44444444");
        System.out.println(sb1.length());//24
        System.out.println(sb1.capacity());//24 这个时候StringBuffer的容量已经满,再append就会扩容
        System.out.println("===================");

        sb1.append("4");
        System.out.println(sb1.length());//25
        System.out.println(sb1.capacity());//24*2+2=50   扩容为原来容量的2倍+2


    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=37603:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\jdk8 StringBufferTest
8
24
===================
16
24
===================
24
24
===================
25
50

Process finished with exit code 0

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中大型纯电动旗舰轿车银河E8申报成功,定位“旗舰”,可年内交付

根据工信部的公告,吉利旗下的银河新能源品牌近日成功完成中大型纯电轿车银河 E8的申报。这款令人期待的电动轿车在外观和内饰方面都备受关注。在之前的报道中,我们得知银河 E8拥有时尚、动感的外观设计,线条流畅,给人一种科技感十…

关于vue,记录一次修饰符.stop和.once的使用,以及猜想。

内置指令 | Vue.js 在vue的api里&#xff0c;关于v-on有stop和once两个事件标签。 .stop - 调用 event.stopPropagation()。.once - 最多触发一次处理函数。 原有主要代码和页面效果 &#xff08;无stop和once&#xff09;: ...<div class"div" click"di…

编写时源码优化插件试验品

我又来倒垃圾啦 自己垃圾桶里的这个&#xff1a;egg language server on VSCode | Framist’s Little House 用蛋消灭魔鬼&#xff01;编写时源码优化插件 egg-language-server &#x1f9ea; in developing Source Code Optimization Tools at Writing-time 特性 demo | 点击跳…

Revit SDK: FindColumns 找到和墙相交的柱子

前言 本文的主要内容是基于 ReferenceIntersector 的一个应用。ReferenceIntersector 的主要作用是找到一条与给定射线相交的各个元素。 内容 ReferenceIntersector namespace Autodesk.Revit.DB {public class ReferenceIntersector : IDisposable{public ReferenceInters…

Playwright快速上手-1

前言 随着近年来对UI自动化测试的要求越来越高&#xff0c;,功能强大的测试框架也不断的涌现。本系列主讲的Playwright作为一款新兴的端到端测试框架,凭借其独特优势,正在逐渐成为测试工程师的热门选择。 本系列文章将着重通过示例讲解 Playwright python开发环境的搭建 …

【瑞芯微RK3588】【部署yolov5】学习资料总结

各类教程 1.官网&#xff1a;瑞芯微RK3588板子NPU的使用&#xff1b; 2. 【实测有用】在PC虚拟机上转换模型&#xff0c;再下载到RK3588板子上部署YOLOv5&#xff1b; 3. 在服务器上转换模型&#xff0c;再下载到RK3588板子上部署YOLOv5&#xff1b; 4. github上的各类资料…

【设计模式】2.策略模式

前言 代码例子是来大话设计模式&#xff0c;本文主要是根据个人的理解&#xff0c;对书中的内容做学习笔记。如果个人理解的有问题&#xff0c;请各位大佬指正&#x1f64f;。 基础遗忘了可以复习一下&#xff1a; 面向对象Java基础 简单了解UML类图 1、业务背景 商场收银软…

双色球彩票系统---(java实现)

双色球彩票系统&#xff1a;需求&#xff1a;投注号码由6个红色号码和1个蓝色球号码组成。红色球号码从1-33中选择&#xff0c;蓝色球号码从1-16当中选择 * 红 蓝 * 一等奖 6 1 * 二等奖 6 0 * 三等奖 5 1 * 四等奖 5 0 * 4 1 * 五等奖 4 0 * …

NPCon:AI模型技术与应用峰会北京站 (参会感受)

8月12日&#xff0c;我有幸参加了在北京皇家格兰云天大酒店举行的“AI模型技术与应用峰会”。 这次会议邀请了很多技术大咖&#xff0c;他们围绕&#xff1a; 六大论点 大模型涌现&#xff0c;如何部署训练架构与算力芯片 LLM 应用技术栈与Agent全景解析 视觉GPU推理服务部署 …

ubuntu部署haproxy

HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理. 1、更新系统报 通过在终端中运行以下命令,确保所有系统包都是最新的 sudo apt updatesudo apt upgrade 2、安装Haproxy sudo apt install haproxy 设置开机自动启动haproxy服务 sudo systemctl enable h…

.gitignore匹配规则

目录 1.直接一个名称2.斜杠 /3.符号 *4.问号 &#xff1f;5.感叹号 &#xff01;6.gitkeep 借鉴抖音账号&#xff1a; 渡一前端提薪课 1.直接一个名称 会忽略目录下的所有该名称文件和文件夹&#xff0c;无论嵌套多深。 2.斜杠 / 1.斜杠在开头(/dist)&#xff1a;忽略和.gitig…

开发规范(一):Mysql篇

1. 流程 数据库表结构的修改需要相关人员和Leader一起评审&#xff0c;保证符合涉及规范。 不允许使用root账号&#xff0c;所有开发和测试应当分配指定账号&#xff0c;并授予最小数据库权限 2. 数据库与表规范 表命名规范 常规表表名以 t_开头&#xff0c;t 代表 table 的意思…

Kafka第三课

Flume 由三部分 Source Channel Sink 可以通过配置拦截器和Channel选择器,来实现对数据的分流, 可以通过对channel的2个存储容量的的设置,来实现对流速的控制 Kafka 同样由三大部分组成 生产者 服务器 消费者 生产者负责发送数据给服务器 服务器存储数据 消费者通过从服务器取…

Redis数据结构——压缩列表ziplist

定义 压缩列表ziplist是Redis中列表和哈希键的底层实现方式之一。 当一个列表只包含少量列表项&#xff0c;并且每个列表项要么是小整数值&#xff0c;要么是较短的字符串时&#xff0c;那么Redis就会使用压缩列表来作为列表的底层实现。 另外&#xff0c;当一个哈希表中只包含…

FPGA + WS2812采灯控制

文章目录 一、WS2812C-2020-V11、产品概述2、引出端排列及功能3、数据传输时间4、数据传输方法 二、使用WS2812C显示图片1、静态显示2、动态显示 一、WS2812C-2020-V1 1、产品概述 WS2812C-2020-V1是一个集控制电路与发光电路于一体的智能外控LED光源&#xff1b;其外型采用最…

Docker中Tomcat部署步骤

第一次访问没有东西。

2023牛客暑期多校训练营9 I.Non-Puzzle: Segment Pair(tag:差分)

文章目录 题目大意题解参考代码 题目大意 1 ≤ n , l i , r i ≤ 5 ∗ 1 0 5 1 \leq n,l_i,r_i \leq 5*10 ^5 1≤n,li​,ri​≤5∗105 题解 这题 l / r l/ r l/r 的数据在 5 1 0 5 5\times 10^5 5105 &#xff0c;想到差分。 特殊的是它有两条线段&#xff0c;对于同一个点…

Photoshop窗口->排列菜单下进行匹配缩放/位置/旋转

首先&#xff0c;在Photoshop中打开4张以上图片&#xff0c;并选择“窗口”->“排列”->"四联"&#xff1a; 将鼠标移动至其中一张图片中&#xff0c;按住“Z”键&#xff0c;拖动鼠标&#xff0c;调整图片缩放比例至60.55%&#xff0c; 再选择“窗口”->“…

一篇打通,pytest自动化测试框架详细,从0到1精通实战(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 读取文件 1、读取…

Python中使用隧道爬虫ip提升数据爬取效率

作为专业爬虫程序员&#xff0c;我们经常面临需要爬取大量数据的任务。然而&#xff0c;有些网站可能会对频繁的请求进行限制&#xff0c;这就需要我们使用隧道爬虫ip来绕过这些限制&#xff0c;提高数据爬取效率。本文将分享如何在Python中使用隧道爬虫ip实现API请求与响应的技…