您的位置:

Java substring 方法详解

一、基本介绍

Java中的字符串是不可变对象,不能像数组一样通过下标来修改指定位置的字符。substring方法可以从一个字符串中截取一部分子串,返回一个新的字符串对象,可以基于原始字符串对象创建一个新的不可变字符串。

Java substring方法的语法如下:

public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)

字符串中字符的下标从0开始,beginIndex参数指定要截取的子串的起始字符的下标,endIndex参数指定要截取的子串的最后一个字符的下标加1,即`[beginIndex, endIndex)`表示一个左闭右开区间。如果省略第二个参数,则表示截取从beginIndex到字符串的最后一个字符的子串。

二、截取子串

截取原始字符串中的一部分作为新字符串,是substring方法最基本的功能,常用于在处理字符串时获取字符串中某个区间的子串。以下是一个简单的示例:

    String str = "hello, world";
    String substr1 = str.substring(0, 5);
    System.out.println(substr1); // 输出hello
    String substr2 = str.substring(7);
    System.out.println(substr2); // 输出world

在以上代码中,将原始字符串str中从0到5的字符截取下来作为子串,得到新的字符串substr1,输出hello;将原始字符串str中从7到最后一个字符的字符截取下来作为子串,得到新的字符串substr2,输出world。

三、字符串共享

Java中的字符串为了避免重复创建对象,采用了共享字符串对象的方式来节省内存。在实际编程中需要注意这个特点,特别是对于截取子串这个操作,需要理解共享的本质。以下是一个示例:

    String str = "hello, world";
    String substr = str.substring(0, 5);
    System.out.println(str == substr); // 输出false

在以上代码中,原始字符串str和截取后得到的子串substr不是同一个对象,输出了false。这是因为子串是通过创建新的字符串对象来实现的,与原始字符串分别占用内存空间。但是,如果我们截取的子串与原始字符串完全重合,Java中采用的是共享对象的方式,共享的本质是子串对象与原始字符串对象指向的是同一个char数组,不同的是子串对象引用了数组的一部分,原始字符串对象引用了整个数组。如果要比较两个字符串对象是否相等,需要使用equals方法,不能直接使用==运算符。

    String str = "hello, world";
    String substr = str.substring(0, 5);
    String substr2 = str.substring(0, 5);
    System.out.println(substr == substr2); // 输出true

在以上代码中,将原始字符串str中从0到5的字符截取下来作为子串substr和substr2,由于两个子串的字符完全相同,Java采用了共享的方式,substr和substr2指向同一个对象,输出了true。

四、异常处理

使用substring方法时需要注意边界问题,如果beginIndex或endIndex的取值超出了字符串的实际范围,则会报字符串索引越界异常(StringIndexOutOfBoundsException),需要使用try-catch语句来处理异常。以下是一个示例:

    String str = "hello, world";
    try {
        String substr = str.substring(0, 100); // 报异常:StringIndexOutOfBoundsException
    } catch (StringIndexOutOfBoundsException e) {
        e.printStackTrace();
    }

在以上代码中,我们尝试从原始字符串中截取从0到100的字符,由于超出了实际字符范围,导致字符串索引越界异常,可以在try-catch语句块中处理异常,避免程序崩溃。

五、不可变字符串

Java中的字符串是不可变的对象,无法修改原始字符串中的字符,使用substring方法获得的子串也同样是不可变的,不能通过下标修改其中的字符,要在处理字符串时需要反复截取子串,每次都需要创建新的字符串对象,会产生大量的内存垃圾。以下是一个具体的示例:

    String str = "hello, world";
    for (int i = 0; i < str.length(); i++) {
        String substr = str.substring(0, i + 1);
        System.out.println(substr);
    }

在以上代码中,我们从开头逐渐截取字符串中的字符,输出所有可能的子串。由于Java中字符串是不可变的对象,每次截取都会创建新的字符串对象,需要消耗大量的内存,并产生大量的内存垃圾。如果处理的字符串较长,需要减少内存消耗和垃圾产生,可以考虑使用可变字符串(StringBuilder或StringBuffer)。

六、可变字符串

可变字符串是Java中的一种特殊字符串类型,可以随时修改其中的字符,而不会像不可变字符串那样每次修改都需要创建新的字符串对象。Java提供了两种可变字符串类型,分别是StringBuilder和StringBuffer,二者差异较小,都可以用于修改字符串。以下是一个示例:

    StringBuilder builder = new StringBuilder("hello, world");
    builder.setCharAt(0, 'H');
    builder.append(", Java");
    String str = builder.toString();
    System.out.println(str);

在以上代码中,我们创建了一个StringBuilder对象,将其初始化为"hello, world",然后使用setCharAt方法将第一个字符修改为大写的H,再使用append方法追加了一个字符串", Java",最后使用toString方法将StringBuilder对象转化为字符串对象。与不可变的字符串不同,使用可变字符串可以直接修改字符,避免了创建新对象的开销。

七、小结

Java substring方法是字符串处理中常用的方法之一,可以从一个字符串中截取一部分作为新字符串使用。使用时需要注意边界问题,避免字符串索引越界异常的发生。Java中的字符串是不可变对象,无法直接修改其中的字符,经常反复截取字符串会产生大量的内存垃圾,可以考虑使用可变字符串来代替不可变字符串。