java的String和android的String有什么区别?

这是今天阿里电话面试被问到的,在之前确实没有想过(一直以为是一样的),于是面试完之后,我马上打开了源码,对这两个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版本并没有。

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

java的String和android的String有什么区别?,布布扣,bubuko.com

时间: 2024-08-02 11:05:01

java的String和android的String有什么区别?的相关文章

android获取string.xml的值

转自 http://blog.sina.com.cn/s/blog_618199e601011bst.html 为什么需要把应用中出现的文字单独存放在string.xml文件中呢? 一:是为了国际化,当需要国际化时,只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言(如,English),再运行程序时,android操作系统会根据用户手机的语言环境和国家来自动选择相应的string.xml文件,这时手机界面就会显示出英文.这样做国际化非常的方便. 二:为了减少应用的体积

android获取string.xml的值(转)

为什么需要把应用中出现的文字单独存放在string.xml文件中呢? 一:是为了国际化,当需要国际化时,只需要再提供一个string.xml文件,把里面的汉子信息都修改为对应的语言(如,English),再运行程序时,android操作系统会根据用户手机的语言环境和国家来自动选择相应的string.xml文件,这时手机界面就会显示出英文.这样做国际化非常的方便. 二:为了减少应用的体积,降低数据的冗余.假设在应用中要使用"我们一直在努力"这段文字1000次,如果在每次使用时直接写上这几

Java 里把 InputStream 转换成 String 的几种方法

我们在 Java 中经常会碰到如何把 InputStream 转换成 String 的情形,比如从文件或网络得到一个 InputStream,需要转换成字符串输出或赋给别的变量. 未真正关注这个问题之前我常用的办法就是按字节一次次读到缓冲区,或是建立 BufferedReader 逐行读取.其实大可不必费此周折,我们可以用 Apache commons IOUtils,或者是 JDK 1.5 后的 Scanner,还可用 Google  Guava 库的 CharStreams.到了 JDK7,

Android中 string.xml资源 如何添加参数?

在android 开发,我们通常会用string.xml资源去设置textview等控件的字符串.而值一般是与程序的运行结果无关的. 但有时需要根据运行的结果来显示到控件中,这时字符串资源就不能写死了. 可以用如下的表示方法来设置: %n$ms:s代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格. 如 :%1$2s表示:字符串资源的第1个string类型参数且该参数之后带有两个空格. %n$md:d代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格.

Android中String资源文件的format方法

很多时候我们感性Google在设计Android时遵守了大量MVC架构方式,可以让写公共代码.美工和具体逻辑开发人员独立出来.有关Android 的资源文件values/strings.xml中如何实现格式化字符串呢? <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">stringdemo</string&

java中String s="abc"及String s=new String("abc")详解

1.   栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2.   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共 享,详见第3点.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要 在运行时动态分配内存,存取速度较慢. ==是判断

Java笔记(12):常见对象String

1.String类的构造方法 1 package cn.itcast_01; 2 3 /* 4 * 字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. 5 * 通过查看API,我们可以知道 6 * A:字符串字面值"abc"也可以看成是一个字符串对象. 7 * B:字符串是常量,一旦被赋值,就不能被改变. 8 * 9 * 构造方法: 10 * public String():空构造 11 * public String(byte[] bytes):把字节数组转成字符串 1

Java从零开始(4)类String字符串

字符串是由字符组成,在Java中,字符串是对象,是描述字符的基本数据结构.String类可以用来保存一个字符串,本类是最终类,不允许继承: 1.String对象的创建 初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s = “Java语言”; 使用关键字new 其实按照面向对象的标准语法,其格式应该为: String s = new String(“abc”); s = new Stri

【转】android中string.xml文件的使用

1.在程序中获取string.xml中字符串和数值 <?xml version="1.0" encoding="utf-8"?><resources>    <string name="hello">Hello World, MainActivity!</string>    <string name="app_name">TestExample01</stri