`
xitong
  • 浏览: 6401968 次
文章分类
社区版块
存档分类
最新评论

String 与String Buffer 区别

 
阅读更多

JVM是怎样处理字符串的呢?

  Java虚拟机会维护一个内部的滞留字符串对象的列表(唯一字符串的池)来避免在堆内存中产生重复的String对象。当JVM从class文件里加载字符串字面量并执行的时候,它会先检查一下当前的字符串是否已经存在于滞留字符串列表,如果已经存在,那就不会再创建一个新的String对象而是将引用指向已经存在的String对象,JVM会在内部为字符串字面量作这种检查,但并不会为通过new关键字创建的String对象作这种检查。当然你可以明确地使用String.intern()方法强制JVM为通过new关键字创建的String对象作这样的检查。这样可以强制JVM检查内部列表而使用已有的String对象。
  所以结论是,JVM会内在地为字符串字面量维护一些唯一的String对象,程序员不需要为字符串字面量而发愁,但是可能会被一些通过 new关键字创建的String对象而困扰,不过他们可以使用intern()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。下一小节会向大家展示更多的信息。


滞留字符串的优化作用
  同一个字符串对象被重复地创建是不必要的,String.intern ()方法可以避免这种情况。下图说明了String.intern()方法是如何工作的,String.intern()方法检查字符串对象的存在性,如果需要的字符串对象已经存在,那么它会将引用指向已经存在的字符串对象而不是重新创建一个。下图描绘了使用了intern()方法的字符串字面量和字符串对象的创建情况。


StringBuffer的缺省行为:
  StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。
  如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到70(2*34+2)。无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍——这也太昂贵了点。所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来立竿见影的性能增益。
  我利用两个StringBuffer重新测试了上面的StringTest4.java代码,一个未使用初始化容量值而另一个使用了。这次我追加了50000个’hello’对象没有使用+操作符。区别是我使用StringBuffer(250000)的构造函数来初始化第二个 StringBuffer了。


关键点
1. 无论何时只要可能的话使用字符串字面量来常见字符串而不是使用new关键字来创建字符串。
2. 无论何时当你要使用new关键字来创建很多内容重复的字符串的话,请使用String.intern()方法。
3. +操作符会为字符串连接提供最佳的性能——当字符串是在编译期决定的时候。
4. 如果字符串在运行期决定,使用一个合适的初期容量值初始化的StringBuffer会为字符串连接提供最佳的性能

参考:http://java.chinaitlab.com/WebServices/390218.html

分享到:
评论

相关推荐

    String、StringBuffer、StringBuilder的使用方法

    在Java编程语言中,`String`、`...理解`String`、`StringBuffer`和`StringBuilder`的区别和使用场合,可以帮助开发者写出更高效、更安全的代码。在实际开发中,应根据项目需求和环境选择合适的字符串处理类。

    String型的不可变性

    "String型的不可变性" Java 中的 String 型是一个特殊的包装类数据,它具有不可变性。什么是不可变性呢?简单来说,就是 String 对象一旦被创建,不能被修改。那么,为什么 String 对象不能被修改呢?这就需要从 ...

    String&StringBuffer&StringBuilder三者之间的区别-经典解析.doc

    - **可变性与效率**:StringBuilder与StringBuffer类似,也是可变的,允许直接修改对象。但是,StringBuilder没有实现线程安全,这意味着它不包含同步方法,因此在单线程环境中,StringBuilder通常比StringBuffer更...

    C++实现string存取二进制数据的方法

    然而,在处理二进制数据时,需要注意string类的一些特性,因为它通常与文本字符串关联,而二进制数据可能包含特殊的字符,如空字符('\0'),这可能导致意外的结果。本文将探讨如何在C++中利用string类存储和提取二...

    string buffer留言板

    最好,功能最强大的留言本,加强WORD留言功能。非常使用 组织机构代码证,并请自带U盘拷贝电子文档资料.购买了招标...13.3招标人不接受有任何选择的报价....行政审批,危机事件处理,法规政策等. 其四,就加工深度而

    string、wstring、cstring、 char、 tchar、int、dword转换方法

    `string`与`wstring`之间的转换 #### `string`到`wstring` ```cpp wstring s2ws(const string& s) { _bstr_t t = s.c_str(); wchar_t* pwchar = (wchar_t*)t; wstring result = pwchar; return result; } ``` ...

    C++_String

    `std::string` 可以与 `<algorithm>` 库中的函数结合使用,实现更多高级功能。 **1.5.1 `std::string` 与 `std::remove`** `std::remove` 可以用来移除 `std::string` 中的所有指定字符。 **示例代码**: ```cpp ...

    string-buffer:浏览器中要使用的Node.js Buffer的实现

    var StringBuffer = require('string-buffer'); 或者 [removed][removed] var buffer = StringBuffer(); var secondBuffer = StringBuffer(); buffer.writeUInt8(254, 0); secondBuffer.writeDoubleBE(232.222, 0...

    string.h函数介绍大全

    String.h 函数介绍大全 String.h 头文件提供了一组强大的字符串处理函数,用于对字符串进行各种操作,如拷贝、拼接、查找、比较等。此外,string.h 还包含了一些内存处理函数,如内存拷贝、内存移动、内存比较等。 ...

    c_string_buffer:一个简单的C字符串缓冲区

    string_buffer C的简单字符串缓冲区。 概述 该库提供了一个简单的字符串缓冲区,该缓冲区允许添加不同的基本数据类型。 它可用于生成大字符串,而无需担心内存分配或类型转换。 用法 # include " string_buffer.h ...

    C++ string深入详解(最新版)

    与 C 语言中的字符数组不同,`string` 类提供了一系列内置的操作,使得字符串处理更加便捷和安全。 **特点:** - **安全性:** `string` 类内部自动管理内存,避免了传统 C 字符串可能引发的内存泄漏或溢出等问题。...

    Buffer操作大全

    3. `Buffer.from(string[, encoding])`:根据指定的encoding(如'utf8')将字符串转化为Buffer。 4. `Buffer.from(buffer)`:复制另一个Buffer到新Buffer。 二、Buffer的读写操作 1. `buffer.write(string[, offset...

    Format String漏洞介绍

    Format String漏洞是一种安全漏洞,主要出现在C语言编程中,源于对`printf`家族函数的不当使用。这些函数包括`fprintf`、`printf`、`sprintf`、`snprintf`、`vfprintf`、`vprintf`、`vsprintf`、`vsnprintf`以及如`...

    lua-buffer:缓冲模块

    err:string :错误消息。 例子 local buffer = require ( ' buffer ' ); local buf, err = buffer. new ( 128 ); 方法 内存,字节= buf:raw() 返回原始内存指针和字节数。 退货 mem:lightuserdata :原始...

    node.JS二进制操作模块buffer对象使用方法详解

    由于Buffer类是JavaScript与C++结合的模块,它将性能相关部分用C++实现,非性能相关的部分用JavaScript实现。这意味着Buffer对象能在保证性能的同时,还可以利用JavaScript的便捷性。 在Node.js中创建Buffer实例...

    JAVA中String类与StringBuffer类的区别

    - **可变性**:与String类不同,StringBuffer是可变的,允许在已有对象上直接进行修改,无需每次都创建新对象,因此在大量字符串操作时更高效。 - **内存缓冲**:StringBuffer内部维护了一个字符数组,除了当前...

    string.h函数介绍.docx

    String.h 函数介绍 String.h 库是 C 语言中处理字符串和内存的标准库,包含了许多有用的函数。这些函数可以帮助开发者快速高效地处理字符串和内存操作。本文将对 String.h 库中的函数进行详细介绍。 一、字符串...

    Protocol Buffer

    **Protocol Buffer:深入理解与应用** Protocol Buffer是Google开发的一种数据序列化协议,它提供了一种高效、跨平台的方式来存储和传输结构化数据。Protocol Buffer的主要功能是将复杂的数据结构转换为二进制流,...

    Protocol Buffer 3.0 C++

    Protocol Buffer是Google开发的一种数据序列化协议,它允许开发者定义数据结构,并将其转换为二进制格式进行存储或网络传输。Protocol Buffer 3.0 (简称protobuf) 是该技术的第三个主要版本,提供了更强大的功能和...

    javastring.pdf

    - `String(StringBuffer buffer)`:从`StringBuffer`对象创建字符串。 - `String(StringBuilder builder)`:从`StringBuilder`对象创建字符串。 2. **方法摘要**: - `charAt(int index)`:返回指定索引处的字符...

Global site tag (gtag.js) - Google Analytics