java - 使用非常大的字符串不好吗? ( java )

标签 java

创建大字符串有什么负面影响吗?例如,如果我们正在从一个可能很大的文本文件中读取文本:

while (scanner.hasNext()) {
  someString += scanner.next();
}
// do something cool with some string

逐行处理文件是否(通常)是更好的解决方案,为什么?

最佳答案

流媒体与非流媒体

当您可以流式传输时,您可以处理任何 大小的文件(假设您真的可以忘记您已经看到的所有数据)。你最终会得到一个自然的 O(n) 复杂度,这是一件非常好的事情。您不会因内存不足而中断。

流媒体很可爱……但并非在所有情况下都适用。

字符串生成器

似乎对 StringBuilder 建议存在一定的争议,这里有一个显示效果的基准。为了让慢速版本在合理的时间内完成,我不得不减小基准测试的大小。

先结果,再编码。这是一个非常粗略和现成的基准,但结果非常引人注目,足以说明这一点......

c:\Users\Jon\Test>java Test slow
Building a string of length 120000 without StringBuilder took 21763ms

c:\Users\Jon\Test>java Test fast
Building a string of length 120000 with StringBuilder took 7ms

还有代码...

class FakeScanner
{
    private int linesLeft;
    private final String line;

    public FakeScanner(String line, int count)
    {
        linesLeft = count;
        this.line = line;
    }

    public boolean hasNext()
    {
        return linesLeft > 0;
    }

    public String next()
    {
        linesLeft--;
        return line;
    }
}

public class Test
{    
    public static void main(String[] args)
    {
        FakeScanner scanner = new FakeScanner("test", 30000);

        boolean useStringBuilder = "fast".equals(args[0]);

        // Accurate enough for this test
        long start = System.currentTimeMillis();

        String someString;
        if (useStringBuilder)
        {
            StringBuilder builder = new StringBuilder();
            while (scanner.hasNext())
            {
                builder.append(scanner.next());
            }
            someString = builder.toString();
        }
        else
        {
            someString = "";     
            while (scanner.hasNext())
            {
                someString += scanner.next();
            }        
        }
        long end = System.currentTimeMillis();

        System.out.println("Building a string of length " 
                           + someString.length()
                           + (useStringBuilder ? " with" : " without")
                           + " StringBuilder took " + (end - start) + "ms");
    }
}

关于java - 使用非常大的字符串不好吗? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1494772/

相关文章:

java - 如何在 Java 中获取文件的文件扩展名?

Java 音频流平台独立

java - 为 OPTIONS Http 方法禁用 Spring Security

java - 如何正确实例化一个可以同时容纳玩家和庄家的数组列表?

java - Android Studio 权限拒绝

在我的例子中,Java ArrayList 不处理字符

java - float 转换为 int 以获取大值

java - 安卓摇一摇代码

Java MySql 连接

java - 当键盘被调用时删除 "Persistent Footer Button"- Material Design