`
javalurker
  • 浏览: 23482 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

测试--String和StringBuffer效率(java语言)

    博客分类:
  • java
阅读更多
测试--String和StringBuffer效率(java语言)

index.html文件大小为450k,StringBuffer的执行速度是0.094秒,代码如下:
try {
            BufferedReader br = new BufferedReader(new FileReader(new File("index.html")));
            String str = br.readLine();
            StringBuffer tmp = new StringBuffer();
            long star = System.currentTimeMillis();
            while(str != null){
                tmp.append(str);
                tmp.append("\n");
                str = br.readLine();
            }
            long end = System.currentTimeMillis();
            System.out.println((end - star));
//            System.out.println(tmp);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
================================
String的效率相当低173秒,代码如下:
try {
            BufferedReader br = new BufferedReader(new FileReader(new File("index.html")));
            String str = br.readLine();
            String tmp = "";
            long star = System.currentTimeMillis();
            while(str != null){
                tmp += str;
                str = br.readLine();
            }
            long end = System.currentTimeMillis();
            System.out.println((end - star)/1000);
//            System.out.println(tmp);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
=================================
这并不是java特有的,其他的采用垃圾收集算法的并且字符串不可变的语言也都存在同样的问题。
这里摘用Programming in LUA上的原话(java处理起来类似)“为了理解现象的本质,假定我们身在loop中间,buff已经是一个50KB的字符串,每一行的大小为20bytes,当Lua执行buff..line.."\n"时,她创建了一个新的字符串大小为50,020 bytes,并且从buff中将50KB的字符串拷贝到新串中。也就是说,对于每一行,都要移动50KB的内存,并且越来越多。读取100行的时候(仅仅2KB),Lua已经移动了5MB的内存,”。

StringBuffer采用的是char[] 存储字符串,当现有的数组无法存储新加入的字符串,则进行下面的工作:如果后续的字符串长度+原StringBuffer中字符串的长度是StringBuffer中字符串长度的2倍以上,在char[]扩充后续字符串长度,否则扩充到原长度的2倍(这里“扩充”的意思是new一个新的,其长度是原长度+扩充的长度);同时调用本地方法,将原有char[] 中的数据copy到新的char[]中,极大的减少了内存空间的分配次数,提高了性能。

LUA的处理方式,引用Programming in LUA的文字:

在继续进行之前,我们应该做个注释的是,在一般情况下,这个问题并不存在。对于小字符串,上面的那个循环没有任何问题。为了读取整个文件我们可以使用io.read(*all),可以很快的将这个文件读入内存。但是在某些时候,没有解决问题的简单的办法,所以下面我们将介绍更加高效的算法来解决这个问题。
我们最初的算法通过将循环每一行的字符串连接到老串上来解决问题,新的算法避免如此:它连接两个小串成为一个稍微大的串,然后连接稍微大的串成更大的串。。。算法的核心是:用一个栈,在栈的底部用来保存已经生成的大的字符串,而小的串从栈定入栈。栈的状态变化和经典的汉诺塔问题类似:位于栈下面的串肯定比上面的长,只要一个较长的串入栈后比它下面的串长,就将两个串合并成一个新的更大的串,新生成的串继续与相邻的串比较如果长于底部的将继续进行合并,循环进行到没有串可以合并或者到达栈底。
分享到:
评论

相关推荐

    String和StringBuilder效率测试

    在Java编程语言中,`String`和`StringBuilder`都是用于处理字符串的重要类,但它们在处理方式和效率上有显著的区别。本资源中的代码是针对这两种类的效率进行测试的实例,旨在帮助开发者理解它们在不同场景下的性能...

    详解Java的String类型程序

    在给出的代码片段中,通过不同的方式创建了多个`String`对象,并进行了相等性的比较,还测试了字符串拼接的不同方法(包括直接拼接、使用`StringBuffer`等)的执行效率。 #### 字符串创建与比较 1. **字符串常量池...

    javacore测试题及参考答案

    Java核心技术包括许多方面,本文将基于给定的测试题及参考答案来深入讲解其中的关键知识点。 1. **基本数据类型与引用类型** - Java 的基本数据类型包括 byte、int、char、long、float、double、boolean 和 short...

    Bollywood-Game:该游戏的核心概念是基于String和StringBuffer的,类似于Spellbee竞赛

    综上所述,《宝莱坞游戏》利用了Java语言中String、StringBuffer(或StringBuilder)等基础组件,结合Java 8的新特性,创建了一种文字类的游戏体验,玩家可以通过命令行进行互动,享受拼写挑战的乐趣。游戏的实现...

    String方法使用方法例子续--android

    在Android开发中,String类是Java语言中的核心类,它被广泛用于处理文本信息。String对象不可变,意味着一旦创建,其内容就不能更改。这里我们将深入探讨`String`类的一些重要方法及其在Android开发中的应用。 1. *...

    java面试八股文java基础知识总结.pdf

    - **动态性**:Java语言是动态绑定的,支持运行时加载和卸载类库。 #### 字节码 - **概念**:字节码是Java编译器生成的一种中间语言,类似于机器语言但更抽象。 - **好处**:字节码可被任何支持JVM的平台解释执行,...

    java基本概念Java基础笔试机试测试题

    **题目**: 以下不可作为Java语言修饰符的是()。 - **选项**: - A. `a1` - B. `$1` - C. `_1` - D. `11` - **答案**: D - **解析**: - Java 标识符不能以数字开头。 - `11` 不能作为标识符。 #### 13. ...

    Java语言编程规范--华为技术有限公司

    Java语言编程规范是软件开发中不可或缺的一部分,尤其在大型企业如华为技术有限公司中,规范的制定对于确保代码质量、提高团队协作效率、降低维护成本至关重要。本规范旨在提供一套标准的Java编程准则,帮助开发者...

    java华为面试题.pdf

    ### Java华为面试题知识点概述 根据提供的文档片段,本文将围绕几个核心的Java知识点进行深入解析,包括但不限于:String与...掌握这些知识点不仅有助于通过面试,也能在实际工作中更好地运用Java语言解决问题。

    Java 最全 面试题 测试

    根据提供的文件信息,这里将对其中提及的关键Java知识点进行详细解释和总结: ### Java 面试笔试题大汇总 ...以上就是关于Java的一些重要知识点的总结,希望能够帮助大家更好地理解和掌握Java语言。

    V20-Java笔记整理-重要概念和常见陷阱梳理.docx

    ### Java重要概念与常见陷阱梳理 #### 一、Java简介 **1.1 Java体系分类** - **JavaSE(Java Platform Standard Edition)*...通过学习这些内容,可以帮助开发者更好地理解和掌握Java编程语言的核心原理和实践技巧。

    天津理工大学《JAVA语言程序设计》期末考试试卷.pdf

    《JAVA语言程序设计》期末考试试卷涵盖了Java编程的基础与核心概念,旨在测试学生对Java语言的理解和应用能力。以下是对试卷中可能出现的知识点的详细解释: 1. **Java基础语法**:这部分可能包括变量声明、数据...

    网页抓取DEMO-可以运行的一个java项目

    通过本项目,你可以学习如何利用Java语言进行网络数据采集,并通过具体的代码实现来加深理解。 #### 二、项目搭建步骤 1. **创建Java项目**:首先在开发环境中(例如Eclipse)创建一个新的Java项目,命名为`...

    Java 面试题.docx

    Java是一种广泛使用的面向对象的编程语言,其设计目标是提供一种简单、面向对象、健壮、安全、可移植性好、高性能的语言。在Java面试中,掌握以下关键知识点至关重要: 1. **面向对象的特征**: - **抽象**:抽象...

    Java基础学习09.pdf

    标题《Java基础学习09.pdf》暗示了这份文档是Java基础学习的系列教程之...通过这些内容的学习,能够加深对Java语言中字符串处理机制的理解,并掌握如何根据具体需求选择合适的数据结构和方法,以提高程序的性能和效率。

    专题资料(2021-2022年)JAVA标准化考试系统单机版.doc

    String类和StringBuffer类是JAVA中两个重要的类,用于字符串处理。String类是一个不可变的类,用于存储字符串,而StringBuffer类是一个可变的类,用于字符串的操作。StringBuffer类提供了多种方法,如append、insert...

    21天学通Java.第7版-中文版-良心积分价

    通过21天的学习计划,读者可以系统地了解和掌握Java编程语言。 1. **Java简介**:Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)于1995年推出。它的设计目标是具有良好的可移植...

    01-Java基础知识面试题.docx

    String与StringBuilder和StringBuffer的主要区别在于,String是不可变的,而StringBuilder和StringBuffer是可变的,后者在多线程环境中更安全。 日期和时间相关的类包括Date和Calendar,包装类如Integer是基本类型...

Global site tag (gtag.js) - Google Analytics