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

String与StringBuffer中substring性能分析

    博客分类:
  • JDK
阅读更多

在jdk1.6中,substring的使用要格外引起注意,首先我们来看看substring是如何实现的: 



 

通过源代码我们看到,直接返回了String对象,我们继续看一下String类的这个构造函数:

 

 

通过源代码我们清晰的看到其实就是直接修改了offset,和count,那就面临一个问题,如果我当前对象长度是1000,但是我只需要前2个,那么就会浪费掉998,通过给出的注释我们可以看到,这是jdk做的一次性能优化,所以我们在使用的时候要额外的小心空间的浪费。

 

注:String类中trim和split这两个常用的方法也用到了substring方法,所以在使用他们的时候要斟酌一下。

 

提到String就必须提到StringBuffer,同样看看StringBuffer类中的substring是如何实现的:

StringBuffer类调用的是AbstractStringBuilder中的substring方法:



 

 

 我们看到了明显的不同:StringBuffer中的substring方法调用的String的构造函数进行了一次数组的copy,这样就不存在String类中的空间浪费的问题了。

 

YY:应该是jdk的作者认为StringBuffer是用来拼接的,所以会比较长,理所当然要重新copy,防止浪费空间,而String一般都不会初始化那么长,所以做了一次offset,count改变达到优化性能,节省时间的母的。

可是笔者发现jdk1.7中String类的substring也是用了copy的方式,是有很多场景会出现从长的String取出短的几位吗?不知道!

不过总结一句:对的时间对的地点使用对的方法才是提高性能的王道。这里做一下简单的分析,大家使用的时候多多注意吧。

  • 大小: 26.5 KB
  • 大小: 10.5 KB
  • 大小: 19.9 KB
  • 大小: 27.7 KB
1
0
分享到:
评论
2 楼 朱秋旭 2014-09-11  
xurping 写道
jdk1.6的实现同时与String和StringBuffer的不同特点有关

1.String是不可变对象,所以可以多个String直接引用同一个char[]数组而不出现问题
2.StringBuffer是可以修改的,所以substring()必须使用copy,否则会导致修改源StringBuffer可能导致substring()结果改变的情况。

至于jdk1.7和jdk1.6的实现那个空间效率更高,还是看场景吧,如果同时保留源String和substring()得到的String,显然jdk1.6的实现性能更好。

如楼主所说,对的时间对的地点使用对的方法才是提高性能的王道。

谢谢回复,个人第二点说的很有道理,StringBuffer必须要用copy的方式,谢谢提醒
1 楼 xurping 2014-09-11  
jdk1.6的实现同时与String和StringBuffer的不同特点有关

1.String是不可变对象,所以可以多个String直接引用同一个char[]数组而不出现问题
2.StringBuffer是可以修改的,所以substring()必须使用copy,否则会导致修改源StringBuffer可能导致substring()结果改变的情况。

至于jdk1.7和jdk1.6的实现那个空间效率更高,还是看场景吧,如果同时保留源String和substring()得到的String,显然jdk1.6的实现性能更好。

如楼主所说,对的时间对的地点使用对的方法才是提高性能的王道。

相关推荐

    string和StringBuffer的区别

    在Java编程语言中,`String`和`StringBuffer`都是用来表示和操作字符串的重要类,但它们在使用场景和性能上有显著的区别。了解这些差异对于编写高效、优化的代码至关重要。 首先,`String`类是不可变的。这意味着...

    String&Stringbuffer

    ### String与StringBuffer知识点详解 #### 一、String与StringBuffer基本概念 **String**:在Java中,`String`类表示不可变的字符序列,它是最常用的字符串类。一旦创建了一个`String`对象,其内容便无法改变。这...

    String总概况及其特性并与StringBuffer的区别详解

    在Java编程语言中,`String`与`StringBuffer`是非常重要的数据类型,被广泛应用于处理文本数据。本文将深入探讨这两个类的基本特性以及它们之间的区别。 #### 一、String特性及重要概念 1. **不可变性...

    面试的经典程序(String,StringBuffer,list,Connections)

    本篇文章将深入探讨标题和描述中提及的关键知识点,包括`String`、`StringBuffer`、数组、集合容器(如`List`)以及并发处理中的`Connections`。 首先,我们来关注`String`类。在Java中,`String`是不可变的对象,...

    初步支持String和StringBuffer类

    在Java编程语言中,`String`和`StringBuffer`类是处理字符串的两个核心类,它们各自具有不同的特性和用途。本篇文章将深入探讨这两个类的初步支持,以及它们在实际编程中的应用。 首先,`String`类是不可变的,意味...

    java CharSequence、String、StringBuffer、StringBuilder详解

    通过分析提供的`String.java`、`StringBuffer.java`和`StringBuilder.java`源码,我们可以深入理解这些类的内部实现,例如它们如何处理字符序列,以及在进行字符串操作时的内存分配和性能优化策略。源码阅读有助于...

    15_常用API_第1天(Object、String、StringBuffer、用户登陆注册)_讲义

    - 与String相比,StringBuffer在频繁修改字符串内容时性能更好。 4. **用户登录注册**: - 用户登录注册涉及到的主要概念包括身份验证(Authentication)和授权(Authorization)。 - 身份验证通常通过用户名和...

    Java 中 String,StringBuffer 和 StringBuilder 的区别及用法

    "Java 中 String、StringBuffer 和 StringBuilder 的区别及用法" Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,了解它们之间的区别对 Java 开发者来说非常重要。本文将详细介绍这三者...

    StringBuffer

    与`String`不同的是,`StringBuffer`的对象可以被修改,这意味着它们是可变的。这使得`StringBuffer`非常适合于执行诸如字符串拼接、插入、删除等操作,尤其是在多线程环境中,它的同步特性保证了线程安全。 #### ...

    【Java基础笔记】String类以及StringBuffer Builder.docx

    理解`String`、`StringBuilder`和`StringBuffer`的特性及其方法,可以帮助开发者在Java编程中更有效地处理字符串,从而优化代码性能和内存管理。在单线程环境中,`StringBuilder`通常更高效;而在多线程环境下,为了...

    java基础String类选择题练习题

    - **知识点**:介绍`String`类中常用的字符串操作方法,如`concat()`、`substring()`、`indexOf()`等。 - **例题**:题目可能会询问“要连接两个字符串,应该使用哪个方法?”或者“如何获取一个字符串中子串的位置...

    java_初学者必须了解的基本知识.doc

    下面是Java中String和StringBuffer类的一些基本知识点。 1. 声明方式:String和StringBuffer都是final类,String继承自Object实现了Serializable、Comparable<String>和CharSequence接口,而StringBuffer继承自...

    JAVA精华 String类一旦初始化就不可以改变,而stringbuffer则可以。它用于封装内容可变的字符串。

    【JAVA精华】在Java编程语言中,String类和StringBuffer类是处理字符串的重要工具,但它们之间存在显著的差异。 1. **String类**:一旦String对象被创建,它的内容就不能更改。这是因为String对象在Java中是不可变...

    StringBuffer总结

    与不可变的`String`类不同,`StringBuffer`对象可以在创建后进行修改,这使得它非常适合在需要频繁修改字符串内容的应用场景中使用。 ### StringBuffer的特点 #### 1. 字符串缓冲区 `StringBuffer`可以被视为一个...

    java基础--4.常用类-3.StringBuffer、StringBuilder

    - 无锁机制:与`StringBuffer`不同,`StringBuilder`没有进行线程同步,因此在单线程环境下,它的性能优于`StringBuffer`,因为它避免了线程同步带来的开销。 - 使用场景:在单线程环境中,为了提高字符串操作的...

    java 如何使用substring()方法截取子串

    在Java编程语言中,`substring()`方法是字符串类(String)的一个重要成员,它用于从原始字符串中提取子串。这个方法非常实用,特别是在处理文本数据时,我们需要根据特定的需求截取字符串的一部分。下面我们将详细...

    Java中String类的详细文档打印版

    由于`String`是不可变的,所以在频繁修改字符串内容的场景中,使用`StringBuffer`(线程安全)或`StringBuilder`(非线程安全但性能更高)会更加高效。 #### 结论 理解`String`类的功能和限制对于Java开发人员来说...

    练习JAVA语句中的String

    6. **String与StringBuilder/StringBuffer**: - 当需要频繁修改字符串时,应使用`StringBuilder`或线程安全的`StringBuffer`,它们提供了可变的字符串操作。 7. **String的哈希码和equals()**: - `hashCode()`...

    Java的String类

    这使得`String`类在多线程环境中非常安全,同时也带来了一些性能上的考量。本文将深入探讨`String`类的各种构造函数、方法及其用途,帮助读者更全面地理解并运用这一关键类。 #### 构造函数 `String`类提供了多种...

    String类的笔记

    `StringBuffer`和`StringBuilder`类提供了一种可变的字符串解决方案,与`String`不同的是,它们允许修改字符串内容。`StringBuffer`是线程安全的,而`StringBuilder`在性能上更优但不支持线程安全,因此在单线程环境...

Global site tag (gtag.js) - Google Analytics