• javaS的tring和androidS的tring区别是什么?


    这是今天阿里电话面试被问到的,在之前确实没有想过(一直以为是一样的),于是面试完之后,我立即打开了源代码,对这两个String类进行了比較,以下是我的发现。
    首先我观察了这两个String类所导入的包。发现两者有些差异:

    这是android版本号:

    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包里面的类。目測android对String类的性能进行了优化。
    接下来。我发现两个类的compareToIgnoreCase方法有差异:
    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将逻辑写到compareToIgnoreCase中。而CaseInsensitiveComparator比較器中的compare方法调用的就是compareToIgnoreCase,java版恰恰相反。

    接下来就比較有意思了。我发现android的非常多方法都变成本地方法了:
    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版本号的非常多方法都加上了注解。比如@FindBugsSuppressWarnings、@SuppressWarnings等等。而java版本号并没有。


    受个人水平限制,仅仅能分析至此了~




    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    poj 1579(动态规划初探之记忆化搜索)
    hdu 1133(卡特兰数变形)
    CodeForces 625A Guest From the Past
    CodeForces 625D Finals in arithmetic
    CDOJ 1268 Open the lightings
    HDU 4008 Parent and son
    HDU 4044 GeoDefense
    HDU 4169 UVALive 5741 Wealthy Family
    HDU 3452 Bonsai
    HDU 3586 Information Disturbing
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4803619.html
Copyright © 2020-2023  润新知