Java—String.valueof()和Integer.toString()的不同

引言

平常经常使用这两个方法进行int类型转String,一般情况也不区分,今天就深究一下,它们的区别,平常应该使用那个方法更好一些。

Integer.toString()方法

作用:该方法返回指定整数的有符号位的String对象,以10进制字符串形式返回。

内部实现

public static String toString(int i) {
    if (i == Integer.MIN_VALUE) //等于最小值直接返回最小值字符串,避免getChars方法遇到最小值发生错误
        return "-2147483648"; 
    //判断i的位数,若位负数增加1位用来保存符号位
    int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
    char[] buf = new char[size];
    //将i转换位buf符号数组
    getChars(i, size, buf);
    //因为buf数组是在方法内部生成,其他地方不会有其引用,所以直接将其引用给String内部的value保存,用来初始化String
    return new String(buf, true);
}

可以看出Integer.toString()方法用来执行将int转换为String的操作,那么根据方法复用的原则,可以推断出String.toString(int)也应该是使用来该方法。那么我们接着往下看。

String.valueof()方法

不同于Integer.toString(int),valueof有大量的重载方法,我们一一对其介绍。

public static String valueOf(Object obj)
作用:将对象转换成String类型
源码

  public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

可以看出这里调用对象的toString(),所以写对象时,最好重写其toString()方法

public static String valueOf(char data[])
作用:将字符数组转换成String类型
源码

public static String valueOf(char data[]) {
    return new String(data);
}

直接将字符数组作为String的构造参数入参,内部是将数组复制了一份保存在了String中,用来初始化String。

public static String valueOf(char data[], int offset, int count)
作用:将offset位置至offset+count位置的data[]数组转换成String类型
源码

public static String valueOf(char data[], int offset, int count) {
    return new String(data, offset, count);
}

public static String valueOf(boolean b)
作用:将布尔转换成String类型
源码

public static String valueOf(boolean b) {
    return b ? "true" : "false"; 
}

可以看出并不能直接从boolean转换成字符,而是判断后,返回指定的字符串。

public static String valueOf(char c)
作用:将字符转换成String类型
源码

public static String valueOf(char c) {
    char data[] = {c};
    return new String(data, true);
}

这里先将字符转换成字符数组,可能好奇String(data,true)这个构造方法与上面的String(data)有什么不同,String(data, true)构造方法将引用传递给了String内部的value用来创建字符串,data在方法内部创建没有其他引用,所以可以直接传递,节约内存空间

public static String valueOf(int i)
作用:将int类型转换成String类型
源码

public static String valueOf(int i) {
    return Integer.toString(i);
}

与我们的推测相似,这里调用了Integer.toString()的方法,可以看出String的valueof方法是将各种类型转换成String,内部重载了不同类型转String的处理,所以推荐使用valueof方法。

public static String valueOf(long l)
作用:将long类型转换成String类型
源码

public static String valueOf(long l) {
    return Long.toString(l);
}

public static String valueOf(float f)
作用:将float类型转换成String类型
源码

public static String valueOf(float f) {
    return Float.toString(f);
}

public static String valueOf(double d)
作用:将double类型转换成String类型
源码

public static String valueOf(double d) {
    return Double.toString(d);
}

你可能感兴趣的:(Java后端技术)