java中的String、StringBuffer和StringBuilder的详细分析
目录
- 前言
- 1. 源码
- 1.1 String源码
- 1.2 StringBuffer源码
- 1.3 StringBuilder源码
- 2. 总结
前言
java中用于处理字符串常用的主要三个类
在开发中如何抉择以及在开发岗位中的高频面试题
- String 字符串常量
- StringBuffer 字符串变量(线程安全)
- StringBuilder 字符串变量(非线程安全)
1. 源码
主要的区别在于运行速度和线程安全
1.1 String源码
通过查看sting类的源码
具体解释如下:
- String类表示字符串。 Java程序中的所有字符串字面值,比如“abc”,都是作为这个类的实例实现的。
- 字符串常量; 创建后不能更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,所以它们可以被共享。 例如: String str = “abc”;
因此每次String 类型改变的时候等同于生成一个新的 String 对象,生成多一个对象,jvm的gc就会开始工作,速度就会变慢
1.2 StringBuffer源码
通过查看StringBuffer的源码
具体解释如下:
线程安全的、可变的字符序列。 字符串缓冲区类似于string,但可以修改
。 在任何时候,它都包含一些特定的字符序列,但是序列的长度和内容可以通过某些方法调用来改变。字符串缓冲区对于多个线程来说是安全的。 这些方法在必要的地方是同步的,
这样,任何特定实例上的所有操作都表现得好像它们是按照某种顺序发生的
,这种顺序与每个涉及的单个线程调用方法的顺序一致。StringBuffer上的主要操作是追加和插入方法,
它们是重载的,以便接受任何类型的数据。 它们可以有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入到字符串缓冲区中
。 append方法总是将这些字符添加到缓冲区的末尾; 插入方法将字符添加到指定的点。每当发生涉及到源序列的操作时(例如从源序列中追加或插入),该类只在执行操作的字符串缓冲区上同步,而不是在源上同步。 注意,虽然StringBuffer的设计是安全的从多个线程同时使用,如果构造函数或追加或插入操作是通过跨线程共享源序列时,调用代码必须确保操作有一个一致的和不变的视图的源序列操作的持续时间。 这可以通过调用者在操作调用期间持有锁来实现,方法是使用不可变的源序列,或者不在线程之间共享源序列。
1.3 StringBuilder源码
通过查看StringBuilder的源码
具体解释如下:
变字符序列。 这个类提供了一个与StringBuffer兼容的API,但不保证同步
。 该类设计用于在字符串缓冲区由单个线程使用的地方(通常情况下)作为StringBuffer的临时替代。 在可能的情况下,建议优先使用这个类,而不是StringBuffer,因为在大多数实现中它会更快。
- StringBuilder上的主要操作是追加和插入方法,它们是重载的,以便接受任何类型的数据。 它们都能有效地将给定的数据转换为字符串,然后将该字符串的字符追加或插入到字符串构建器中。 append方法总是将这些字符添加到构建器的末尾; 插入方法将字符添加到指定的点。
2. 总结
运行速度快慢为:StringBuilder > StringBuffer > String
操作是多线程的,使用StringBuffer
操作是单线程的,速度比较快的StringBuilder代码示例:
String str="abc";
System.out.println(str);
str=str+"de";
System.out.println(str);
输出结果还是abcde
- str + “de” 内部有一个变量拼接,jvm将其存放在堆中。
- “abc” + “de” 的字符串拼接,则放置在常量池中。
- 常量池的回收根据内存是否需要回收。根据常量池中的常量否有所使用。(书本中java虚拟机不要求方法区回收,也就是常量池的回收。但实际使用中常量池在堆中)
- StringBuffer 带有synchronized关键字,所以才是线程安全。而StringBuillder不带有该关键字,所以不是线程安全
java中的String、StringBuffer和StringBuilder的详细分析相关推荐
- 重温java中的String,StringBuffer,StringBuilder类
不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...
- Java中的String,StringBuffer,StringBuilder有什么区别?
相信有很多同学都是经常使用String的,或者也或多或少的听说过StringBuffer,StringBuilder,那么在经常遇见的面试题中(标题),到底这三个的区别是什么呢?让我们来一探究竟! S ...
- Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- Java中的String、StringBuilder、StringBuffer
Java中的String是个永恒的话题,直说我想说的. 1.String 是永远不会变的,传递的引用是一个Copy,无论刮风下雨,它都在自己的小窝里呆的好好的. 2.重载"+"和S ...
- Java中的String,StringBuilder,StringBuffer的区别
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > ...
- Java:中的String,StringBuilder,StringBuffer三者的区别
Java中的String,StringBuilder,StringBuffer三者的区别 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBu ...
- Java 中的 String、StringBuilder、StringBuffer 的区别
目录 一.是什么? 二.区别是? 1. 运行速度(执行速度) 2. 线程安全 三.小结 四.加餐 一.是什么? String 不可变字符序列 String 是字符串常量,其对象一旦创建之后该对象是不可 ...
- Java中String StringBuffer和StringBuilder的区别是什么
String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的? 可变性 简单的来说:String 类中使用 final 关键字修饰字符数组来保存 ...
- String,StringBuffer与StringBuilder的区别
String,StringBuffer与StringBuilder的区别 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全 ...
最新文章
- GCC跟NASM联合编译
- 多线程编程:return、pthread_exit()、exit()函数区别
- 关于Linux的前世今生(一)
- 【BZOJ3028】食物(生成函数)
- SAP Hybris MVC里的M指什么
- 2017.9.22 小约翰的游戏John 失败总结
- android wifi列表轮询,(八十八)Android O WiFi启动流程梳理续——connectToSupplicant
- python拟合直线的斜率_Python:直线,斜率k是已知的,一点P1是已知的,长度P1P2是已知的,如何得到P2?...
- BI报表工具有哪些?
- 古时候有个【百僧问题】,一百馒头一百僧,大僧三个更无争,小僧三人分一个,大小和尚各几丁? *...
- 互联网 HR 黑话大全,太真实了!
- 谷歌浏览器网页表格复制一列_如何冻结或隐藏Google表格中的列和行
- 自动化成本高?那么如何获得最高的投资回报呢?
- WindowsPE无法安装系统
- 圣诞节,1inch狂撒3亿美金红包,币圈大佬在线炫富,我酸了...
- 运维工程师不可错过的2020年值得关注的综合性网络监控工具
- 马克思 第四章 资本主义的形成及其本质
- 10个最佳价格行动交易模式
- FlexE( Flex Ethernet灵活以太网)
- 京东-技术方向管培生群面失败总结
热门文章
- 【珍藏版】 2012Java开发工程师必备精品资料(115个)
- pdksh-5.2.14-36.el5.i386.rpm
- LE Audio问世!蓝牙5.2加持的TWS耳机打破AirPods专利垄断现状
- 玩转大数据,城市规划不再“跟着感觉走”
- 【LittleXi】sql学习笔记
- opencv学习_7 (颜色空间)
- mapbox tippecanoe切矢量瓦片参数设置和注意事项
- 计算机三级网络技术最全知识点总结【5】
- 本软件仅供学习交流,如作他用所承受的法律责任一概与作者无关(下载使用即代表你同意上述观点)
- ◮OpenGL-混合