Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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 数字比较比字符串比较快吗?_Java_C++_Computer Science - Fatal编程技术网

Java 数字比较比字符串比较快吗?

Java 数字比较比字符串比较快吗?,java,c++,computer-science,Java,C++,Computer Science,我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比比较字符串更容易。如果为真,原因是什么?是的,但这与哈希无关 比较数字涉及比较位的简单硬件指令 比较字符串包括(a)迭代两个字符串,直到找到不同的字符(不同于固定大小的数字)和(b)大量的Unicode魔术(不同长度的不同字符串实际上可以相等,不同代码块中的不同字符比较不同) 散列通常用于将字符串转换为数组索引。比较原始数字肯定比比较字符串快,因为它只是一条计算机指令,而比较Java中的字符串是一种方法。但Java中使用哈希的

我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比比较字符串更容易。如果为真,原因是什么?

是的,但这与哈希无关

比较数字涉及比较位的简单硬件指令

比较字符串包括(a)迭代两个字符串,直到找到不同的字符(不同于固定大小的数字)和(b)大量的Unicode魔术(不同长度的不同字符串实际上可以相等,不同代码块中的不同字符比较不同)



散列通常用于将字符串转换为数组索引。

比较原始数字肯定比比较字符串快,因为它只是一条计算机指令,而比较Java中的字符串是一种方法。但Java中使用哈希的原因不同,Object.hashCode()用于哈希表中,用于在集合中快速搜索。

比较两个数字比比较两个字符串(表示相同的数字)快很多。比较两个数字只需要比较单个位,并且可以使用and、XOR、2的补码等中的任何一个进行超级快速的比较

比较两个字符串既慢又贵。大多数算法需要遍历整个字符串并匹配每个字符

例如,假设我们想要比较9和12(false)。对于数值比较,假设算法比较单个位。 9 = 1001 12=1100

这里,最坏情况下的算法将比较4位

现在,如果我们将“9”和“12”表示为字符串,它们将分别以16位的形式存储在内存中(回想一下:Java使用UTF-16表示内存中的字符串),并且必须传递给字符串比较算法。事实上,Java的实际字符串比较函数如下:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}

正如您所看到的,字符串比较还有很多方法

一般来说,大多数计算机只有一条指令来比较整数、长整数等 最多需要几个指令周期。字符串通常由实用函数/方法进行比较(此规则可能有奇数例外)

例如,在Java中,字符串基本上表示为

     /** The value is used for character storage. */
     private final char value[];

     /** The offset is the first index of the storage that is used. */
     private final int offset;

     /** The count is the number of characters in the String. */
     private final int count;
而equals方法是

if (this == anObject) {
    return true;
}
if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
                return false;
        }
        return true;
    }
}
return false;
equals方法同时执行this==anObject
n==anotherString.count,这两种方法基本上都是整数比较,甚至在开始比较字符之前。它比整数比较所用的单个指令要长得多


C字符串比较比Java等效程序更简单/更快
,但它将包含某种循环和循环中每次传递的多条指令


这将比整数比较所需的一条指令花费更长的时间

情况未必如此,但可能大多数情况下都是如此

考虑以下情况:

我想比较字符串“苹果”和“橙子”。如果我只想确定“apples”==“oranges”,我只需要比较每个字符串的第一个字符:“a”!='“苹果”!=“橙子”。如果我对字符串进行散列,然后进行比较,速度会明显减慢,因为在比较结果整数之前,我必须解析两个字符串并将它们输入散列算法

但是,如果我需要多次比较,也许我经常比较“猩猩”和“猩猩”,那么如果我将所有字符串散列一次,并多次比较整数,结果会更快。这是哈希映射所基于的原理


但是,请注意,对字符串进行散列对于直接相等比较非常有用,它无法确定字符串在词法上是大于还是小于彼此,因此无法通过散列方法对字符串排序。(这就是为什么Java中的HashMap是无序的)。

我有一个预感——john=12,johnny=5。二进制5=0101中的12=1100。比较数字(转换为二进制后)比比较快得多。比较-john的4个字符(每个字符都有自己的二进制代码),然后发现它们不一样。但是,如果名称以不同的字母开头,那么散列将没有帮助。有道理吗?我不确定它是否正确。由于可能的字符串组合远远超过平均字符串容量,因此您将有许多字符串与相同的数字匹配,因此您必须检查它们是否匹配,如果匹配,则进行真正的压缩。此外,您还解决了SLaks提到的所有unicode问题。@SLaks我怀疑您的大多数数字都是固定大小的。:)bignum需要迭代,而更为奇特的“数字”(惰性计算、符号计算、实实在在的实数等)比较起来可能相当昂贵。但更严重的是,“散列”在什么世界里是一个将字符串转换为数组索引的术语?@Yakk:hashing用于将字符串转换为数组索引(对于哈希表)@SLaks散列可以作为该过程的一个步骤,是的。这并不是散列的唯一目的,我有一个预感——john=12,johnny=5。二进制5=0101中的12=1100。比较数字(转换为二进制后)比比较快得多。比较-john的4个字符(每个字符都有自己的二进制代码),然后发现它们不一样。但是,如果名称以不同的字母开头,那么散列将没有帮助。有道理吗?我不确定它是否正确。字符串在占用内存方面往往比通常使用的数字大得多,比较字符串的标准方法是看它们是否大小相同,如果是,比较它们的内存,看看它们是否在任何地方都不同。简单的“基元”整数类型可以存储为2s补码压缩位:这有一个缺点,即它们只能存储(比如)-20亿到2bi的值