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. ...
随机推荐
- [转]Blocking Code Injection on iOS and OS X
Source:http://www.samdmarshall.com/blog/blocking_code_injection_on_ios_and_os_x.html Yesterday I pos ...
- 马赛克算法及iOS代码实现
之前做了一下相关涂鸦的东西,发现图片处理挺好玩的,就先讲讲马赛克的实现吧. 放大马赛克图片可以看到,可以看到一个个单色的小正方形.所以马赛克其实也就是把某一点的色值填充了它一定范围内的一个正方形,这样 ...
- PHP中的赋值-引用or传值?
直接上代码: <?php $num1 = 1; $num2 = $num1; $num1 = 2; echo $num2 . "\n"; $arr1 = array(1, 2 ...
- 基于Hadoop开发网络云盘系统客户端界面设计初稿
基于Hadoop开发网络云盘系统客户端界面设计初稿 前言: 本文是<基于Hadoop开发网络云盘系统架构设计方案>的第二篇,针对界面原型原本考虑有两个方案:1.类windows模式,文件夹 ...
- QT 菜单程序
MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include<QMainWindow> #include<QMess ...
- phper談談最近重構代碼的感受(2)
重构代码更多的是对程序的可读性和可扩展性上做一些优化. 首先我对可读性进行细化.借鉴大神川山甲的重构系列文http://www.cnblogs.com/baochuan/archive/2012/03 ...
- <Video> in HTML5
HTML5 提供了视频播放元素<video>用来显示播放特定格式的视屏. * <video> 所支持的视屏格式: Ogg, MPEG4, WebM *<video> ...
- [jstips]向数组中插入一个元素
向现有数组中插入一个元素是经常会见到的一个需求.你可以: 使用push将元素插入到数组的尾部: 使用unshift将元素插入到数组的头部: 使用splice将元素插入到数组的中间: 上面那些方法都是常 ...
- 使用TypeScript开发ReactNative应用的简单示例
最近小小尝试了下 ReactNative + TypeScript 开发APP,爬了无数坑之后总算弄出来个结果,重要的地方记录下,后面会附上示例代码: 1.开发工具的选择 windows 平台我接触的 ...
- [UI] APP界面设计流程
此教程从交互开始进行APP界面设计,主要是一个流程,还是值得童鞋们学习一下的.包括:1.交互流程设计:2.风格定位:3.功能icon设计:4.界面视效整体优化:5.应用icon设计.