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. ...
随机推荐
- SOA的企业系统架构
基于SOA的企业系统架构设计及IT治理日记 (引) TOGAF是一个架构框架,指导做企业架构的标准和方法,简而言之,是一种协助开发.验收.运行.使用和维护架构的工具,核心是架构开发方法(ADM)指导了 ...
- jQuery中的DOM操作《思维导图》
首先,是关于jQuery中的DOM操作的<思维导图>,请点击这里:jQuery中的DOM操作 列表框的左右选项移动 <html> <head> <title& ...
- Sublime2 Text编辑器使用技巧
Sublime2 Text编辑器使用技巧 ------------------------------------软件使用----------------------------------- ...
- K-Means算法
K-Means算法 K-Means算法的输入N,K和一个size为N的向量组vector.输出K个两两互不相交的向量组.其本质是将给定的向量组划分成K个类别,使得同类别的向量相似度比较大,而不同类别的 ...
- 我的TDD实践---SVN架设篇
我的TDD实践---SVN架设篇 “我的TDD实践”系列之SVN架设 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭 ...
- 公共建筑能耗监测平台的GPRS通讯服务器的开发方法分享
公共建筑能耗监测平台的GPRS通讯服务器的开发方法分享 在这个文章里面我将用一个实际的案例来分享如何来构建一个能够接受3000+个连接的GPRS通讯服务器软件,这个软件被我认为是一个艺术品,实现周期为 ...
- IOS开发小记-内存管理
关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...
- 16Khz音频定时触发采样DMA存储过程
一.AD Setting 1.Calibration (ADCAL) 2.设定ADC Chennel与SCANDIR等,在低功耗应用方案,选择PCLK/4,并设置SMP(tCONV = Samplin ...
- 【stanford C++】字符串(String)与流(Stream)
字符串(String)与流(Stream) 一.C++中字符串(String) 字符串(String):就是(可能是空的)字符序列. C++中的字符串在概念上和Java中的字符串类似. C++字符串用 ...
- VS2012下基于Glut OpenGL glEdgeFlag示例程序:
glEdgeFlag (GLboolean flag)表示一个顶点是否应该被认为是多边形的一条边界边的起点.flag为GL_TRUE后面的点都被认为是边界上的点,flag为GL_FALSE则之后的点不 ...