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的区别的更多相关文章

  1. String, StringBuilder 与StringBuffer的区别与联系

    1.区别 (1)String构建的对象不能改变,每次对String进行操作时,如两个String相加,需要新建一个String对象,然后容纳最终的结果. 而StringBuilder与StringBu ...

  2. String,StringBuilder与StringBuffer的区别

    相信大家看到过很多比较String和StringBuffer区别的文章,也明白这两者的区别,然而自从Java 5.0发布以后,我们的比较列表上将多出一个对象了,这就是StringBuilder类.St ...

  3. java中string、stringBuild、stringBuffer的区别

    (1)string 1,Stirng是对象不是基本数据类型        2,String是final类,不能被继承.是不可变对象,一旦创建,就不能修改它的值.        3,对于已经存在的Sti ...

  4. String和StringBuffer的区别

    1.选自http://szh-java.iteye.com/blog/1666630 String 1,Stirng是对象不是基本数据类型 2,String是final类,不能被继承.是不可变对象,一 ...

  5. 有关string stringbuff stringbuild 的区别

    string  stringbuff stringbuild的执行效率: stringbuild>stringbuff>string String类是不可变类,任何对String的改变都会 ...

  6. String类和StringBuffer类的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  7. String,StringBuffer,StringBuilder区别

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  8. String与StringBuffer的区别

    首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...

  9. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

随机推荐

  1. sprinfmvc学习--01

    springmvc框架是一个基于请求驱动的web框架,使用了前端控制器模式来设计.根据请求映射规则分发给相应的页面控制器进行处理. 1.  首先用户发送请求-->DispatcherServle ...

  2. RPC技术

    微软RPC技术学习小结 RPC,即Remote Procedure Call,远程过程调用,是进程间通信(IPC, Inter Process Communication)技术的一种.由于这项技术在自 ...

  3. [google面试CTCI] 1-4.判断两个字符串是否由相同字符组成

    [字符串与数组] Q:Write a method to decide if two strings are anagrams or not 题目:写一个算法来判断两个字符串是否为换位字符串.(换位字 ...

  4. 【C#】聊聊不需要记密码的密码管理补充帖 —— 具体实现

    开篇第一句话,就是“小白继续,有实际经验的兄弟们可以洗洗睡了”,因为这个 Lite 版是个实验性的实现,也由于水平原因源码不忍直视,所以如果你坚持看完了,请留下宝贵意见. 以下,干货: 基本模式: 程 ...

  5. cocos2d(CCSprite绑定不规则刚体与精灵一起移动)

    对于不规则的精灵我们可以借助PhysicsEditor来制作shape , 对于地图可以使用Tiled软件制作瓷砖地图. 今天主要记录一下如何把CCSprite与不规则刚体进行绑定,然后一起移动 // ...

  6. Effective Java:Ch4_Class:Item14_在public类中应该使用访问方法而不是public域

    你可能偶尔需要编写退化类,目的只是为了集中实例域: // Degenerate classes like this should not be public! class Point { public ...

  7. asp.net mvc异步查询

    对于asp.net mvc异步查询 如何做MVC异步查询,做列表页面. 查询是项目中必不可少的工作,而且不同的项目不同的团队,都有自己的简单方法.Asp.net mvc 有自己独特的优势,下面是结合m ...

  8. VC 编程ANSI环境下读写Unicode文件

    没有注意到文件编码的不同会产生这么多的问题,在动手以前查询了很多资料,在本博客中收藏了不少先辈的成果,在这里一并表示致敬!       关于ANSI和Unicode编码的原理在这里也不说了,主要讲下如 ...

  9. 统计知识选讲(一)——主成分分析(PCA)的思想

    主成分分析的主要目的是希望用较少的变量去解释原来资料中的大部分变异,将我们手中许多相关性很高的变量转化成彼此相互独立或不相关的变量,从而达到降维的目的.在原始数据“预处理”阶段通常要先对它们采用PCA ...

  10. tornado + supervisor + nginx + linux 亲身体验

    先说说思路 一.安装这些东西,tornado, supervisor( sudo pip install supervisor  在linux 系统上), 安装 nginx  (sudo apt-ge ...