【问题标题】:Why same piece of (simple) Java code behaves very differently on different Android devices?为什么同一段(简单)Java 代码在不同的 Android 设备上表现得非常不同?
【发布时间】:2013-05-14 07:22:48
【问题描述】:

为什么同一段(简单)Java 代码在不同的 Android 设备上的行为会大不相同?

那段简单的代码就是String.replace(CharSequence target, CharSequence replacement)target == ""的使用:

package com.example.stringreplacetest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String str = "just_a_string";

        System.out.println(str.replace("", "-"));
        ((TextView) findViewById(R.id.textView)).setText(str.replace("", "-"));
    }
}

它在我的 LG Optimus 3D P920 (Android 2.3.3) 和我姐姐的三星 Galaxy S2 (Android 4.1.2) 上产生 -j-u-s-t-_-a-_-s-t-r-i-n-g-,我猜你的大多数设备上也是如此。 em>

但它在我的 LG Optimus Chic (Android 2.2) 上停止(怀疑是无限循环)。

旧的 LG Optimus Chic 和 Android 2.2 可能有问题。 (String.replace() 确实有a bug。)但是String.replace() 中的the piece of code 相对简单——“简单”意味着没有动态绑定、没有线程等......

that piece of code 不应该在编译期间完成吗? Java 编译器是如何工作的(我知道 Java 是一种跨平台语言,它的工作方式可能不同)?

附:为了确保它是同一段编译代码,我实际上通过 USB 将编译后的.apk 传输到我的 Android 手机,而不是使用 Eclipse 直接在设备中运行它们。


我找到了Android 2.2 Froyo的源代码:

https://android.googlesource.com/platform/dalvik/+/froyo-release/libcore/luni/src/main/java/java/lang/String.java

确实target.length == 0 时会导致无限循环(因为在do-while loop 中,string.indexOf("", tail)永远返回-1)。

疑虑已消除。但是……

我仍然不知道为什么在不同的设备上运行时会加载不同版本的String 类。这就是跨平台的意思吗?

【问题讨论】:

标签: android compiler-construction java str-replace


【解决方案1】:

让我结束这个问题。

我找不到具体的文献参考资料。但是经过我的反复试验,以及对“Java与C编译器之间的差异”的一些研究。是的,这就是 Java 行为 - 编译一次,到处运行(&到处调试)。

这就是我们需要 Java VM 的原因。这就是 Java 编译速度比 C/C++ 快的原因。这就是 Java 运行速度比 C/C++ 慢的原因。

(我猜)Java 编译时,它只记录类签名。在 VM 上运行时,它会将这些签名与相应类的实际实现进行匹配,并及时将它们编译成机器代码。这就是为什么 Java 可以编译一次,在不同的机器上运行,因为不同的 VM 有自己的类实现。这也导致了一个问题,即如果某个版本中存在错误,程序员对此无能为力。这是因为实际的错误实现是在最终用户运行程序的客户端。我们需要等待用户更新他们自己的虚拟机。

附:事实上我们可以重新发明轮子,重新编写我们自己的类。所以这些类将被附加到部署的程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2016-08-21
    • 2016-06-02
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多