Java字符串拼接效率的比较和对String.valueOf的思考

这两天看到的关于Java的一篇文章(《阿里资深工程师教你如何优化Java代码》)中有写到使用String.valueOf(value)代替 “” + value的建议,原因是“当要把其他对象或类型转换为字符串时,使用String.valueOf(value)比""+value的效率更高。”
反例:

int i = 1;
String s = "" + i;

正例:

int i = 1;
String s = String.valueOf(i);

当看到上面的建议的时候是认同的,后来仔细一想Android framework上面log的写法都是下面的方式:

int num = 1;
int count = 2;
Rlog.d(LOG_TAG, "the num:" + num + ", the count:" + count);

而Rlog.d的原型函数如下:

\frameworks\base\telephony\java\android\telephony\Rlog.java
public static int (String tag, String msg) {
    // native实现
}

函数实现上看,打印的日志信息就是String类型的,Android中的使用方法就是反例,效率不高。是不是应该改成

int num = 1;
int count = 2;
Rlog.d(LOG_TAG, "the num:" + String.valueOf(num) + ", the count:" + String.valueOf(count));

但是Android code中几乎看不到上面这种写法,那就奇怪了,Android中打印的log数量还是很可观的,尤其是测试版本上,log更是很多。那Android为什么不使用String.valueOf呢?难道Android错了?当问题提出后,我打算通过字节码看一下反例和正例的差别,另外就是通过实际测试看一下两种效率的差异。

有些问题通过字节码就能看出端倪。下面是需要转译字节码的原始code,比较常用,尤其是打印log,字符串和整数拼接出一个新的自付出。

public class TestValueOf {
public static void main(String[] args) {
    int i = 0;
    String s = "abcdef";
    String s1 = s + i;
    System.out.println(s1);
    String d = "abcdef";
    String d1 = d + String.valueOf(i);
    System.out.println(d1);
}
}

下面是对应生成的字节码:

public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=6, args_size=1
0: iconst_0
1: istore_1
2: ldc #2 // String abcdef
4: astore_2
5: new #3 // class java/lang/StringBuilder
8: dup
9: invokespecial #4 // Method java/lang/StringBuilder.""?)V
12: aload_2
13: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: iload_1
17: invokevirtual #6 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
20: invokevirtual #7 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
23: astore_3
24: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
27: aload_3
28: invokevirtual #9 // Method java/io/PrintStr

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: String.valueOf 是 Java 中的一个方法,用于将任意基本数据类型或对象转换为字符串类型。例如: ```java int num = 10; String strNum = String.valueOf(num); // 将整型变量 num 转换为字符串类型 ``` 这个方法还可以将字符数组或部分字符数组转换为字符串类型。 ### 回答2: String.valueOf是一个Java方法,用于将不同类型的数据转换为字符串类型。它有多个重载方法,每个方法接受不同类型的参数,并返回对应的字符串结果。 当参数为基本数据类型时,String.valueOf会将其转换为对应的字符串形式。例如,int类型的参数会被转换为整数的字符串表示,float类型的参数会被转换为浮点数的字符串表示。 当参数为对象类型时,String.valueOf会调用参数对象的toString方法,将得到的字符串结果返回。这里的对象可以是任意类型,只要该类型实现了toString方法即可。 String.valueOf方法的返回值是一个字符串类型的值,可以用于赋值给一个字符串变量,或者用于字符串的拼接等操作。 此外,String.valueOf还可以用于将null值转换为字符串"null"。当参数为null时,返回的结果即为字符串"null"。 总之,String.valueOf是一个非常实用的方法,可以将不同类型的数据转换为字符串类型,方便在程序中进行字符串的操作和处理。 ### 回答3: String.valueOf是一个静态方法,用于将不同类型的数据转换为String类型。它有多个重载方法,可以接受不同的参数类型,如基本数据类型、对象等。 当我们需要将其他类型的数据转换为String类型时,可以使用String.valueOf方法。例如,如果我们有一个int类型的变量num,我们可以通过String.valueOf(num)将其转换为String类型。 String.valueOf方法的返回值是一个String对象,表示转换后的字符串值。如果参数为null,该方法会返回"null"字符串。 除了基本数据类型,String.valueOf方法还可以处理其他类型的数据。比如,如果我们有一个对象obj,如果该对象已经实现了toString方法,那么调用String.valueOf(obj)将会返回该对象的toString方法的返回值的字符串表示。 总而言之,String.valueOf是一个非常实用的方法,可以将不同类型的数据转换为String类型,方便我们在字符串的处理和拼接中使用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值