将Stringbuffer转换为String后调用subSequence()方法。

3

我在一个现有的 Java 程序代码中发现以下片段:

StringBuffer b = new Stringbuffer()
// fill the StringBuffer
(...)

String temp = b.toString();
return temp.subSequence(0, b.toString().length() - 1);

我不明白为什么他们从位置0到末尾用了subSequence...

将StringBuilder转换为String后的格式是这么丑吗?

他们已经离开公司了,所以我不能问他们...

希望你们能帮助我。


我告诉你最典型的原因是:在循环中,一些列表元素用分隔符连接成字符串。这种方法的天真版本只是在每个成员后附加分隔符,因此结果必须通过删除最后一个字符来修复。 - Marko Topolnik
4个回答

4

这个想法是从末尾删除一个字符,注意所有Java标准库类都遵循关于起始/结束索引参数的约定,起始是包含的,结束是不包含的。此外,我同意代码很丑陋,应该改成:

...
return b.subSequence(0, b.length() - 1);

它更短,也更高效。另外,StringBuffer是一个遗留类,您可以使用更快的StringBuilder替换它。


直接使用StringBuffer吗?那么sb是什么? - user2413035
sb应该是b。是我的错。StringBuffer.substring创建我们需要立即使用的字符串。 - Evgeniy Dorofeev

1

子序列:

temp.subSequence(0, b.toString().length() - 1);

删除最后一个字符,并不返回相同的字符串。

4
是的,但为什么?这没有意义... 在字符串构建器中,最后一个字符是否有特殊含义?因为我添加到字符串构建器中的最后一个字符不应该被删除。 - user2413035
@user2413035。如果您不想去掉最后一个字符,那么只需返回temp即可,无需这样做。 - Rohit Jain

0
    StringBuffer b = new StringBuffer();
    b.append("a");
    b.append("b");
    b.append("c");
    String temp = b.toString();        
    System.out.println(temp); // now out put is abc

如果有人想要对此进行子字符串操作,可以按照以下方式进行子字符串操作。
    System.out.println(temp.subSequence(0, b.toString().length() - 1));
    System.out.println(temp.substring(0, b.toString().length() - 1));

在截取子字符串后,输出只有 ab 吗? - user2413035
是的,subSequence和substring都会给出相同的输出。 - Ruchira Gayan Ranaweera

0

它与substring()方法相同,因此可以使用其中任何一个。
根据StringBuffer doc

以以下形式调用此方法
sb.subSequence(begin, end)
的行为与调用
sb.substring(begin, end)
完全相同。提供此方法是为了使该类能够实现CharSequence接口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接