java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...

最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下,便于大家观看,也便于加深自己学习过程中对这些知识点的记忆,如果哪里有误,恳请指正。

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。

首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String最慢的原因:

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。以下面一段代码为例:

1 String str="abc";2 System.out.println(str);3 str=str+"de";4 System.out.println(str);

如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

另外,有时候我们会这样对字符串进行赋值

1 String str="abc"+"de";2 StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");3 System.out.println(str);4 System.out.println(stringBuilder.toString());

这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和

String str="abcde";

是完全一样的,所以会很快,而如果写成下面这种形式

1 String str1="abc";2 String str2="de";3 String str=str1+str2;

那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。

2. 再来说线程安全

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

3. 总结一下

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

写在最后:以上这些总结的内容绝大多数是我从网上以及书上找来的,写在这里是想把自己所学的分享给大家,方便大家学习,同时也有助于自己记忆,如果有哪里不对的恳请指正

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

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

相关文章

有关堆栈溢出(in vs 2005)的读书笔记--堆栈中 申请大数组

部分原创 66下一步 Vs 堆栈 理论修改的上限是多少 ? 问题2: 全局变量去 最大的上限是多少? 堆栈(休养版本测试) 2012年3月31日17:31:27 3月 从 10^5到 10^6数组,导致vs… 当前:搭好脚手架…

烧脑又过瘾!这个被严重低估的学习方法,看完瑟瑟发抖!

▲ 点击查看科学家曾在基于脑科学和认知科学后得出一个“学习的金字塔”理论。就是下面这张图:最顶端的就是我们所谓的“知识”,但为了可以达到这个顶端,下面有一系列的支撑能力。而引申出来的核心概念,就叫“玩中学”。不要想当然…

java中统计括号配对_括号配对问题(C语言或JAVA语言代码)

描述现在,有一行括号序列,请你检查这行括号是否配对。输入第一行输入一个数N(0"]", "(", ")" 四种字符输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出…

arguments.callee()事例 参数检验

<script>var abcfunction(x){if(x<2) return 1;else return x*arguments.callee(x-1);}var yabc(5);alert(y); </script>参数检验 <script>function check(args){var actualargs.length; //实际的参数长度var expectedargs.callee.length; …

Docker基础操作命令与常用容器创建

常用操作命令 docker search docker pull docker save docker load docker rm/rmi docker ps docker images docker create --name 容器 ... docker container ls docker stop/start/pause/unpause 容器名 docker exec -it 容器名 运行命令&#xff08;如&#xff1a;bash,red…

java号段_JAVA手机号正则(多号段)

import java.util.regex.Pattern;/*** author: Lindsay* Date: 2018/9/19 16:23* Description: 手机号正则*/public class PhoneRegUtils {/*** 是否是合法的手机号** param phone* return*/public static boolean isLegalPhoneNumber(String phone) {/*** 中国电信&#xff1a…

hdu 1863(最小生成树kruskal)

/*Name: hdu1863畅通工程 Author: Try86Date: 10/04/12 12:43Description: 最小生成树(kruskal) */ #include <cstdio> #include <iostream>using namespace std;const int M 5050;int p[M], sum; //sum统计顶点个数 struct edge {int a;int b;int w; }e[M];int…

java第二版课后题答案_Java语言程序设计第2版第16章 课后习题答案

《Java语言程序设计第2版第16章 课后习题答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《Java语言程序设计第2版第16章 课后习题答案(62页珍藏版)》请在人人文库网上搜索。1、第1章 Java语言概述选择题1-1 在下列概念中&#xff0c;Java语言只保留了(B)A. 运算符…

为什么手机最后 10% 的电量很不耐,最后1%的电量最耐用?

全世界只有3.14 % 的人关注了爆炸吧知识手机电量这玩意一直都是个玄学问题。为什么我的小手机&#xff0c;最后 1% 的电量最耐用&#xff0c;每次都够我看完一个十分钟的视频。又或者是为什么我的小手机&#xff0c;最后 10% 的电量很不耐用。。。每次电池报警还有 10% 的电量&…

HP 1020

HP 1020 先卸三颗螺丝 两根铁销 把盖子拔出 弹簧拔出 把硒鼓一分为二&#xff0c;有感光器的为废粉&#xff0c;倒出来&#xff0c;搽干净感光器 另外一个倒入干净的粉&#xff0c;小心不要把齿轮那面拆开了 倒好粉&#xff0c;合起来 合起来要先扣上弹簧&#xff0c;再按上盖…

使用identity+jwt保护你的webapi(三)——refresh token

前言上一篇已经介绍了identity的注册&#xff0c;登录&#xff0c;获取jwt token&#xff0c;本篇来完成refresh token。开始开始之前先说明一下为什么需要refresh token。虽然jwt token有很多优点&#xff0c;但是它的缺点也是非常明显。由于jwt无状态的特性&#xff0c;所以j…

窗体的关闭事件

对于关注对 Windows 窗体应用程序中引发的每个事件按次序进行处理的开发人员来说&#xff0c;事件引发的顺序特别重要。 当 Windows 窗体应用程序启动时&#xff0c;主窗体的启动事件按以下顺序引发 1、System.Windows.Forms.Control.HandleCreated    在为控件创建句柄时发生…

python多线程 不在main_从python线程(不是main)启动pyQt线程有什么不...

我有一个想要向其添加基本状态窗口的python控制台脚本,因此在不了解pyqt的情况下,我添加了一个窗口.如果我从主线程启动pyqt,它将阻塞其他所有内容,因此我从另一个线程启动了它.这样的运行情况已经好几个月了,但我只是注意到了一个警告(不确定我以前怎么错过它)&#xff1a;警告…

java设置窗口不可移动_Java – JDialog不可移动

什么代码有助于使JDialog无法移动&#xff1f;我看了两个选项&#xff1a;> setUndecorated(true);哪个有效,但删除了所有的装饰.> addComponentListener并覆盖componentMoved()方法,这会导致JDialog随后在移动时调用induEpilepticSeizure().有任何想法吗&#xff1f;解决…

一个10*10的正方形里,最多可以放多少个直径为1的圆?为啥不是100个?

祝大家元宵节快乐知识君曾经给大家出了一道题。↓Q&#xff1a;在一个10*10的正方形里&#xff0c;最多可以放多少个直径为1的圆&#xff1f;为啥不是100个&#xff1f;关于这道题&#xff0c;后台就收到了许多留言&#xff0c;大家纷纷给出了不同的答案。五花八门的答案&#…

.NET 时间格式 ----------摘自MSDN

使用在 DateTimeFormatInfo 的属性中存储的标准或自定义模式设置 DateTime 值的格式。 可以通过设置可写 DateTimeFormatInfo 的关联属性用自定义模式替代标准模式。若要确定 DateTimeFormatInfo 是否是可写的&#xff0c;请使用 IsReadOnly 属性。 下表列出了每一种标准模式的…

小甲鱼零基础入门python二十一课课后题_小甲鱼Python第二十一讲课后习题

测试题&#xff1a;0. 递归在编程上的形式是如何表现的呢&#xff1f;在编程上&#xff0c;递归表现为函数调用本身这么一个行为。1. 递归必须满足哪两个基本条件&#xff1f;一、 函数调用自身二、 设置了正确的返回条件2. 思考一下&#xff0c;按照递归的特…

MVC捕获数据保存时的具体字段验证错误代码

捕获验证错误代码 //try //{ // // 调试写数据库 //} //catch (DbEntityValidationException dbEx) //{ //}转载于:https://www.cnblogs.com/caojinqin/p/4561000.html

windows常用网络命令

1. ipconfig命令 ipconfig命令用于显示本机当前的TCP/IP配置的设置值&#xff0c;包括本机当前的IP地址、子网掩码、默认网关以及DNS服务器。可以用来检验TCP/IP配置是否正确。对于使用了动态主机配置协议&#xff08;DHCP&#xff09;的局域网&#xff0c;这个命令的作用就更加…

java中有stdin_在java中听stdin的后台进程

我必须创建一个java程序,当用户输入0时它应该退出.用java代码编写没问题.int cmd read();System.out.println("got command : " cmd);if (cmd 48) { // ASCII code for 0System.exit(0);我想在linux中使用start-stop脚本运行这个过程.我也可以使用&或者没有ca…