java - 为什么我们在对字符串进行操作时将string转换为charArray?

标签 java string algorithm

我在做算法题的时候,发现很多人喜欢先把一个字符串转成charArray再做运算?

我不明白我们为什么要那样做?我的意思是,我可以使用 string.charAt(),为什么要使用 string.toCharArray() 然后使用 charArray[i]?它是一样的,甚至 charArray 使用 O(n) 内存。

谁能给我解释一下?

最佳答案

人们更喜欢 char[] 而不是 StringStringBuffer 有几个原因:

  • String 是不可变的。这意味着,如果您想在不使用任何实用程序类的情况下操作 String,您将经常复制 String,这会导致代码效率极低。
  • 访问 char[] 中的字符比使用 charAt 快得多(尽管转换 String 需要一些时间到 char[],在优化时也应考虑):

    class Test{
        public static void main(String[] args){
            String s = "a";
            char[] c = new char[]{'a'};
            StringBuffer buffer = new StringBuffer("a");
    
            char x;
    
            long time = System.nanoTime();
            for(int i = 0 ; i < 1000 ; i++)
                x = s.charAt(0);
            time = System.nanoTime() - time;
    
            System.out.println("string: " + time);
    
            time = System.nanoTime();
            for(int i = 0 ; i < 1000 ; i++)
                x = c[0];
            time = System.nanoTime() - time;
    
            System.out.println("[]: " + time);
    
            time = System.nanoTime();
            for(int i = 0 ; i < 1000 ; i++)
                x = buffer.charAt(0);
            time = System.nanoTime() - time;
    
            System.out.println("buffer: " + time);
        }
    }
    

    运行这个简单的类会产生以下输出(在我的机器上,使用 javaSE 1.8.0 build b132):

    string: 37895
    []: 18948
    buffer: 85659

    很明显,通过 char[] 访问比使用 StringStringBuilder 访问要快得多。

  • 使用对象来操作单个字符将导致代码中塞满了 charAt()setCharAt(),这可能被认为是难看的代码。

  • 安全性:String 相当不安全,如果代码处理敏感数据,因为不可变的 String 将存储在内存中。这意味着在 GC 将其从内存中删除之前,包含敏感数据的 String 是可以访问的。另一方面,char[] 可以随时简单地覆盖,从而从内存中删除敏感数据。

关于java - 为什么我们在对字符串进行操作时将string转换为charArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32640593/

相关文章:

java - 数据表中的 Richfaces inplaceInput 不更新支持 bean 中的值

java - Android 项目上的 WCF Web 服务 - 如何通过 Soap 对象获取 byte[] 类型?

java - Intellij IDEA Ultimate android 布局预览无法等待构建完成

java - 在 Eclipse 中混合 scala、maven 和 java - 单元测试

c++ - 模板 : one for string and one for anything else 中的不同构造函数

javascript - 删除特定分隔符后面的字符串的最后部分

java - 查找最大并发进程数的时间间隔

string - 删除具有两个连续字母的给定字符串的一个字母

algorithm - 随机均匀地打乱数组/n 个数字的元素。可能在预期的 O(n) 时间内

c++ - 具有 O(1) 插入(分摊)和 O(n) 迭代的容器