2009-07-07 141 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; 
}