String与StringBuild、StringBuffer的区别
String与StringBuild、StringBuffer的区别相信困扰了好多新入门的JAVA程序员,而这也是笔试和面试的一道常见题型,如何全面的回答该问题,变得尤为重要。
首先我们需要清楚一点,为什么把他们放在一起进行比较,那是因为他们都是进行字符操作的,StringBuild、StringBuffer自然不用多讲,他们的方法和功能几乎是完全等价的。
一、具体阐述
首先说String,我们说String是不可改变的字符串,原因我们会说他是final修饰,所以不可变,那么用final修饰,会出现什么效果呢?
final关键字:
1、final关键字可以用于成员变量、本地变量、方法以及类。
2、final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
3、你不能够对final变量再次赋值。按照Java代码惯例,final变量就是常量,而且通常常量名要大写。
4、本地变量必须在声明时赋值。
5、final方法不能被重写。
6、final类不能被继承。
final关键字的好处:final的好处:final关键字提高了性能。JVM和Java应用都会缓存final变量。final变量可以安全的在多线程环境下进行共享,而不需要额外的同步开销。使用final关键字,JVM会对方法、变量及类进行优化。
那么String会什么要用final进行修饰呢?我们知道String在JAVA中是被高度使用的,如果String不用final修饰,那么就意味着他可以被继承,这样就有可能会降低程序的性能,参看下面的代码:
public class Test {
public static void main(String[] args) {
// 我们常用的main方法
}
}
public class String2 extends String{
// 如果String 不是final 那么就可以继承 ..
// ...
}
public class Test {
// 那我们的 main也就可以写成
public static void main(String2[] args) { // 注意此处
// 那我们的 main也就可以写成
}
}
以上是我们常用的main方法,如果不用final修饰,那么main方法里的字符串数组我们就可以自己定义,我想这也是当初JAVA设计String为final修饰的原因之一吧。
接下来说一说StringBuffer和StringBuild:
他们都是可变的字符序列,对于StringBuffer,他继承AbstractStringBuilder;StringBuffer,他继承继承AbstractStringBuffer,而且他的常用方法大都采用了synchronized修饰。
二、不同点:
1、每次对String进行改变的时候进行都要创建一个新的对象,然后将指引指向该新的对象,而原来的对象在堆区中不会被销毁,原来对象中的内容会存放在堆中的常量池中。
2、StringBuffer和StringBuilder在修改字符串的时候,是在栈区中完成的,不会创建对象。
对于StringBuilder与StringBuffer:
1、StringBuffer的常用方法大都采用了synchronized修饰,因此是线程安全的。
2、StringBuilder非线程安全。
三、应用场景:
1、如果要操作少量的数据,用String。
例:String s = "a" + "b";
System.out.println( s == "ab" ); // true
2、大量数据的操作,用StringBuffer或StringBuilder
String s = "a";
for( int i=0;i<100000;i++ ){
s +="b";
}
System.out.println(s.length());//等了好久StringBuffer s = new StringBuffer("a");
for( int i=0;i<100000;i++ ){
s.append("b");
}
System.out.println(s.length()); //很快
单线程下,使用StringBuilder;多线程下,使用StringBuffer。
String与StringBuild、StringBuffer的区别的更多相关文章
- String, StringBuilder 与StringBuffer的区别与联系
1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个String相加,需要新建一个String对象,然后容纳最终的结果. 而StringBuilder与StringBu ...
- String,StringBuilder与StringBuffer的区别
相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...
- java中string、stringBuild、stringBuffer的区别
(1)string 1,Stirng是对象不是基本数据类型 2,String是final类,不能被继承.是不可变对象,一旦创建,就不能修改它的值. 3,对于已经存在的Sti ...
- String和StringBuffer的区别
1.选自http://szh-java.iteye.com/blog/1666630 String 1,Stirng是对象不是基本数据类型 2,String是final类,不能被继承.是不可变对象,一 ...
- 有关string stringbuff stringbuild 的区别
string stringbuff stringbuild的执行效率: stringbuild>stringbuff>string String类是不可变类,任何对String的改变都会 ...
- String类和StringBuffer类的区别
首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...
- String,StringBuffer,StringBuilder区别
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- String与StringBuffer的区别
首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
随机推荐
- jQuery的奥秘
颜海镜 高效jQuery的奥秘 讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好 ...
- 马赛克算法及iOS代码实现
之前做了一下相关涂鸦的东西,发现图片处理挺好玩的,就先讲讲马赛克的实现吧. 放大马赛克图片可以看到,可以看到一个个单色的小正方形.所以马赛克其实也就是把某一点的色值填充了它一定范围内的一个正方形,这样 ...
- NHIBERNATE的简单框架的设计
NHIBERNATE的简单框架的设计 上次的 NHibernate的Session管理策略和NHibernateHelper 发布并提供下载,给NHibernate刚入门的同学们带来很多便利. 最近有 ...
- 依赖注入DI
说AOP不得不提依赖注入,先来看看一个实例.通过实例来解释依赖注入和它的用途. 我们现在要设计一个关于衣服的上架功能,有时候需要进行促销,我们现在知道的促销方式有打1折,和打2折. 最初的方案: pu ...
- MapXtreme 随笔记录1
最近在用MapXtreme做项目,随笔记录备忘. 声明:PubMapPara 静态类,后缀为静态类成员变量 1.加载地图 /// <summary> /// 地图工作空间文件路径 /// ...
- iOS学习笔记(十六)——数据库操作(使用FMDB)
iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...
- Android应用--简、美音乐播放器获取专辑图片(自定义列表适配器)
Android应用--简.美音乐播放器获取专辑图片(自定义列表适配器) 2013年7月3日简.美音乐播放器开发 第二阶段已增加功能: 1.歌词滚动显示 2.来电监听 3.音量控制 4.左右滑动切换歌词 ...
- mysql 数据库 简单存储过程游标使用
BEGIN #Routine body goes here... DECLARE no_more_record INT DEFAULT 0; DECLARE TEST_ID INT(20); DECL ...
- Java Volatile transient 关键字
随笔-204 评论-134 文章-0 trackbacks-0 Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变 ...
- C#中的集合类——HashTable
HashTable 被称为键值对集合,类似于字典,根据key可以找到value 键值对对象[键]=值;键值对集合当中,键必须是唯一的,而值是可以重复的 1. HashTable的用法 //创建了一个键 ...