`
aa8945163
  • 浏览: 276031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String分析

阅读更多
很多人对String和StringBuffer的区别已经很了解了吧,可能还有人对这两个类的工作原理有些不清楚的地方,复习一下吧,顺便牵出J2SE 5.0里面带来的一个新的字符操作的类StringBuilder。那么这个StringBuilder和StringBuffer 以及我们最早遇见的 String 类有那些区别呢?在不同的场合下我们应该用哪个呢?我讲讲自己对这几个类的一点看法,也希望大家提出意见。
    简要的说,String类型和StringBuffer类型的主要性能区别其实在于 String 是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的 String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用 String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的GC就会开始工作,那速度是一定会相当慢的。这里尝试举个不是很恰当的例子:
String Str = “abc”;
For(int i = 0 ; i < 10000 ; i++)
{
   Str + = “def”;
}
    如果是这样的话,到这个 for 循环完毕后,如果内存中的对象没有被 GC 清理掉的话,内存中一共有上万个了,惊人的数目,而如果这是一个很多人使用的系统,这样的数目就不算很多了,所以大家使用的时候一定要小心。

    而如果是使用StringBuffer类则结果就不一样了,每次结果都会对StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer,特别是字符串对象经常改变的情况下。而在某些特别情况下,String 对象的字符串拼接其实是被 JVM 解释成了StringBuffer对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
String Str = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

    你会很惊讶的发现,生成 String Str 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String Str = “This is only a” + “ simple” + “test”; 其实就是:
String Str = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;

String S3 = “ simple”;

String S4 = “ test”;

String S1 = S2 +S3 + S4;

    这时候 JVM 会规规矩矩的按照原来的方式去做, S1 对象的生成速度就不像刚才那么快了,一会儿我们可以来个测试作个验证。

由此我们得到第一步结论:

   在大部分情况下 StringBuffer > String

   而 StringBuilder 跟他们比又怎么样呢?先简单介绍一下, StringBuilder 是 JDK5.0 中新增加的一个类,它跟 StringBuffer 的区别看下面的介绍:
   Java.lang.StringBuffer线程安全的可变字符序列。类似于 String 的字符串缓冲区,但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
   每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
    但是如果将 StringBuilder 的实例用于多个线程是不安全的。需要这样的同步,则建议使用 StringBuffer 。

    那么下面我们再做一个一般性推导:

    在大部分情况下 StringBuilder > StringBuffer

    因此,根据这个不等式的传递定理: 在大部分情况下
     StringBuilder > StringBuffer > String

分享到:
评论

相关推荐

    String和string区别以及string详解.doc

    标题与描述中提到的知识点是关于C#编程语言中`String`与`string`的区别,以及`string`类型的...通过以上分析,我们可以深入了解C#中`String`与`string`的区别及其使用细节,这对于提高代码质量和程序性能具有重要意义。

    PyPI 官网下载 | bandit-high-entropy-string-2.1.2.tar.gz

    《PyPI上的Python库:Bandit High Entropy String分析》 在Python的生态系统中,PyPI(Python Package Index)是官方的第三方软件包仓库,它为开发者提供了丰富的库资源,使得开发过程更加便捷高效。本资源是PyPI...

    String StringBuffer和StringBuilder区别之源码解析

    在这篇文章中,我们将从源码角度对String、StringBuffer和StringBuilder进行深入分析,了解它们之间的区别。 String类 String类是Java中最基本的字符串类,它是final类,意思是它不能被继承。String类的字符串是不...

    String a="hello" String b="hello" a==b 返回true的问题分析

    String a="hello world"; //在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址...

    c++string用法详解

    String 类的应用场景非常广泛,可以应用于文本处理、数据分析、日志统计等领域。 C++ 的 string 类提供了许多实用的函数和操作符,极大地方便了字符串的处理。掌握 string 类,可以极大提高开发效率和质量。

    string_Linuxstring函数_string_

    在分析提供的`string.c`文件时,我们可以期待看到如何在实际代码中应用这些`string`函数的示例。通过阅读和理解这些示例,你可以更好地掌握这些函数的使用方法和它们在程序设计中的作用。 总的来说,Linux中的`...

    String对象的内存分析

    本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...

    STRING数据库使用教程.pdf

    此外,STRING还提供了网络分析工具,如聚类分析和模块检测,以识别蛋白质网络中的核心结构。 除了基本的查询和网络浏览,STRING还支持高级搜索和数据分析。例如,用户可以上传自己的蛋白质列表,然后进行批量查询,...

    c++ string转换double

    本文将详细介绍如何将 `std::string` 类型的数据转换为 `double` 类型,并分析提供的代码示例。 #### 一、概述 在 C++ 中,将一个字符串转换为数字可以通过多种方式实现。对于将 `std::string` 转换为 `double` 的...

    String1.java

    ### Java字符串操作详解:String1.java程序分析 在Java编程语言中,字符串处理是一项非常重要的技能,无论是进行数据处理还是用户交互,字符串都是一个不可或缺的数据类型。本篇将基于提供的`String1.java`代码示例...

    String.xml Excel 相互转换工具

    在Android应用开发中,字符串资源的管理是一项重要的...通过分析提供的文件,我们可以推测工具的实现原理并理解其主要功能。在实际工作中,这样的工具对于需要处理大量字符串资源的开发者或团队来说,无疑是一大助手。

    STL中的string介绍

    ### STL中的string介绍 在标准模板库(STL)中,`string`是处理文本数据的一个强大工具。它实质上是对C风格字符串的一种封装,...无论是处理简单的文本数据,还是复杂的字符串分析任务,这些类都能提供有效的支持。

    string对象的操作pdf

    #### 三、示例代码分析 下面通过几个示例来进一步了解 `std::string` 的实际应用。 ##### 3.1 字符串比较 ```cpp int main() { std::string s1("abc"); std::string s2("abc"); if (s1 == s2) { std::cout ; ...

    有关String的测试程序包含string内部一些函数

    在Java编程语言中,`String`类是使用最广泛的类之一,它代表不可变的字符序列。本测试程序旨在深入理解和探索`String`类的一些核心...为了更深入地理解`String`类,建议亲自运行并分析`string_size_test`的代码和结果。

    Java中的String池

    通过以上分析可以看出,在Java中理解和掌握String池的概念对于优化程序性能至关重要。正确使用字符串字面量、`new`关键字以及`intern()`方法可以帮助开发者更高效地管理和使用字符串资源。同时,需要注意的是,在...

    String类的intern、split方法

    String类的intern、split方法 String 类的 intern 方法是一个本地方法,定义如下:public native String intern();该方法返回一个字符串对象的内部化引用,由 String 类维护一个初始为空的字符串的对象池,当 ...

    string类型的全部函数

    在深入探讨`string`类型及其成员函数之前,我们先简要回顾一下`string`的本质。在C++标准库中,`string`实际上是`basic_string...无论是简单的字符串拼接,还是复杂的文本分析,`string`都能提供合适的方法来完成任务。

    String容量大小区分

    通过对“String容量大小区分”的分析,我们了解到Java中String对象的独特行为及其对内存管理的影响。为了提高代码效率并避免不必要的资源浪费,开发者应该合理选择字符串创建方式,尤其是在涉及大量字符串操作的场景...

    String类创建对象问题

    ### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...

Global site tag (gtag.js) - Google Analytics