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

本文对比了Android与Java标准版中String类的实现差异,重点分析了包导入、compareToIgnoreCase方法及本地方法的使用等方面的不同,并探讨了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版本并没有。

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




Android 开发中,Kotlin Java 存在多方面的区别: 1. **语法简洁性**:Kotlin 具有更现代化、简洁的语法,能够让开发变得更加高效愉快。例如,在 Java 中声明一个简单的类方法可能需要较多的代码,而 Kotlin 可以用更简洁的方式实现相同的功能。以下是 Java Kotlin 实现打印“Hello, World!”的代码对比: ```java // Java 代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } ``` ```kotlin // Kotlin 代码 fun main() { println("Hello, World!") } ``` 2. **空安全**:Kotlin 在设计上就考虑了空指针异常的问题,引入了可空类型非空类型的概念。在 Kotlin 中,如果一个变量可能为 null,需要显式地声明为可空类型,使用时也需要进行空检查。而 Java 中没有这种明确的空安全机制,容易出现空指针异常。例如: ```kotlin // Kotlin 代码 var name: String? = null // 需要进行空检查 name?.let { println(it) } ``` ```java // Java 代码 String name = null; if (name != null) { System.out.println(name); } ``` 3. **函数式编程**:Kotlin 对函数式编程有更好的支持,提供了 lambda 表达式、高阶函数等特性,使得代码更加简洁灵活。JavaJava 8 开始也引入了一些函数式编程的特性,但相比之下,Kotlin 的函数式编程支持更加完善。例如,使用 Kotlin 的 lambda 表达式可以很方便地对集合进行操作: ```kotlin // Kotlin 代码 val numbers = listOf(1, 2, 3, 4, 5) val squared = numbers.map { it * it } ``` ```java // Java 代码 import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> squared = numbers.stream() .map(n -> n * n) .collect(Collectors.toList()); } } ``` 4. **扩展函数**:Kotlin 支持扩展函数,允许在不继承或修改现有类的情况下,为类添加新的函数。Java 没有这种特性。例如,为 Kotlin 的 String 类添加一个扩展函数: ```kotlin // Kotlin 代码 fun String.addExclamation() = this + "!" val message = "Hello" println(message.addExclamation()) ``` 5. **协程异步编程**:Kotlin 提供了协程的概念,用于简化异步编程。协程可以让异步代码看起来像同步代码一样,提高了代码的可读性可维护性。Java 通常使用线程回调来处理异步操作,代码相对复杂。例如,使用 Kotlin 协程进行异步操作: ```kotlin // Kotlin 代码 import kotlinx.coroutines.* fun main() = runBlocking { launch { delay(1000) println("Hello after 1 second") } println("Hello immediately") } ``` 6. **数据类**:Kotlin 提供了数据类的概念,用于快速创建只包含数据的类,会自动生成 equals()、hashCode()、toString() 等方法。Java 需要手动编写这些方法。例如: ```kotlin // Kotlin 代码 data class Person(val name: String, val age: Int) val person = Person("John", 30) println(person) ``` ```java // Java 代码 public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值