【问题标题】:Why doesn't my Java string concatenation work?为什么我的 Java 字符串连接不起作用?
【发布时间】:2012-08-07 23:36:56
【问题描述】:

当此代码运行时,它会获取网页的内容。

我想连接整个字符串而不是将其打印到控制台,但是当我取消注释下面代码中的两行时,System.out.println(inputLine); 什么也不打印(但它与下面注释的行一起使用)和值 fileText = null ,

这个错误是从哪里来的?

import java.net.*;
import java.io.*;

public class URLReader {

    public static void main(String[] args) throws Exception {

        URL oracle = new URL("http://www.oracle.com");
        BufferedReader in = new BufferedReader(
        new InputStreamReader(oracle.openStream()));

        String fileText = "";
        String inputLine;
        while ((inputLine = in.readLine()) != null)
            //fileText.concat(inputLine);
            System.out.println(inputLine);
        in.close();
        //System.out.println(fileText);
    }
}

【问题讨论】:

  • 是的,你是对的! concat 方法自 1996 年以来就没有工作过,使用 Java 的 1000 万开发人员没有一个注意到,很好。 :P
  • 我将编辑问题标题,使其更加友好
  • 好像是重复的。 stackoverflow.com/questions/5076740/… 似乎抓住了问题的本质(如何连接 java 字符串),即使链接的问题是特定于性能的。

标签: java string concat


【解决方案1】:

String不可变的concat() 将返回一个新的String(查看链接的文档),您不会收集它。

您应该使用StringBuilder 有效地构建字符串,然后在完成后调用toString() 以获取结果字符串。

例如

StringBuilder sb = new StringBuilder();
while (....) {
   sb.append("more string data");
}
String str = sb.toString();

可以附加Strings例如

   str = str + "more string data";

但由于String 的实现,它的效率不是很高。构建StringBuilder 是为了有效地执行连接。如果您知道要构建的 String 的大小,可以通过其初始容量调整 StringBuilder

您可能会看到一些来源引用了StringBuffer。这非常相似,除了它更旧并且默认同步其方法。在浪费的非线程环境中,一般建议是首选StringBuilder

【讨论】:

    【解决方案2】:

    String 是不可变对象。您需要将连接的值重新分配给字符串对象。简单地调用fileText.concat(inputLine); 不会改变fileText 中的值。

    fileText = fileText.concat(inputLine);

    简单地说,fileText += inputLine; 也应该可以工作。

    【讨论】:

      【解决方案3】:

      String 是不可变的,因此只需在 String 上调用 concat 不会更改它:它会返回一个新的 String 和结果。

      您可以改为重新分配结果:fileText = fileText.concat(inputLine);,但由于您处于循环中,可能会进行大量连接,最好使用 StringBuilder 进行连接,并从StringBuilder

      【讨论】:

      • 另外,cets out 的行 .. ;-)
      【解决方案4】:

      您好,您必须将 fileText.concat(String) 的返回值分配给一个变量。在你的情况下再次 fileText 。 你的解决方案是:

      fileText = fileText.concat(inputLine); 
      

      进一步了解 Java API -> http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/String.html

      【讨论】:

        【解决方案5】:

        Strings 是不可变的。这意味着fileText.concat(inputLine); 不会更改fileText 的内容。而是 concat() 方法返回一个带有预期数据的新 String。你需要捕获这个返回值才能得到你想要的。

        【讨论】:

          【解决方案6】:

          你最好使用StringBuilder。类似的东西

          StringBuilder sb = new StringBuilder();
          while (...)
              sb.append(line);
          

          这比Strings 的重复串联效率要高得多。

          更简单的解决方案是使用Apache Commons IO library,尤其是IOUtils.toString(InputStream,String)

          【讨论】:

            【解决方案7】:

            fileText.concat(inputLine) 更改为fileText = fileText.concat(inputLine)

            另外,初始化String inputLine = null;

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-23
              • 2021-01-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多