加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

坏的使用非常大的字符串? (JAVA)

发布时间:2020-12-14 16:25:51 所属栏目:Java 来源:网络整理
导读:是否有任何负面的创造巨大的字符串?例如,如果我们从一个潜在的巨大的文本文件中读取文本: while (scanner.hasNext()) { someString += scanner.next();}// do something cool with someString 将逐行处理文件(一般)更好的解决方案,为什么? 谢谢 解决方法
是否有任何负面的创造巨大的字符串?例如,如果我们从一个潜在的巨大的文本文件中读取文本:
while (scanner.hasNext()) {
  someString += scanner.next();
}
// do something cool with someString

将逐行处理文件(一般)更好的解决方案,为什么?

谢谢

解决方法

流媒体vs不

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

流式可爱…但在每种情况下都不起作用.

StringBuilder的

似乎对StringBuilder建议有一定的争议,这里是显示效果的基准.我不得不减小基准的大小,以便在合理的时间内慢速版本甚至完成.

结果先,然后代码.这是一个非常粗糙和准备的基准,但结果足够戏剧性,使得点…

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

c:UsersJonTest>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");
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读