Java String、StringBuffer、StringBuilder有什么区别
①
String是Java语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它是典型的immutable类,被声明成final class,所有属性也都是final的,由于它的不可变性,类似拼接、裁剪字符串等操作,都会产生新的String对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。
由于String在Java 世界使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。其运行机制是:创建一个字符串时,首先检查池中是否有相同值的字符串对象如果有则不需要创建直接从池中刚查找到的对象引用;如果如果没有则新建字符串对象,返回对象引用,并且将新建的对象放入池中。但是通过New创建的字符串对象,是不检查字符串池的,而是直接在堆区或栈区创建一个新的对象,也不会把对象放入池中。上述原则只适用于通过直接量给String对象引用赋值的情况。
String str1="123", 这是直接量赋值方式,放入字符串常量池。
String str2=new String("123");通过new 方式赋值,不放入字符串常量池。
应用场景: 字符串内容不经常发生变化的优先使用String类。例如常量生命,少量的字符串拼接操作等。如果有大量的字符串内容进行拼接,避免使用String与String之间的 "+"操作,因为这样会产生大量无用的中间对象,耗费空间且执行效率低下(新建对象,回收对象话费大量时间)
②
StringBuffer是为解决上面提到拼接产生太多中间对象的问题而提供的一个类。StringBuffer本质上是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者,也就StringBuilder。
应用场景: 在频繁进行字符串的运算时,(如 拼接,替换,删除等)并且运行在多线程环境下,建议使用StringBuffer,例如XML解析,HTTP参与解析与封装。
③
StringBuilder在能力上和StringBuffer没有区别,但是它去掉了线程安全的部分,有效减少了开销,绝大部分情况下进行字符串拼接的首选。它的线程安全是通过把各种修改数据的方法都加上synchronized关键字实现的,非常适合我们常见的线程安全类实现。不必纠结于synchronized性能之类的,考虑可靠性,正确性和代码可读性才是大多数应用开发最重要的因素。
应用场景: 在频繁进行字符串的运算时,(如 拼接,替换,删除等)并且运行在单线程环境下,建议使用StringBuilder,例如SQL语句拼装,JSON封装。
④
为了实现修改字符序列的目的,StringBuffer和StringBuilder底层都是利用可修改的数组,二者都继承了AbstractStringBuilder,里面包含了基本操作,区别仅在于最终的方法是否加了synchronized。二者拥有几乎一致对外提供的调用接口,其底层在内存中存储方式与String相同,都是以一个有序的字符序列进行存储。不同点是StringBuffer/StringBuilder的对象的值是可以改变的,并且值改变以后,对象引用不会发生改变。
两者在对象构造过程中,首先按照默认大小申请一个字符数组,由于会不断加入新数据,当超过默认大小后,会创建一个更大的数组,并将原先的数组内容复制过来,再丢弃旧的数组。因此对于较大对象的扩容会涉及大量的内存复制操作,如果能够预先评估大小,可提升性能。
Java String、StringBuffer、StringBuilder有什么区别的更多相关文章
- final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?
继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...
- java中String,StringBuffer,StringBuilder之间的区别
文章转载自:http://www.cnblogs.com/frankliiu-java/archive/2010/07/05/1771537.html String是固定长度的字符串,如果要发生变化必 ...
- Java String StringBuffer StringBuilder
String 字符串常量存储在常量区,每次追加操作会创建新的对象: StringBuffer 字符串变量 线程安全 在堆上创建,每次追加操作在原对象上进行操作: 速度 StringBuffer ...
- Java基础知识 String StringBuffer StringBuilder三者的区别(面试题)
相同点:String.StringBuffer.StringBuilder最终底层存储与操作的都是char数组,StringBuffer和StringBuilder都继承了AbstractString ...
- String StringBuffer StringBuilder 之间的区别
StringBuffer与StringBuilder的区别: StringBuffer是jdk1.0版本出来的,线程安全,效率低 StringBuilder是jdk1.5版本出来的,线程不安全,效率高 ...
- java ——String , StringBuffer, StringBuilder类
一.String类概述 1.String对象一旦创建就不能改变. 2.字符串常量池. 字符串常量池的特点:池中有则直接使用,池中没有则创建新的字符串常量. 例1: “==” 比较两个对象是否引用同一 ...
- String StringBuffer StringBuilder之间的区别
String:
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- String,StringBuffer,StringBuilder的区别
public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...
- [置顶] String StringBuffer StringBuilder的区别剖析
这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...
随机推荐
- /etc/services
/etc/services文件是记录网络服务名和它们对应使用的端口号及协议,很多的系统程序要使用这个文件.一般情况下,不要修改该文件的内容,否则可能会造成端口冲突 常见的服务如下,各个字段分别表示:s ...
- 虚拟机如何装LINUX
VMware 提供了免費的虛擬機 VMware player 5.0.2 供使用者下載. 從 VMware 官網http://www.vmware.com/. 的頁面進入 “Products” “ ...
- cocos2d-x游戏引擎核心之七——数据持久化
一.XML与JSON XML 和 JSON 都是当下流行的数据存储格式,它们的共同特点就是数据明文,十分易于阅读.XML 源自于 SGML,是一种标记性数据描述语言,而 JSON 则是一种轻量级数据交 ...
- PyQt4网格布局
最通用的布局类别是网格布局(QGridLayout).该布局方式将窗口空间划分为许多行和列.要创建该布局方式,我们需要使用QGridLayout类. #!/usr/bin/python # -*- c ...
- $.post和jquerySubmit返回json数据获取的区别
$.post("/patrol/patrolDataContent!deleteContent.action",{"ids":ids},function(dat ...
- Sql中将字符串按分割符拆分
创建函数 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO Create FUNCTION [dbo].[F_Split] ( @SplitString ...
- java基础---->多线程之Daemon(五)
在java线程中有两种线程,一种是用户线程,另一种是守护线程.守护线程是一种特殊的线程,当进程中不存在非守护线程了,则守护线程自动销毁.今天我们通过实例来学习一下java中关于守护线程的知识.我是个平 ...
- 【BZOJ2901】矩阵求和
Description 给出两个n*n的矩阵,m次询问它们的积中给定子矩阵的数值和. Input 第一行两个正整数n,m. 接下来n行,每行n个非负整数,表示第一个矩阵. 接下来n行,每行n个非负整数 ...
- flex弹性布局属性详解!
详细看下flex弹性布局具体属性: flex容器属性详解:flex-direction:row/column:(横排/竖排) 决定元素的排列方向:flex-wrap:nowrap/wrap/wrap- ...
- jquery 实现点击按钮后出现倒计时效果(用于实现发送手机验证码、邮箱验证码)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...