Java -- String类substring方法

本文对比了JDK6与JDK7中String类的substring(int beginIndex,int endIndex)方法的不同之处。JDK6下,该方法不创建新对象,仅改变原有对象的偏移量与长度;而在JDK7中则创建了一个新对象,并通过拷贝的方式获取子串。文章详细解析了两种实现方式,并附带图解帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然JDK8已推出有些日子了,或许等它普及还需些日子。因此这里仍是讨论JDK6和JDK7下String类的substring(int beginIndex ,int endIndex)的使用区别。该方法返回字符串的一个子集,返回的是从原字符串的beginIndex到endIndex-1之间的内容。


先了解在JDK6和JDK7中String类的一个构造:此处省略源代码中异常处理的部分

	//JDK6下的String类其中一个构造
	/**
	 * @param value  字符数组的值
	 * @param offset 数组的偏移量
	 * @param count  字符数组的长度
	 */
	public String(int offset, int count, char value[]) {
		this.value = value;
		this.offset = offset;
		this.count = count;
	}

	public String substring(int beginIndex, int endIndex) {
		return  new String(offset + beginIndex, endIndex - beginIndex, value);
	}

	//JDK7下的String类构造
	public String(char value[], int offset, int count) {
		this.value = Arrays.copyOfRange(value, offset, offset + count);
	}

	public String substring(int beginIndex, int endIndex) {
		int subLen = endIndex - beginIndex;
		return new String(value, beginIndex, subLen);
	}


对于代码:

        String str = "abcde"; //创建一个String类对象str
        str = str.substring(2,4); //从源字符串截取索引为2到3(4-1)的子字符串
        System.out.println(str);
        输出结果:cd

对于JDK6,substring(2,4)并未创建一个新的对象,而是仅仅把offset和length修改了指向"cd",而原来的”abe“依然还存在于java堆中,该堆仍被str指向,因此不会被GC回收,导致浪费空间,降低性能。解决方式:让str成为新的对象指向另一空间,只须:str = str.substring(2,4)+"";多加""便可实现新对象的创建。


对于JDK7,从源代码可看出,是通过新生成对象再经拷贝得出,则之前的"abcde"没有被指向而被GC回收。

无图无真相,附自制简图一张帮助理解。




### Java String 官方文档及相关方法示例 #### JDK API 文档的重要性 Java 提供了全面的 JDK API 文档,这是学习 `String` 以及其他核心功能的重要资源。通过查阅这些文档,开发者能够深入了解各种方法的功能及其使用方式[^1]。 #### String 的基本概念与常用方法 以下是关于 `String` 的一些重要知识点以及其常见方法- **字符串不可变性** 在 Java 中,`String` 是不可变对象 (immutable object),这意味着一旦创建了一个字符串实例,它的值就不能被更改。任何修改操作都会返回一个新的字符串对象。 - **substring() 方法** `String.substring()` 方法用于提取子字符串,它有两种重载形式: - `public String substring(int beginIndex)`:从指定索引位置开始截取到结尾。 - `public String substring(int beginIndex, int endIndex)`:从起始索引到结束索引前一位进行截取[^2]。 示例代码如下所示: ```java public class SubstringExample { public static void main(String[] args) { String str = "HelloWorld"; System.out.println(str.substring(5)); // 输出: World System.out.println(str.substring(0, 5)); // 输出: Hello } } ``` - **Boolean 解析** 使用静态方法 `Boolean.parseBoolean(String s)` 可以将字符串转换成布尔值。只有当输入字符串不为空且忽略大小写等于 `"true"` 时才返回 `true`;其他情况下均返回 `false`[^4]。 示例代码如下: ```java public class BooleanParseExample { public static void main(String[] args) { System.out.println(Boolean.parseBoolean("True")); // true System.out.println(Boolean.parseBoolean("FALSE")); // false System.out.println(Boolean.parseBoolean(null)); // false } } ``` #### 接口的作用于规范定义 虽然本问题是针对 `String` 的具体实现细节展开讨论,但值得一提的是,在更广泛的上下文中,接口作为 Java 编程语言的一部分起到了至关重要的角色——它们不仅限定了行为契约还促进了模块间解耦合设计思路的发展方向之一即面向接口编程理念的应用实践过程中的具体体现形式表现为多个共同遵循某个特定型的约束条件从而达到提高程序灵活性的目的同时也有助于增强系统的可维护性和扩展能力等方面表现出色之处在于能够让不同的开发人员专注于各自负责的部分而无需关心对方内部是如何工作的只要满足约定即可正常协作完成整个项目的构建工作流程图展示如下内容结构层次清晰明了便于理解和记忆掌握要点快速上手实战演练效果显著提升效率减少错误发生几率等等优点值得推荐给广大初学者朋友们尝试体验一下看看是否适合自己当前阶段的学习需求情况再做进一步考虑决定吧[^3]!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值