Java 编译器会自动将任何带有一系列字符串连接的表达式转换为使用缓冲区。在 Java 1.5 之前,只有一种选择——StringBuffer。但是,它受到早期 Java 中同步所有公共方法的约定的影响。在 Java 1.5 中添加了一个新的缓冲区类 - StringBuilder - 这更好,因为它放弃了同步,让该类的用户正确同步访问。当 Java 编译器面向 Java 1.5 或更高版本时,它将使用 StringBuilder。对于 pre-1.5,它将使用 StringBuffer。
BlackBerry 设备使用基于 Java 1.3 的 Java-ME,因此不存在 StringBuilder 类。您的问题是您正在编写现代 Java-SE 代码并希望将其部署在 Java-ME BlackBerry 设备上。如果您使用的是 Eclipse,请将您的 Java 语言合规级别更改为 1.3。这将使编译器正确生成 StringBuffer 引用。它还将使用泛型作为语法错误。这是 BlackBerry 开发的预期 - 您不会获得泛型。
示例代码:
public class test {
public static String concat(String a, String b) {
return a + b;
}
}
编译时的字节码结果javac -source 1.5 -target 1.5 test.java
public static java.lang.String concat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_0
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_1
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
18: areturn
编译时的字节码结果javac -source 1.3 -target 1.3 test.java
public static java.lang.String concat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuffer
3: dup
4: invokespecial #3; //Method java/lang/StringBuffer."<init>":()V
7: aload_0
8: invokevirtual #4; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
11: aload_1
12: invokevirtual #4; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
15: invokevirtual #5; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;
18: areturn