繁体   English   中英

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

[英]Why same piece of (simple) Java code behaves very differently on different Android devices?

为什么同一段(简单的)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)和我姐姐的Samsung Galaxy S2(Android 4.1.2)上产生-just-_-a-_-string- ,而且我猜在您的大多数设备上也是如此。

但这会使我的LG Optimus Chic(Android 2.2)停止运行(可能会产生无限循环)。

旧的LG Optimus Chic和Android 2.2可能有故障。 String.replace()确实有一个错误 。)但是String.replace() 的代码段相对简单-“简单”表示没有动态绑定,没有线程等。

那段代码不是应该在编译时完成的吗? Java编译器如何工作(据我所知Java是一种跨平台语言,它的工作方式可能有所不同)?

PS为确保它是同一段编译代码,我实际上是通过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 loopstring.indexOf("", tail) 永远不会返回-1 )。

疑虑已经清除了一点。 但...

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

让我结束这个问题。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM