String s = "this is an example";
String a = s.substring(11); // a will hold the string starting at character 11 until the end ("example")
String b = s.substring(5, 10); // b will hold the string starting at character 5 and ending right before character 10 ("is an")
String b = s.substring(5, b.length()-3); // b will hold the string starting at character 5 ending right before b' s lenght is out of 3  ("is an exam")

子字符串也可以应用于切片并将字符添加/替换为其原始字符串。例如,你遇到了包含中文字符的中文日期,但你希望将其存储为格式良好的日期字符串。

String datestring = "2015 年 11 月 17 日"
datestring = datestring.substring(0, 4) + "-" + datestring.substring(5,7) + "-" + datestring.substring(8,10);
//Result will be 2015-11-17

方法提取一块 String 的。当提供一个参数时,参数是开始,并且片段延伸到 String 的末尾。当给出两个参数时,第一个参数是起始字符,第二个参数是结束后的字符索引(不包括索引处的字符)。一种简单的检查方法是从第二个参数中减去第一个参数应该产生字符串的预期长度。

Version < Java SE 7

在 JDK <7u6 版本中,substring 方法实例化 String,它与原始 String 共享相同的支持 char[],并且内部 offsetcount 字段设置为结果的开始和长度。这样的共享可能会导致内存泄漏,这可以通过调用 new String(s.substring(...)) 来强制创建副本来防止,之后可以对 char[] 进行垃圾回收。

Version >= Java SE 7

从 JDK 7u6 开始,substring 方法总是复制整个底层 char[] 阵列,使得复杂度与之前的常量数据相比是线性的,但同时保证了内存泄漏的缺失。