[ Java学习基础 ] String、StringBuffer、StringBuilder比较学习
首先讲获得字符串对象的方式有两种,一种是直接使用字符串常量,一种是使用new关键字创建,但它们之间是有一些区别,如下运行实例:
String s1 = new String("Hello");
String s2 = new String("Hello"); String s3 = "Hello";
String s4 = "Hello"; System.out.printf("s1 == s2 : %b%n", s1 == s2);
System.out.printf("s3 == s4: %b%n", s3 == s4);
System.out.printf("s1 == s3 : %b%n", s1 == s3);
System.out.printf("s2 == s3 : %b%n", s2 == s3);
输出结果:
s1 == s2 : false
s3 == s4: true
s1 == s3 : false
s2 == s3 : false
从以上结果可以看出,“==”运算符比较的是两个引用是否指向相同的对象,由此可见s1和s2指向的是不同的对象,s3和s4指向了相同的对象。
Java中的不可变字符串String常量,采用字符串池(String Pool)管理技术,字符串池是一种字符串驻留技术。采用字符串常量赋值时(见代码第4行),如下图所示,会字符串池中查找"Hello"字符串常量,如果已经存在把引用赋值给s3,否则创建"Hello"字符串对象,并放到池中。根据此原理,可以推定s4与s3是相同的引用,指向同一个对象。
但此原理并不适用于new所创建的字符串对象,代码运行到第1行时,会创建"Hello"字符串对象,而它并没有放到字符串池中。代码第2行又创建了一个新的"Hello"字符串对象,s1和s2是不同的引用,指向不同的对象。
其次,String、StringBuffer、StringBuilder三者中 ,就运行速度而言,StringBuilder最高,StringBuffer次之,最后是String。造成这种情况的原因是String是由final修饰的字符串常量,而StringBuffer和StringBuilder是字符串变量,即字符串常量一旦创建之后就无法改变,(但实际应用中我们是经常在改变它的值)当我们每次改变字符串常量的时候,都会生成一个新的String对象,所以如果是经常改变内容的字符串最好不要用String字符串常量,因为每次生成对象都会对系统性能产生影响。
而StringBuffer和StringBuilder就不同了,它们是字符串变量,创建后是可以改变的,我们每次操作的结果都是它对象本身,因此效率也会更高。
最后,从线程安全的角度来看,StringBuilder是非线程安全的,而StringBuffer是线程安全的。因为在StringBuffer中,有很多方法是被synchronized关键字修饰的(因此也就限制了它的性能),所以如果在多线程应用时,应尽量使用StringBuffer从而保证线程安全,避免一些不必要的错误;当对线程安全没有必要的要求时,例如单线程下,可使用StringBuilder来提高系统性能。
另外,可能有人会有疑问,既然String是final修饰类型,确可以进行重新赋值或+等操作呢?
因为String的+操作实际是调用了StringBuffer的append方法进行,然后又通过StringBuffer的toString()操作重新赋值的。
[ Java学习基础 ] String、StringBuffer、StringBuilder比较学习的更多相关文章
- Java学习笔记--String StringBuffer StringBuilder
String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...
- 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...
- 重温java中的String,StringBuffer,StringBuilder类
不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...
- Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用
Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...
- 在JAVA中,String,Stringbuffer,StringBuilder 的区别
首先是,String,StringBuffer的区别 两者的主要却别有两方面,第一是线程安全方面,第二是效率方面 线程安全方面: String 不是线程安全的,这意味着在不同线程共享一个String ...
- Java学习之String StringBuffer StringBuilder区别
1.String:对象长度是不可变的,是线程安全. 2.StringBuffer:对象长度是可变的,是线程安全. 3.StringBuilder:对象长度是可变,不是线程安全.
- 【Java基础】String StringBuffer StringBuilder
String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...
- 探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- 转发: 探秘Java中的String、StringBuilder以及StringBuffer
原文地址 探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家 ...
- 探秘Java中的String、StringBuilder以及StringBuffer(转载)
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...
随机推荐
- xcode修改代码目录结构出现clang:error:nosuchfileordirectory解决方法
需要迁移一个开源工程的一部分内容到自己工程,迁移对方的工程到自己工程之后,因目录结构配置整理需要,对嵌入的工程目录进行了结构改变,编译后出现: clang: error: no such file o ...
- 【iOS】跳转到设置页面
iOS8.0以后有效 定位服务 定位服务有很多APP都有,如果用户关闭了定位,那么,我们在APP里面可以提示用户打开定位服务.点击到设置界面设置,直接跳到定位服务设置界面.代码如下: 1 2 3 4 ...
- 同样是IT培训,为什么人家月薪过万,你才几千,问题在哪?!
听过一句话"360行,行行转IT",虽然有些夸张,但也不难看出IT行业的火爆程度.从李总理提的"互联网+大数据"开始,中国的这场"互联网+" ...
- python之路--day15---软件开发目录规范
软件开发目录规范 bin--启动文件 conf--配置文件 core--核心代码 db--数据文件 lib--常用功能代码 log--日志文件 readme--软件介绍
- STL之queue
描述 使用STL中的queue,完成入队.出队.获取队首.获取队尾等基本操作. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { queue<int> ...
- C# 使用 GDI+ 给图片添加文字,并使文字自适应矩形区域
需求 需求是要做一个编辑文字的页面.用户在网页端写文字,文字区域是个矩形框,用户可以通过下方的拖动条调节文字大小. 如下图: 提交数据的时候前端传文字区域的左上角和右下角定位给后台.因为前端的字体大小 ...
- wordpress怎么禁止文章复制
登陆你的网站后台--点击菜单栏的"外观"--点击"编辑"--在右侧,找到footer.php,打开它--在</body>之前加入以下代码: 1.禁止 ...
- AWS的开发工具包和设备SDK开发工具包
一.开发工具包 二.设备sdk开发工具包
- SpringBoot+Angular2 开发环境搭建
https://segmentfault.com/a/1190000007921675
- Docker学习笔记 - Docker客户端和服务端
学习内容: Docker客户端和服务端的通讯方式:client和自定义程序 Docker客户端和服务端的连接方式:socket 演示Docker客户端和服务端之间用remote-api通讯:nc ...