JAVA基础知识|String、StringBuilder、StringBuffer比较
一、简介
String:不可变字符序列
StringBuffer:线程安全的可变字符序列
StringBuilder:非线程安全的可变字符序列
二、示例分析
【示例1】
String A = "123";
String B = "123";
String C = "456";
String D = new String("123");
String B = "123";先检查“123”在字符串常量池中是否存在,如果存在将B指向已有的“123”,如果不存在(如C),则在常量池中新加入“456”;
String D = new String("123");其中“123”也指向常量池中的“123”;
String A = "123";
String B = "123";
System.out.println(A==B); String C = new String("123");
System.out.println(A==C); String D = new String("123");
System.out.println(C==D);
输出结果:(“==”比较的是地址是否相同)
true
false
false
【示例2】
String A = "123";
String B = "456";
String AB = A+B;
String C = "123456";
System.out.println(AB==C); String D = "123"+"456";
String F = "123456";
System.out.println(D==F);
输出结果:
false
true
String AB = A+B;首先会在堆中创建一个StringBuilder对象,并将A作为初始化的值;再通过append()方法合并B的值,最后再通过toString()方法在堆中创建一个String对象,将堆地址存放在AB中。
“123”+“456”;在编译期就会自动合并为“123456”,所以D与F指向的是同一个地址。
【示例3】
//代码1
String A = "";
for(int i=0;i<100000;i++){
A=A+i;
}
//代码2
StringBuilder B =new StringBuilder("");
for(int i=0;i<100000;i++){
B.append(i);
}
代码1耗时:28067ms
代码2耗时:15ms
A=A+i,进行累加时,会出现和示例二中同样的情况,不停的生成对象,导致性能很差。
B.append(i),不会生成新的对象,只是同一个对象的不停累加。
三、总结
1、能够确定的字符串常量,完全没有必要创建StringBuilder或StringBuffer对象。直接使用字符串常量的"+"连接操作效率最高。
2、StringBuilder和StringBuffer对象的append效率要高于String对象的“+”操作。
3、StringBuilder比StringBuffer的性能稍高,但是StringBuffer线程安全。当有多线程的情况出现时,StringBuffer更安全。
解释一下,此处所说的线程安全是指StringBuffer调用append、insert等方法时线程安全。线程安全的原因,是因为这些方法都被关键字synchronized修饰。
关键字“synchronized”是为线程同步机制设定的。
每一个类对象都对应一把锁,当某个线程A调用类对象O中的synchronized方法M时,必须获得对象O的锁才能够执行M方法,否则线程A阻塞。一旦线程A开始执行M方法,将独占对象O的锁。使得其它需要调用O对象的M方法的线程阻塞。只有线程A执行完毕,释放锁后。那些阻塞线程才有机会重新调用M方法。这就是解决线程同步问题的锁机制。
JAVA基础知识|String、StringBuilder、StringBuffer比较的更多相关文章
- Java基础之String,StringBuilder,StringBuffer
在创建字符串的时候总是习惯性的使用String str = "...";,str = str+"abcd";也有听说过StringBuffer,StringBu ...
- Java基础之String、StringBuffer、StringBuilder浅析
Java基础之String.StringBuffer.StringBuilder浅析 一.前言: 位于java.lang包下的String.StringBuilder.StringBuffer一般都是 ...
- Java基础知识 String StringBuffer StringBuilder三者的区别(面试题)
相同点:String.StringBuffer.StringBuilder最终底层存储与操作的都是char数组,StringBuffer和StringBuilder都继承了AbstractString ...
- 黑马程序员——JAVA基础之String和StringBuffer
------- android培训.java培训.期待与您交流! ---------- String类: 字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String str = &quo ...
- 黑马程序员----java基础:String与StringBuffer及基本数据类型包装类
------- android培训.java培训.期待与您交流! ---------- java中一些基础类比如String.StringBuffer和基本数据类型包装类都是非常常见且使用非常频繁的类 ...
- Java基础之String、StringBuffer、StringBuilder
1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串. 生活中很多数据的描述都采用的是字符串的.而且我们还会对其进行操作. 所以,java就提供了这样的一个类供我们使用. (2) ...
- 黑马程序员——【Java基础】——String、StringBuffer和基本数据包装类
---------- android培训.java培训.期待与您交流! ---------- 类String---------------------------------------------- ...
- JAVA基础知识 String s = new String("ABC") VS String s = "abc"
一: String s = new String("ABC") VS String s = "abc" String s = "abc&q ...
- JAVA基础篇—String和StringBuffer
区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,可以通过append() ...
随机推荐
- 【转载】C#通过StartWith和EndWith方法判断字符串是否以特定字符开始或者结束
C#开发过程中针对字符串String类型的操作是常见操作,有时候业务需要判断某个字符串是否以特定字符开头或者特定字符结束,此时就可使用StartsWith方法来判断目标字符串是否以特定字符串开头,通过 ...
- 关于文本设置overflow:hidden后引起的垂直对齐问题
目前有这样的需求,一行标题中,前面为图标,后面是文字,文字要实现一行省略的效果 首先把文字设为:display: inline-block; 然后设置省略: overflow: hidden; wor ...
- 服务发现之consul理论整理_结合Docker+nginx+Tomcat简单部署案例
目录 一.理论概述 服务发现的概念简述 consul简述 二.部署docker+consul+Nginx案例 环境 部署 三.测试 四.总结 一.理论概述 服务发现的概念简述 在以前使用的是,N台机器 ...
- linux alsa音频中采样率fs、比特率BCLK 、主时钟MCLK关系
转:https://blog.csdn.net/lugandong/article/details/72468831 一.拿512fs说话: 看图知道采样的位深是32bit(位),左右声道各占了8*3 ...
- Linux命令——ps、pstree
转载请注明出处:https://www.cnblogs.com/kelamoyujuzhen/p/9814883.html ps 简介 ps(processes status)是Unix / Linu ...
- 【DevOps】在CentOS中安装Rancher2,并配置kubernetes集群
准备 一台CentOS主机,安装DockerCE,用于安装Rancher2 一台CentOS主机,安装DockerCE,用于安装kubernetes集群管理主机 多台CentOS主机,安装Docker ...
- Go语言实现简单的TCP、UDP链接
⼀.使用Golang创建⼀一个TCP连接 1.服务端处理理流程 a.监听端口 b.接受客户端的链接 c.创建Goroutine,处理这个链接(⼀个服务端要链接多个客户端,所以使用Gorouti ...
- LearnOpenGL学习笔记(一)画个三角形
开始学习OpenGL,参考的是著名的LearnOpenGL这个网站,在这里做一些总结性的记录,只是方便自己日后查找或者记录自己的一些拓展思考,关于OpenGL的具体内容请移步: https://lea ...
- 【转】如何在TensorFlow中高效使用数据集
本文主要记录tensorflow一个比较好用的API:Dataset,feed-dict 是向 TensorFlow 传递信息最慢的方式,应该尽量避免使用.向模型提供数据的正确方式是使用输入管道,这样 ...
- shell 文本替换 ---出现--- sed:-e 表达式 #1,字符 8:“s”的未知选项
需要替换的行为: monitor.url=http://192.168.25.100:8443/rest 查询资料得知,报错是因为替换的字符串包含有分隔符/ 所以这行改一下分隔符就可以解决问题了 ( ...