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. ...
随机推荐
- python 获取当前时间
我有的时候写程序要用到当前时间,我就想用python去取当前的时间,虽然不是很难,但是老是忘记,用一次丢一次,为了能够更好的记住,我今天特意写下python 当前时间这篇文章,如果你觉的对你有用的话, ...
- Load ContextCLR 探测
目录 背景Load ContextCLR 探测过程弱签名程序集的探测过程强签名程序集的探测过程Default ContextLoad-From ContextNo ContextRelfection- ...
- 大IT公司笔试
都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来了,免得笑话我们这些未出校门的孩纸们,但 ...
- [转]Introduction to Core Bluetooth: Building a Heart Rate Monitor
ref:http://www.raywenderlich.com/52080/introduction-core-bluetooth-building-heart-rate-monitor The C ...
- 企业架构研究总结(25)——TOGAF架构开发方法(ADM)之迁移规划阶段
1.8 迁移规划(Migration Planning) 企业架构开发方法各阶段——迁移规划 1.8.1 目标 本阶段的目标是: 确保实施和迁移规划与企业中各种管理框架相协调. 通过对每个进行中的成本 ...
- cocos2d(背景图片循环滚动)
背景图片循环滚动 使用action 实现的: 主要有两个背景图片交替循环滚动:我选的两个背景图片的宽度都是1024的 ,所以定义了#define BGIMG_WIDTH 1024 代码如下: 在Hel ...
- 学会Func
学会Func 前言 首先你要会最基本的委托的使用,如果不会,看起来可能会有难度.. 不过第一个例子将帮你复习一下委托delegate 接下来通过几个例子就会学会怎么灵活使用Func了 委托回顾(d ...
- WCF小实例以及三种宿主
WCF小实例以及三种宿主 最近一直在学习WCF相关知识,下面将通过一个小实例对所学的知识进行简单的回顾:本实例是一个简单三层操作数据库,并且也简单实现的三种宿主(控制台宿主,IIS宿主以及Window ...
- Dispose模式
Dispose模式 Dispose模式是.NET中很基础也很重要的一个模式,今天重新复习一下相关的东西并记录下来. 什么是Dispose模式? 什么时候我们该为一个类型实现Dispose模式 使用Di ...
- android 视图设置多个setTag数据
1)在string.xml 文件中添加 <item tyoe="id" name = "tag_first" /> <item tyoe=&q ...