`
kofsky
  • 浏览: 201790 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

StringBuffer与String的一点区别

 
阅读更多
String:
是对象不是原始类型
为不可变对象,一旦被创建,就不能修改它的值
对于已经存在的String对象的修改都是重新创建一个新的String对象
String 是final类,不能被继承
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
只能通过构造函数来建立

通常,可以通过下面的语法创建一个String对象
String str="hello here";
或者也可以使用这样的语法
String str=new String("hello here");
在创建一个StringBuffer对象时,我们不能使用第一种方式,因为它的右边是一个String对象,而左边是一个StringBuffer对象,两者的类型不匹配。   
StringBuffer sb = new StringBuffer();
sb = "hello here";//错误,类型不匹配

可以通过下面的方式创建一个空字符串:
String str="";
或者也可以使用这样的形式:
String str=new String();

如果需要创建一个空的StringBuffer对象,可以使用
StringBuffer sf = new StringBuffer();
或者
StringBuffer sf = new StringBuffer("");

当创建String对象时,可以使用一个非空的初始化字符串。编译器为这个对象所分配的内存就是存储这些字符所需要的内存空间。比如,String类型字符串str="hello there",调用str.length()获得其长度为11。

当我们初始化StringBuffer对象时,系统为它分配的内存比字符串实际所需要的内存空间多出16个字符。这是为了削除当我们对这个字符串对象进行修改时由于添加少量字符而导致的内存分配开销。可以通过capacity()方法获得StringBuffer对象的容量。StringBuffer str="hello there",调用length()获得其长度为11,调用capacity()可获得其容量为27.

可以通过StringBuffer的构造函数来设定它的初始化容量,这样可以明显地提升性能。这里提到的构造函数是StringBuffer(int length),length参数表示当前的StringBuffer能保持的字符数量。也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。首先我们看看StringBuffer的缺省行为,然后再找出一条更好的提升性能的途径。StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。
  如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍——这也太昂贵了点。所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来立竿见影的性能增益。
 使用一个合适的容量值来初始化StringBuffer永远都是一个最佳的建议。


以上为整理网络资料而得
非原创


 
分享到:
评论

相关推荐

    java 中String和StringBuffer与StringBuilder的区别及使用方法

    Java 中 String 和 StringBuffer 与 StringBuilder 的区别及使用方法 Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,每个类都有其特点和使用场景。在开发过程中,正确选择合适的字符串...

    java基础String类选择题练习题

    - **知识点**:解释`StringBuffer`类是什么,它与`String`类之间的区别,以及何时应该使用`StringBuffer`而不是`String`。 - **例题**:选择题可能会考察对`StringBuffer`的理解,比如“以下哪个类支持可变长度的...

    StringTable.pdf

    StringTable确保了这一点,它是一个哈希表,存放的是字符串引用而非字符串本身。 2. **内存分布**:在JDK6及之前,StringTable位于JVM的永久代;JDK7开始,移到了Java堆;JDK8进一步改到了元空间,以减少永久代的...

    我们一起学Java之String

    在JDK 8版本中,字符串常量池的位置发生了变化,从方法区移至Java堆中,但这并不影响程序员对字符串常量池的概念理解与使用。理解这一点对编写高效代码十分关键。 当程序需要存储一段字符串时,字符串常量池的机制...

    Java常用类与基础API-String的理解与不可变性

    ### Java常用类与基础API-String的理解与不可变性 #### 一、字符串相关类之不可变字符序列:String ##### (1) 对String类的理解(以JDK8为例说明) **1. 环境** 本文档使用JDK 8进行演示。JDK 8的环境设置确保了...

    区分java中String+String和String+char

    本文将深入探讨`String+String`和`String+char`这两种不同操作之间的区别。 首先,我们要理解Java编译器的优化机制。在Java中,如果两个`String`对象通过`+`运算符连接,如`"abc" + '/'`,编译器会自动进行字面量...

    Java字符串连接原理

    本文主要参考黑马程序员的Java面试宝典上的内容 我们都知道,在Java中字符串可以用+...StringBuffer是线程安全的,他的方法都被synchronized修饰过,StringBuilder 是线程不安全的,通常效率要比StringBuffer要高一点

    Java初学者都必须知道的六大问题.doc|Java初学者都必须知道的六大问题.doc

    5. String与StringBuilder/StringBuffer 如果需要对字符串进行多次修改,使用StringBuilder或StringBuffer更合适,因为它们允许在已有字符串基础上进行追加或插入操作,而不会每次都创建新对象。StringBuffer是线程...

    2023最新Android 面试篇(2303版).pdf

    所以最基本的一点区别就是:Integer是int的包装类,int的初始值为零,而Integer的初值为null。 4. 谈谈对Java多态的理解 多态即:事物在运行过程中存在不同的状态。多态的存在有三个前提:要有继承关系、子类重写...

    java类与数组个人作业.pdf

    - **(1) “==”运算符与 equals() 方法的区别**: - **“==”运算符**: 用于比较两个对象是否引用相同的内存地址(即是否指向同一个对象)。 - **equals() 方法**: 用于比较两个字符串的内容是否完全一致。 - **...

    (2020最新)Java面试题.pdf

    :String、StringBuilder、StringBuffer等,String是不可变的,StringBuilder和StringBuffer是可变的。 8. String str="i"与String str=new String("i")一样吗?:不一样,因为前者是从字符串池中获取的,而后者是...

    java面试题解析困惑之二

    10. **String与StringBuilder/StringBuffer** - 当需要频繁地拼接字符串时,使用`StringBuilder`或`StringBuffer`(线程安全)类比使用`+`运算符更高效,因为后两者在拼接时不需要创建新的对象。 了解这些核心概念将...

    Java必须理解的六大问题及学习方向和方法

    在这个过程中,并没有创建第二个`String`对象,`string`与`s`实际上指向的是同一个对象。这说明在Java中,当我们使用引用类型时,我们处理的是指向对象的引用,而非对象本身。 #### 问题二:"=="和`equals`方法的...

    JAVA面试必备20题.pdf

    5. String、StringBuffer、StringBuilder的区别:String对象不可变,每次操作都会创建新的对象。StringBuffer和StringBuilder是可变的字符串类,StringBuffer是线程安全的,适用于多线程环境,而StringBuilder不是...

    125条常见的java面试笔试题大汇总.

    String 与 StringBuffer 的区别 文档还提到了`String`和`StringBuffer`的区别。`String`是不可变的对象,一旦创建就不能更改;而`StringBuffer`则支持在原有基础上进行修改,因此在需要频繁修改字符串的情况下更...

    Java中常用的各种技能

    在 Java 中,可以使用 `String` 类的 `join()` 方法将数组中的元素组合成字符串,但是 Java 中没有内置的方法可以直接实现这一点。 5. Java 中的命名规范 在 Java 中,方法名通常使用小写字母开头,而类名使用大写...

    Java初学者都必须理解的六大问题.

    **问题二:“==”与equals方法的区别** `==`操作符用于比较基本类型的值是否相等,而对于对象,它比较的是两个引用是否指向同一个对象实例。例如,`int a=10; int b=10;`,`a==b`是true,因为它们都代表10的值。然而...

    Java String 拼接字符串原理详解

    答案是,当我们将 null 字符串与其他字符串进行拼接时,StringBuilder 对象会将 null 转换为字符串 "null"。这在 StringBuilder 的源码中有所体现: public StringBuilder append(StringBuffer sb) { super.append...

    根据表结构生成JavaBean,史上最强最专业的表结构转JavaBean的工具(第8版)

    1、新增清除StringBuffer工具,是String字符串拼接工具的逆向工具。 2、新增字符串格式化工具,提高工作效率的利器。 3、移除XML字符串拼接工具,将该功能整合到了字符串格式化工具中。 4、调整字段设置界面,更...

Global site tag (gtag.js) - Google Analytics