2009-07-07 88 views

回答

5

还有Arrays.equals()。

我不知道,如果在硬件中存在相应的指令的JVM实现是否真正优化了这一点,但我对此表示怀疑。另外,如果我正确记住我的C,strcmp会运行到一个空终止符(使其对C字符串有用),数组版本将比较整个数组,因为Java程序员很少打扰以null结尾的数组。但是,如果您关心空终止符,您可以轻松编写自己的函数。

+0

我很好奇的如果有人将空终止的情况下,他们自己在Java中的数组 – 2009-07-07 04:07:26

+0

我从来没有尝试过,但我会假设,如果有人在C中调用本地方法并使用缓冲区... – Uri 2009-07-07 04:08:51

+3

strcmp从哪里来?这个问题是关于memcmp的,我在编辑历史中也看不到strcmp。 – laalto 2009-07-07 10:50:21

1

好,Arrays.equals()是好的,但不能比的子范围。在这种情况下,还有通过及更高版本.subList()的路径,但不适用于像byte[]这样的基元。

其实没有直接memcmp()等同。这里是discussion,并且一旦我知道它现在(15年)处于同一状态。我的选择可以通过java.nio.ByteBufferwrap()方法,然后equals())来实现。但是它的代码量有点大。

对于人们充分不懂题目:memcmp()中,这是非常有效的,并没有在Java中目前接近它依赖于平台的方式来实现。就性能而言,任何手动周期都很遥远,至少是因为索引范围检查。也许有一天来自嵌入式C/C++的人会对这个话题感到满意:-)。

5

Memcmp返回int,小于,等于或大于零,如果没有发现s1的前n个字节,分别为小于,以匹配或比s2的第一n个字节。 Equals返回一个布尔值。这不是同一个功能。另外,memcmp比较字节作为无符号字符。

我觉得这可能是工作:

public int memcmp(byte b1[], byte b2[], int sz){ 
    for(int i = 0; i < sz; i++){ 
     if(b1[i] != b2[i]){ 
      if(b1[i] >= 0 && b2[i] >= 0) 
       return b1[i] - b2[i]; 
      if(b1[i] < 0 && b2[i] >= 0) 
       return 1; 
      if(b2[i] < 0 && b1[i] >= 0) 
       return -1; 
      if(b1[i] < 0 && b2[i] < 0){ 
       byte x1 = (byte) (256 + b1[i]); 
       byte x2 = (byte) (256 + b2[i]); 
       return x1 - x2; 
      } 
     } 
    } 
    return 0; 
} 

(编辑) 事实上,2的补一部分是没有必要的:

public static int memcmp(byte b1[], byte b2[], int sz){ 
    for(int i = 0; i < sz; i++){ 
     if(b1[i] != b2[i]){ 
      if((b1[i] >= 0 && b2[i] >= 0)||(b1[i] < 0 && b2[i] < 0)) 
       return b1[i] - b2[i]; 
      if(b1[i] < 0 && b2[i] >= 0) 
       return 1; 
      if(b2[i] < 0 && b1[i] >=0) 
       return -1; 
     } 
    } 
    return 0; 
}