[英]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的源代码:
当target.length == 0
时,它的确会引起无限循环(因为在do-while loop
, string.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.