当前位置: 首页 > news >正文

String,StringBulider,StringBuffer的简单说明

目录

1.String

2.StringBuffer

3.StringBuilder

4.线程安全的验证


1.String

String是声明在java.lang下的一个类。

String被定义为final,表示不能被继承。内部定义了final char value[]用于存储字符串数据,所以String对象的值是不可改变的。每次对String对象操作都会生成新的String对象,效率低,并且会浪费大量的内存空间。

String实现了Serializable接口,说明是支持序列化的。

String在底层存储时,是存储在字符数组中的。

    @Testpublic void test1() {// 例1String str1 = "123";System.out.println(System.identityHashCode(str1));str1 = "369";System.out.println(System.identityHashCode(str1));// 例2String str2 = "456";System.out.println(System.identityHashCode(str2));String str3 = "456";System.out.println(System.identityHashCode(str3));// 例3String str4 = "258";System.out.println(System.identityHashCode(str4));String str5 = new String("258");System.out.println(System.identityHashCode(str5));}// 结果
1724731843
1305193908
1313953385
1313953385
399573350
463345942

 如例1所示,str1赋值之后再次修改,修改前后内存地址发生了改变,并不是直接改变了值,而是重新开辟内存空间存储新的值,str1指定最新的内存地址。因而会占用两部分内存空间,之前占用的内存并不会立即释放,修改前后的地址不一致。

如例2所示,str2赋值之后,会在常量池中占用内存,在栈中的引用变量指向常量池的内存地址,常量池中存在之后,相同的值不会再次开辟内存空间存储,直接会在返回现有的内存地址。str2和str3的内存地址是一致的。

如例3所示,使用new方式定义的String对象会在堆中开辟内存空间来存储,在栈中创建引用变量指定堆内存中地址,因而虽然strs4和str5的值是一致的,但是在内存中的存储位置是不一致的。

使用String类的一些替换及拼接方法等,都是会生成新的对象,而不是对原有对象的修改。

2.StringBuffer

StringBuffer是对String的一个改进。
因为String的不可变性,导致每次对字符串进行更改操作时都会重新赋值,效率低下。
StringBuffer是可变的字符序列,是线程安全的。底层也是使用字符数组进行存储。

初始字符数组大小为16,长度超了之后会进行扩容处理。反复扩容也会造成内存和性能的浪费。所以确定的情况下,最好设置初始值。

    @Testpublic void test2() {StringBuffer buffer = new StringBuffer();System.out.println(System.identityHashCode(buffer));buffer.append("123");System.out.println(System.identityHashCode(buffer));buffer.append("345");System.out.println(System.identityHashCode(buffer));buffer.append("258");System.out.println(System.identityHashCode(buffer));}//结果
1724731843
1724731843
1724731843
1724731843

 声明之后会开辟内存空间,通过append方法修改值后,对象的内存地址不会发生变化。

append方式被synchronized修饰,是线程安全的。

3.StringBuilder

StringBuilder是JDK5.0引入的,是对StringBuffer的效率改进。因为虽然StringBuffer线程安全,但是效率也较低,所以引入了线程不安全,但是效率高的StringBuilder。
StringBuilder是可变的字符序列,不是线程安全的。底层也是使用字符数组进行存储。

初始字符数组大小为16,长度超了之后会进行扩容处理。反复扩容也会造成内存和性能的浪费。所以确定的情况下,最好设置初始值。

    @Testpublic void test3() {StringBuilder builder = new StringBuilder();System.out.println(System.identityHashCode(builder));builder.append("123");System.out.println(System.identityHashCode(builder));builder.append("345");System.out.println(System.identityHashCode(builder));builder.append("258");System.out.println(System.identityHashCode(builder));}//结果
540642172
540642172
540642172
540642172

4.线程安全的验证

 @Testpublic void test4() throws InterruptedException {StringBuilder builder = new StringBuilder(20);CountDownLatch latch = new CountDownLatch(500000);for (int i = 0; i < 500000; i++) {new Thread(() ->{builder.append("1");latch.countDown();}).start();}latch.await();System.out.println(builder.length());CountDownLatch latch1 = new CountDownLatch(500000);StringBuffer buffer = new StringBuffer();for (int i = 0; i < 500000; i++) {new Thread(() ->{buffer.append("1");latch1.countDown();}).start();}latch1.await();System.out.println(buffer.length());}
//结果
499974
500000

多线程同时执行时,StringBuffer是线程安全的,StringBuilder不是线程安全的

相关文章:

String,StringBulider,StringBuffer的简单说明

目录 1.String 2.StringBuffer 3.StringBuilder 4.线程安全的验证 1.String String是声明在java.lang下的一个类。 String被定义为final&#xff0c;表示不能被继承。内部定义了final char value[]用于存储字符串数据&#xff0c;所以String对象的值是不可改变的。每次对S…...

Python编程题集(第一部分基本语法基础)

Demo01 摄氏温度转化为华氏温度 题目描述&#xff1a; 输入一个摄氏温度的值&#xff0c;将它转变为华氏温度&#xff0c;并将结果输出 转换的公式为如下&#xff1a;fahrenheit (9 / 5 ) * celsius 32 输入输出描述 输入一个值表示摄氏温度celsius 输出华氏温度fahren…...

手动关闭PS中的TopazStudio2的登录窗口

2021 adobe photoshop Topaz Studio 2 不是使用防火墙出站规则&#xff0c;是手动关闭的解决方案 点击社区-切换用户&#xff0c;登录窗口会出现X&#xff0c;可以手动关闭...

[elastic 8.x]java客户端连接elasticsearch与操作索引与文档

初始化客户端 引入相关依赖 <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.10.2</version> </dependency>初始化客户端 为了方便演示&#xff0c;我关闭了ela…...

接口测试总结

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之前的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…...

计算机基础知识44

overflow溢出属性 visible&#xff1a;默认值&#xff0c;内容不会被修剪&#xff0c;会呈现在元素框之外。hidden&#xff1a;内容会被修剪&#xff0c;并且其余内容是不可见的。scroll&#xff1a;内容会被修剪&#xff0c;但是浏览器会显示滚动条以便查看其余的内容。auto: …...

【StringBuilder和StringBuffer】

文章目录 StringBuilder和StringBufferString类、StringBuilder和StringBuffer的区别 StringBuilder和StringBuffer的区别StringBuilder 字符串逆置 StringBuilder和StringBuffer String类、StringBuilder和StringBuffer的区别 String类的特点是不可变性&#xff0c;所以Stri…...

用java代码实现security

Java中security的实现主要涉及到以下几个方面&#xff1a; 认证(Authentication) 认证是确认用户身份的过程&#xff0c;Java中提供了不同的认证机制来保护应用程序不被未授权的用户访问。常用的认证机制有以下几种&#xff1a; 基于口令的认证&#xff1a;要求用户输入用户名…...

【Java 进阶篇】Java Session 原理及快速入门

大家好&#xff0c;欢迎来到本篇博客。今天&#xff0c;我们将探讨Java Web开发中一个重要而令人兴奋的概念&#xff0c;即Session&#xff08;会话&#xff09;。Session是一种在Web应用程序中跟踪用户状态和数据的机制。我们将深入了解Session的原理&#xff0c;并通过示例来…...

MoveFunsDAO 星航计划|从Move入门Web3与深入实践「公益课堂」

Move 语言作为最安全的编程语言之一&#xff0c;在资产的安全性和保护方面有着显著优势&#xff0c;被寄予引领 Web3 世界的全新叙事的厚望。 随着 Sui 在今年五月主网上线&#xff0c;它为 Move 生态带来一股新的浪潮。上线以来&#xff0c;Sui 公链的开发活跃度持续数月位居…...

RabbitMQ常用命令(一)

启动和关闭 1、启动RabbitMQ rabbitmq-server start & 注意&#xff1a;这里可能会出现错误&#xff0c;错误原因是/var/lib/rabbitmq/.erlang.cookie文件权限不够。 解决方案对这个文件授权 chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie chmod 400 /va…...

在教育领域,AI垂直大模型应用场景总结!

1. 智能教育助手&#xff1a; 这种模型可以通过语音或文本与学生进行交互&#xff0c;提供个性化的学习建议和答疑解惑。根据学生的学习习惯和知识水平&#xff0c;推荐适合的学习资源&#xff0c;并提供实时的辅导和反馈。 2. 智能作文批改助手&#xff1a; 这种模型可以对…...

基于级联广义积分器(CGI)的谐波信号提取MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 此方法可用于信号检测、虚拟阻抗合成、锁相环等方面。 在现有的信号提取方法中&#xff0c;众多学者采用了SOGI法、LPF法以及正交信号发生器等方法。当输入信号中不存在直流分量&#xff0c;只有谐波分量时&…...

Linux--线程-条件控制实现线程的同步

1.条件变量 条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时&#xff0c;允许线程以无竞争的方式等待特定的条件发生。 条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量&#xff0c;其他线程在获…...

flutter开发报错The instance member ‘widget‘ can‘t be accessed in an initializer

文章目录 问题描述问题原因解决方法 问题描述 The instance member ‘widget’ can’t be accessed in an initializer. 问题原因 “The instance member ‘widget’ can’t be accessed in an initializer” 错误是因为在初始化器列表中&#xff08;constructor initializer…...

spring项目详细结构目录

这里写目录标题 一、项目结构1、model模型类Student2、mapper 数据访问层接口和映射文件接口类StudentMapper接下来创建名为 StudentMapper.xml 的映射文件 3、service 服务层接口和实现类创建名为 StudentService 的 Java 接口创建名为 StudentServiceImpl 的实现类 4、contro…...

Cygwin 和MinGW 的区别与联系

Cygwin&#xff0c;是Cygnus出品&#xff0c;被Red Hat公司收购&#xff0c;名下的项目&#xff0c;目的为提供运行于windows平台的类Unix环境&#xff08;以GNU工具为代表&#xff09;。Cygwin提供了抽象层dll&#xff0c;用于将部分POSIX转换为Windows API调用&#xff0c;目…...

WebSocket Day03 : SpringMVC整合WebSocket

前言 在现代Web应用程序中&#xff0c;实时性和即时通信变得越来越重要。传统的HTTP请求-响应模式无法满足实时数据传输和双向通信的需求。随着技术的发展&#xff0c;WebSocket成为了一种强大而灵活的解决方案。 WebSocket是HTML5提供的一种新的通信协议&#xff0c;它通过一…...

Electron + VUE3 桌面应用,主进程和渲染进程通信

之前写过篇主进程和渲染进程之间的通信,这里主要是记录一下VUE版本的应用,主进程和渲染进程之间的通信。思路是一样,唯一不同的是代码。 在开发Electron应用的时候,从安全的角度来考虑,尽量不要在渲染进程中,直接调用ElectronAPI,因此我们需要预加载JS脚本,在这个脚本…...

使用腾讯云轻量服务器安装AList

新人有免费两个月试用轻量服务器&#xff0c;使用云服务器商自带的webshell登录&#xff1b; 我这儿用docker安装Alist&#xff0c;因为服务器没自带docker&#xff0c;所以具体安装docker centos7.0最快速安装docker的方法 通过 Docker 部署 Alist 命令&#xff1a; docke…...

Qwen3-32B-Chat微调实战:提升OpenClaw代码生成任务的准确性

Qwen3-32B-Chat微调实战&#xff1a;提升OpenClaw代码生成任务的准确性 1. 为什么需要微调Qwen3-32B-Chat&#xff1f; 去年夏天&#xff0c;当我第一次尝试用OpenClaw自动化我的开发工作流时&#xff0c;遇到了一个令人沮丧的问题&#xff1a;模型生成的代码虽然语法正确&am…...

PySceneDetect终极指南:5分钟掌握智能视频场景检测与分割

PySceneDetect终极指南&#xff1a;5分钟掌握智能视频场景检测与分割 【免费下载链接】PySceneDetect :movie_camera: Python and OpenCV-based scene cut/transition detection program & library. 项目地址: https://gitcode.com/gh_mirrors/py/PySceneDetect PyS…...

手把手教你为i.MX6ULL开发板适配非标准分辨率LCD(以1024x600 OV5640为例)

i.MX6ULL开发板非标准分辨率LCD适配实战&#xff1a;从寄存器配置到图像稳定输出 在嵌入式视觉系统开发中&#xff0c;摄像头与显示设备的适配往往成为项目落地的关键瓶颈。当面对非标准分辨率的LCD屏幕时&#xff0c;开发者需要深入理解图像采集与显示的全链路原理&#xff0c…...

acjscsdbhvusfd

一、yolo v1是什么&#xff1f; YOLO&#xff08;You Only Look Once&#xff09;算法 是一种目标检测算法&#xff0c;是经典的one-stage方法。YOLO v1 开创了单阶段目标检测的先河&#xff0c;其简洁的架构 和高效的推理为后续版本奠定了基础。尽管存在小目标检测和定位精度的…...

分子构象采样新范式:CREST工具解决药物研发核心挑战

分子构象采样新范式&#xff1a;CREST工具解决药物研发核心挑战 【免费下载链接】crest Conformer-Rotamer Ensemble Sampling Tool based on the xtb Semiempirical Extended Tight-Binding Program Package 项目地址: https://gitcode.com/gh_mirrors/crest/crest 在药…...

PostgreSQL 模式级权限迁移:一键批量修改所有表与对象的所有者

1. 为什么需要批量修改PostgreSQL对象所有者&#xff1f; 在实际的数据库运维工作中&#xff0c;经常会遇到需要批量修改数据库对象所有者的情况。我遇到过不少这样的场景&#xff1a;公司部门重组后&#xff0c;原先由开发团队A负责的项目转交给团队B维护&#xff1b;或者某个…...

OpenOCD入门到精通:第23章 添加新的 JTAG 适配器驱动

第23章 添加新的 JTAG 适配器驱动 导读摘要:OpenOCD 支持 40 余种调试适配器,每种适配器背后都有一个遵循统一接口规范的驱动程序。本章从 adapter_driver 结构体出发,逐一解析其回调函数语义,介绍 libusb/HIDAPI 通信层封装,并通过一个完整的简易驱动实现示例,帮助读者掌…...

XC6206-1.8V是什么?有哪些作用?

本文主要介绍XC6206-1.8V是什么&#xff1f;有哪些作用&#xff1f;XC6206-1.8V是一款超低功耗、高精度的固定输出低压差线性稳压器&#xff08;LDO&#xff09;&#xff0c;核心作用是把较高电压转换成稳定的1.8V输出&#xff0c;专门为电池供电和低功耗设备设计。图文来源&am…...

LFM2.5-1.2B-Thinking-GGUF基础教程:单页Web界面交互逻辑与后处理机制

LFM2.5-1.2B-Thinking-GGUF基础教程&#xff1a;单页Web界面交互逻辑与后处理机制 1. 模型与平台介绍 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型&#xff0c;专为低资源环境优化设计。这个镜像采用内置GGUF模型文件和llama.cpp运行时&#xff0c;提供了…...

快速体验Qwen3-0.6B-FP8:无需下载模型,开箱即用的AI文本生成服务

快速体验Qwen3-0.6B-FP8&#xff1a;无需下载模型&#xff0c;开箱即用的AI文本生成服务 1. 为什么选择Qwen3-0.6B-FP8&#xff1f; Qwen3-0.6B-FP8是Qwen系列最新推出的轻量级语言模型&#xff0c;采用FP8量化技术大幅降低了显存需求。相比传统模型&#xff0c;它具有以下突…...