当前位置: 首页 > 面试题库 >

charAt()或子字符串?哪个更快?

百里意智
2023-03-14
问题内容

我想遍历字符串中的每个字符并将字符串中的每个字符作为字符串传递给另一个函数。

String s = "abcdefg";
for(int i = 0; i < s.length(); i++){
    newFunction(s.substring(i, i+1));}

要么

String s = "abcdefg";
for(int i = 0; i < s.length(); i++){
    newFunction(Character.toString(s.charAt(i)));}

最终结果必须是字符串。那么有什么想法会更快或更有效吗?


问题答案:

像往常一样:没关系,但是如果您坚持花时间进行微优化,或者如果您真的想针对非常特殊的用例进行优化,请尝试以下操作:

import org.junit.Assert;
import org.junit.Test;

public class StringCharTest {

    // Times:
    // 1. Initialization of "s" outside the loop
    // 2. Init of "s" inside the loop
    // 3. newFunction() actually checks the string length,
    // so the function will not be optimized away by the hotstop compiler

    @Test
    // Fastest: 237ms / 562ms / 2434ms
    public void testCacheStrings() throws Exception {
        // Cache all possible Char strings
        String[] char2string = new String[Character.MAX_VALUE];
        for (char i = Character.MIN_VALUE; i < Character.MAX_VALUE; i++) {
            char2string[i] = Character.toString(i);
        }

        for (int x = 0; x < 10000000; x++) {
            char[] s = "abcdefg".toCharArray();
            for (int i = 0; i < s.length; i++) {
                newFunction(char2string[s[i]]);
            }
        }
    }

    @Test
    // Fast: 1687ms / 1725ms / 3382ms
    public void testCharToString() throws Exception {
        for (int x = 0; x < 10000000; x++) {
            String s = "abcdefg";
            for (int i = 0; i < s.length(); i++) {
                // Fast: Creates new String objects, but does not copy an array
                newFunction(Character.toString(s.charAt(i)));
            }
        }
    }

    @Test
    // Very fast: 1331 ms/ 1414ms / 3190ms
    public void testSubstring() throws Exception {
        for (int x = 0; x < 10000000; x++) {
            String s = "abcdefg";
            for (int i = 0; i < s.length(); i++) {
                // The fastest! Reuses the internal char array
                newFunction(s.substring(i, i + 1));
            }
        }
    }

    @Test
    // Slowest: 2525ms / 2961ms / 4703ms
    public void testNewString() throws Exception {
        char[] value = new char[1];
        for (int x = 0; x < 10000000; x++) {
            char[] s = "abcdefg".toCharArray();
            for (int i = 0; i < s.length; i++) {
                value[0] = s[i];
                // Slow! Copies the array
                newFunction(new String(value));
            }
        }
    }

    private void newFunction(String string) {
        // Do something with the one-character string
        Assert.assertEquals(1, string.length());
    }

}


 类似资料:
  • 例如,我现在有一个string=“something”,如果我要访问这个字符串的最后一个索引(str.length()),它将给出“字符串索引超出范围:-1”。但是如果我通过子字符串访问它,它不会给出任何错误。 String str=“something”str.charat(9);运行时错误str.substring(9);没有错误,它不会打印任何东西。

  • 问题内容: 我试图提取一个子字符串。我需要在PHP中做一些帮助。 以下是一些我正在使用的示例字符串以及需要的结果: 我想将字符串保留到第一个,但是如果不存在,请获取整个字符串。 我试过了, 我认为它说-获取位置,然后从位置0到 该 位置获取子字符串。 我不知道如何处理不存在的情况,而又不会使声明太大。 有没有一种方法也可以处理这种情况而又不会使PHP语句过于复杂? 问题答案: 采用 在这种情况下,

  • 问题内容: 我知道替换字符串中 所有 出现的子字符串的两种方法。 正则表达式的方式(假设“要替换的子字符串”不包括正则表达式的特殊字符): String.replace()方式: 两者中哪一个效率更高(为什么)? 是否有比上述两种方法更有效的方法? 问题答案: 在下面使用正则表达式。 是否有比上述两种方法更有效的方法? 假设您在一个由数组支持的实现上进行操作,而不是在不可变的String类上进行操

  • 问题内容: 我想在很大的字符串的特定位置找到字符。但是我无法使用方法,因为范围超出了int的范围。有什么调整吗? 问题答案: 在Java中,字符串由字符数组支持。数组的理论大小受的最大值限制,因此不可能有超过2 31 -1个字符的字符串开头。 要解决此问题,您可以创建自己的使用多个数组或字符串作为存储的字符串类。

  • 投入:8576产出:218预期产出:8+5+7+6=26 已修正:

  • 问题内容: 使用哪种更好或更方便: 要么 问题答案: 您是否完全需要类型属性?如果您使用的是HTML5,则不会。否则,是的。HTML 4.01和XHTML 1.0 根据需要指定属性,而HTML5具有可选属性,默认为。HTML5现在得到了广泛的实现,因此,如果您使用HTML5doctype,则是有效且不错的选择。 至于type属性中应该包含的内容,2006年注册的MIME类型旨在替代所有主要浏览器(