javaのStringとandroidのStringは何の違いがありますか?

3918 ワード

これは今日のアリの電話面接で聞かれたのですが、前には考えられなかったです。だから面接が終わった後、すぐにソースを開けました。この二つのString類を比較しました。以下は私の発見です。
まずこの二つのString類が導入したカバンを観察しましたが、両者の違いがあります。
これはアンディのバージョンです。
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.Charsets;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Formatter;
import java.util.Locale;
import java.util.regex.Pattern;
import libcore.util.EmptyArray;//     google   api  
これはjavaバージョンです
import java.io.ObjectStreamField;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Formatter;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
Android版のNioバッグの種類が多くなりました。String類の性能を目測androidで最適化しました。
次に、二つの種類のcompreToIgnoreCaseの方法に違いがあることを発見しました。
androidバージョン:
 public int compareToIgnoreCase(String string) {
        int o1 = offset, o2 = string.offset, result;
        int end = offset + (count < string.count ? count : string.count);
        char c1, c2;
        char[] target = string.value;
        while (o1 < end) {
            if ((c1 = value[o1++]) == (c2 = target[o2++])) {
                continue;
            }
            c1 = foldCase(c1);
            c2 = foldCase(c2);
            if ((result = c1 - c2) != 0) {
                return result;
            }
        }
        return count - string.count;
    }
javaバージョン:
  public int compareToIgnoreCase(String str) {
        return CASE_INSENSITIVE_ORDER.compare(this, str);
    }
よく見ると、順番が逆です。実質的には同じです。androidはcompreToIgnoreCaseに論理を書きます。CaseInsensitive Compratorのコンパレータの中のcompareメソッドはcompreToIgnoreCaseです。java版は反対です。
これから面白いです。アンディの多くの方法が地元の方法になっていることを発見しました。
public native char charAt(int index); 
public native int compareTo(String string);
public native boolean equals(Object object);
private native int fastIndexOf(int c, int start);
public native boolean isEmpty();
public native int length();
これらの方法は、javaにおいては、nativeではない。
public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }
    public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;
        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }
   public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
Androidは確かにローカル方法で一般的なapiを最適化しています。効率はJavaバージョンよりも高いと思います。
この他にもAndroid版の多くの方法に注釈が付けられています。例えば@FindBugs Suppres Warnings、@Suppres Warningsなどです。java版はありません。
個人のレベルに制限されているので、ここまでしか分析できません。