`
bupter520
  • 浏览: 55709 次
  • 性别: Icon_minigender_2
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Java字符串类真相“大白”

阅读更多

实际编程中对字符串的处理是我们经常不得不面对的问题。而对于java开发人员来说,我们可以很方便的处理字符串操作。但是我们有时候使用时又有些迷惑,因为API中共提供了StringStringBufferStringBuilder三个类,让我们不知道怎么取舍。本文就是好好研究一下这几个类之间的区别,帮助我们开发时选用正确的方式处理字符串。言归正传,下面我就一一道来:

概览:

名称

类型

执行速度

线程安全

适用场合

String

字符串常量

-

少量字符串

StringBuffer

字符串变量

较快

安全

大量串,多线程

StringBuilder

字符串变量

不安全

大量串,单线程

对于String类型,如果说它是否线程安全个人觉得不太合适,因为线程安全与否主要是针对可变类状态的改变可能存在的不一致性,而String本身是常量,根本无法改变其状态,所以用线程安全来说有失偏颇,代码层次上也每对String类型做同步上的处理。

下面给一个简单的例子说说String类型的内部处理机制:

String s1 = “eric”;

String s2 = “huang”;

s1 = s1+s2;

       我们知道String类型是字符串常量,之所以可以对两个字符串采用+操作符,主要是Java内部对+进行了重载,虚拟机首先在常量内存区域创建了s1s2两个字符串常量,然后分配再分配部分内存存储s1s2相加的结果,最后将s1指向这块内存区域,故s1不会再指向”eric”代表的内存区域了。可以想象,当我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销。所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM GC 就会开始工作,耗用了很多cpu时间,那速度是一定会相当慢的。

       当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象(toString方法)。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用 StringBuffer 对象和它的 append() 方法。String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。

       Java SE 5.0提供java.lang.StringBuilder类,它是StringBuffer的一个单线程等价类,提供一个与之兼容的API。由于不执行同步,所以速度更快。使用这个类所产生的对象默认会有16个字符的长度,您也可以自行指定初始长度。如果附加的字符超出可容纳的长度,则StringBuilder对象会自动增加长度以容纳被附加的字符。如果有频繁作字符串附加的需求,使用StringBuilder会让程序的效率大大提高。

    使用StringBuilder最后若要输出字符串结果,可以用toString()方法。可以使用length()方法得知目前对象中的字符长度,而capacity()可返回该对象目前可容纳的字符容量。其它具体方法参加API

分享到:
评论

相关推荐

    java 字符串工具类 java 字符串工具类

    java 字符串工具类 java 字符串工具类java 字符串工具类 java 字符串工具类java 字符串工具类 java 字符串工具类java 字符串工具类 java 字符串工具类java 字符串工具类 java 字符串工具类java 字符串工具类 java ...

    java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节;

    java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...

    java 创建字符串类

    Java提供了两种主要的方式来创建字符串:通过`String`类的构造方法和使用`StringBuilder`或`StringBuffer`类。以下是对这些知识点的详细解释: 1. **String类**: - **不可变性**:Java中的`String`对象是不可变的...

    java字符串练习

    在Java中,我们可以使用`String`类提供的方法或正则表达式来实现字符串的解析。例如,给定字符串“卡巴斯基#杀毒软件#免费版#俄罗斯#”,我们可以用`split()`方法,以“#”为分隔符将字符串分割成多个子字符串。下面...

    java 字符串截取工具类

    java 字符串截取工具类java 字符串截取工具类

    java 字符串 正则表达式 详细实例代码

    在Java编程语言中,字符串(String)是至关重要的数据类型,用于存储和操作文本。字符串类提供了丰富的API,使得处理字符串变得高效且灵活。本篇将深入探讨Java中的字符串、正则表达式及其在实际编程中的详细实例代码...

    JAVA字符串操作类CTool.java字符转换类.rar

    JAVA字符串操作类CTool.java字符转换类,此类中收集Java编程中WEB开发常用到的一些工具。为避免生成此类的实例,构造方法被申明为private类型的。封装的功能:字符串从GBK编码转换为Unicode编码、对字符串进行md5...

    java字符串处理取出括号内的字符串

    首先,我们要明白Java中的字符串是`String`类的对象,它提供了丰富的API用于字符串的处理。例如,我们可以使用`substring()`方法来截取字符串的一部分,但这并不适用于提取括号内的内容,因为我们需要识别开括号和闭...

    Java字符串转换为日期和时间比较大小[归类].pdf

    Java 字符串转换为日期和时间比较大小...在 Java 中,我们可以使用 SimpleDateFormat 和 java.sql.Date 类来实现字符串转换为日期和时间比较大小。同时,我们也可以使用 compare_date 方法来比较两个日期字符串的大小。

    java字符串内存计算

    ### Java字符串内存计算 在Java开发中,理解内存管理至关重要,特别是对于字符串处理而言。本文将深入探讨如何在Java中计算字符串所占用的内存空间,包括现有的计算方法、其局限性以及具体的计算公式。 #### 计算...

    Java检索字符串中是否存在某字符

    在实际编程中,Java的`String`类提供了多种字符串操作方法,如`indexOf()`用于查找子串第一次出现的位置,以及`lastIndexOf()`用于查找最后一次出现的位置。然而,对于大量数据的高效处理,自定义的算法如KMP则更为...

    JAVA日期与字符串的转换

    将`java.util.Date`类型的对象转换为字符串可以通过`SimpleDateFormat`类来实现。`SimpleDateFormat`是`java.text`包中的一个子类,它可以用来格式化和解析日期。下面是一个具体的例子: ```java import java.text....

    java 字符串分割

    在 Java 中,我们可以使用 String 类的方法来实现字符串分割,例如使用 split() 方法将字符串分割成数组。 知识点二:Java 中的字符串分割方法 在 Java 中,我们可以使用多种方法来实现字符串分割,例如: 1. ...

    java字符串分隔类

    ### Java字符串分隔类——StringTokenizer的使用方法详解 在Java编程中,处理字符串是非常常见的需求之一,特别是在数据解析、格式化输出等场景下。`StringTokenizer`类作为Java标准库的一部分,为开发者提供了一种...

    java 分解字符串

    在Java编程语言中,分解字符串是一项常见的任务,它涉及到对字符串进行分析,将字符串分割成多个子字符串。这个过程通常被称为字符串分割。在Java中,我们主要使用`String`类提供的`split()`方法来实现这一功能。...

    java 字符串中文判断

    在Java编程语言中,处理字符串是非常常见的操作,尤其是在涉及到文本分析和处理的场景。本文将深入探讨如何在Java中进行中文字符的判断和计数,这主要基于Java的Unicode编码特性以及字符集的理解。 首先,我们需要...

    89.java字符串方法.zip

    89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符...

    java 字符串转16进制Ascii

    在Java编程语言中,将字符串转换为16进制ASCII值是一个常见的操作,尤其是在处理数据编码、网络通信或存储时。这个过程涉及到字符到数字的转换,并且通常使用`Character`类和`Integer`类的方法来完成。让我们深入...

Global site tag (gtag.js) - Google Analytics