在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取出短的几位吗?不知道!
不过总结一句:对的时间对的地点使用对的方法才是提高性能的王道。这里做一下简单的分析,大家使用的时候多多注意吧。
相关推荐
在Java编程语言中,`String`和`StringBuffer`都是用来表示和操作字符串的重要类,但它们在使用场景和性能上有显著的区别。了解这些差异对于编写高效、优化的代码至关重要。 首先,`String`类是不可变的。这意味着...
### String与StringBuffer知识点详解 #### 一、String与StringBuffer基本概念 **String**:在Java中,`String`类表示不可变的字符序列,它是最常用的字符串类。一旦创建了一个`String`对象,其内容便无法改变。这...
在Java编程语言中,`String`与`StringBuffer`是非常重要的数据类型,被广泛应用于处理文本数据。本文将深入探讨这两个类的基本特性以及它们之间的区别。 #### 一、String特性及重要概念 1. **不可变性...
本篇文章将深入探讨标题和描述中提及的关键知识点,包括`String`、`StringBuffer`、数组、集合容器(如`List`)以及并发处理中的`Connections`。 首先,我们来关注`String`类。在Java中,`String`是不可变的对象,...
在Java编程语言中,`String`和`StringBuffer`类是处理字符串的两个核心类,它们各自具有不同的特性和用途。本篇文章将深入探讨这两个类的初步支持,以及它们在实际编程中的应用。 首先,`String`类是不可变的,意味...
通过分析提供的`String.java`、`StringBuffer.java`和`StringBuilder.java`源码,我们可以深入理解这些类的内部实现,例如它们如何处理字符序列,以及在进行字符串操作时的内存分配和性能优化策略。源码阅读有助于...
- 与String相比,StringBuffer在频繁修改字符串内容时性能更好。 4. **用户登录注册**: - 用户登录注册涉及到的主要概念包括身份验证(Authentication)和授权(Authorization)。 - 身份验证通常通过用户名和...
"Java 中 String、StringBuffer 和 StringBuilder 的区别及用法" Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,了解它们之间的区别对 Java 开发者来说非常重要。本文将详细介绍这三者...
与`String`不同的是,`StringBuffer`的对象可以被修改,这意味着它们是可变的。这使得`StringBuffer`非常适合于执行诸如字符串拼接、插入、删除等操作,尤其是在多线程环境中,它的同步特性保证了线程安全。 #### ...
理解`String`、`StringBuilder`和`StringBuffer`的特性及其方法,可以帮助开发者在Java编程中更有效地处理字符串,从而优化代码性能和内存管理。在单线程环境中,`StringBuilder`通常更高效;而在多线程环境下,为了...
- **知识点**:介绍`String`类中常用的字符串操作方法,如`concat()`、`substring()`、`indexOf()`等。 - **例题**:题目可能会询问“要连接两个字符串,应该使用哪个方法?”或者“如何获取一个字符串中子串的位置...
下面是Java中String和StringBuffer类的一些基本知识点。 1. 声明方式:String和StringBuffer都是final类,String继承自Object实现了Serializable、Comparable<String>和CharSequence接口,而StringBuffer继承自...
【JAVA精华】在Java编程语言中,String类和StringBuffer类是处理字符串的重要工具,但它们之间存在显著的差异。 1. **String类**:一旦String对象被创建,它的内容就不能更改。这是因为String对象在Java中是不可变...
与不可变的`String`类不同,`StringBuffer`对象可以在创建后进行修改,这使得它非常适合在需要频繁修改字符串内容的应用场景中使用。 ### StringBuffer的特点 #### 1. 字符串缓冲区 `StringBuffer`可以被视为一个...
- 无锁机制:与`StringBuffer`不同,`StringBuilder`没有进行线程同步,因此在单线程环境下,它的性能优于`StringBuffer`,因为它避免了线程同步带来的开销。 - 使用场景:在单线程环境中,为了提高字符串操作的...
在Java编程语言中,`substring()`方法是字符串类(String)的一个重要成员,它用于从原始字符串中提取子串。这个方法非常实用,特别是在处理文本数据时,我们需要根据特定的需求截取字符串的一部分。下面我们将详细...
6. **String与StringBuilder/StringBuffer**: - 当需要频繁修改字符串时,应使用`StringBuilder`或线程安全的`StringBuffer`,它们提供了可变的字符串操作。 7. **String的哈希码和equals()**: - `hashCode()`...
这使得`String`类在多线程环境中非常安全,同时也带来了一些性能上的考量。本文将深入探讨`String`类的各种构造函数、方法及其用途,帮助读者更全面地理解并运用这一关键类。 #### 构造函数 `String`类提供了多种...
`StringBuffer`和`StringBuilder`类提供了一种可变的字符串解决方案,与`String`不同的是,它们允许修改字符串内容。`StringBuffer`是线程安全的,而`StringBuilder`在性能上更优但不支持线程安全,因此在单线程环境...