等效于Java中的memcmp()?
还有Arrays.equals()。
我不知道,如果在硬件中存在相应的指令的JVM实现是否真正优化了这一点,但我对此表示怀疑。另外,如果我正确记住我的C,strcmp会运行到一个空终止符(使其对C字符串有用),数组版本将比较整个数组,因为Java程序员很少打扰以null结尾的数组。但是,如果您关心空终止符,您可以轻松编写自己的函数。
[满足Arrays.equals] [1]
[1]:http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#equals(byte[],字节[])
好,Arrays.equals()
是好的,但不能比的子范围。在这种情况下,还有通过及更高版本.subList()
的路径,但不适用于像byte[]
这样的基元。
其实没有直接memcmp()
等同。这里是discussion,并且一旦我知道它现在(15年)处于同一状态。我的选择可以通过java.nio.ByteBuffer
(wrap()
方法,然后equals()
)来实现。但是它的代码量有点大。
对于人们充分不懂题目:memcmp()
中,这是非常有效的,并没有在Java中目前接近它依赖于平台的方式来实现。就性能而言,任何手动周期都很遥远,至少是因为索引范围检查。也许有一天来自嵌入式C/C++的人会对这个话题感到满意:-)。
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;
}
我很好奇的如果有人将空终止的情况下,他们自己在Java中的数组 – 2009-07-07 04:07:26
我从来没有尝试过,但我会假设,如果有人在C中调用本地方法并使用缓冲区... – Uri 2009-07-07 04:08:51
strcmp从哪里来?这个问题是关于memcmp的,我在编辑历史中也看不到strcmp。 – laalto 2009-07-07 10:50:21