Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java处理字符串的速度比ArrayList慢多少?_Java_String_Performance_Arraylist_Jvm - Fatal编程技术网

Java处理字符串的速度比ArrayList慢多少?

Java处理字符串的速度比ArrayList慢多少?,java,string,performance,arraylist,jvm,Java,String,Performance,Arraylist,Jvm,在执行LeetCode 125时,我采用了一种简单的算法: 修剪绳子 遍历修剪后的字符串以验证它是否为回文 修剪后的字符串存储为字符串或ArrayList。但是,在接受遍历ArrayList时,遍历修剪后的字符串(存储为字符串)会导致“超时”。由于除了String/ArrayList之外,这两段代码完全相同,我想知道Java处理String时可能比ArrayList慢得多 有谁能告诉我这种区别是从哪里来的 代码1(按字符串): 公共类解决方案{ 公共布尔值isAlindrome(字符串s){ s

在执行LeetCode 125时,我采用了一种简单的算法:

  • 修剪绳子
  • 遍历修剪后的字符串以验证它是否为回文
  • 修剪后的字符串存储为字符串或ArrayList。但是,在接受遍历ArrayList时,遍历修剪后的字符串(存储为字符串)会导致“超时”。由于除了String/ArrayList之外,这两段代码完全相同,我想知道Java处理String时可能比ArrayList慢得多

    有谁能告诉我这种区别是从哪里来的

    代码1(按字符串):

    公共类解决方案{
    公共布尔值isAlindrome(字符串s){
    s=s.toLowerCase();
    字符串“=”;
    
    对于(int i=0;i='a'&&ch='0'&&ch字符串是不可变的,因此您的第一个示例是始终创建和丢弃大量实例。您至少应该使用
    StringBuilder
    来组装这样的字符串。

    如下所示:

        trimmed = trimmed + ch;
    
    字符串连接并不便宜,因此每次执行此操作时,您都会创建一个新字符串并复制一个内部数组。在ArrayList示例中,当您编写:

        trimmed.add(ch);
    
    并非每次都创建新数组。如果希望字符串具有类似的性能,请使用
    StringBuilder

    StringBuilder trimmed = new StringBuilder();
        ...
        trimmed.append(ch)
    

    对于您的情况,您可以考虑使用现有的<代码>替换< /代码>方法替换所有空白:< /p>

    String trimmed = s.replace(" ", "");
    

    如果效率是主要关注点,您可以轻松地将字符验证融合到回文检测中,并避免创建任何临时对象(基本上是从两端迭代,跳过被拒绝的字符)@Durandal。谢谢你的评论。我知道这个算法不够好,因为它可以通过遍历原始字符串一次来验证,而不是创建一个新的修剪字符串。我很好奇性能差异是如何产生的,以避免将来出现同样的陷阱。仍然感谢你的评论。(我要补充的是,可以检查字节码以查看实际使用的内容,因为在某些情况下将使用
    StringBuilder
    )非常感谢你,chrylis。现在我明白了在字符串上编码时应该改进哪一部分了。@DaveNewton我非常严重地怀疑是否有编译器会将循环优化为生成器;只是最近才有一些编译器将循环转换为单语句串联,而这通常是留给JIT的事情。@chrylis我认为y明确地说,不要在循环中这样做,它很可能会为concat创建一个
    StringBuilder
    ,并设置对
    toString
    结果的引用。我的观点是OP可以检查代码,看看在封面下发生了什么。谢谢你,mk。我会参考字符串上的Java文档。
    StringBuilder trimmed = new StringBuilder();
        ...
        trimmed.append(ch)
    
    String trimmed = s.replace(" ", "");