String.valueOf()与toString()和(String)的区别
string.valueOf()
/**
String.class
*/
public static String valueOf(boolean b) {
return b ? "true" : "false";
}
public static String valueOf(char c) {
char data[] = {c};
return new String(data, true);
}
//使用的都是其包装类对应的toString()
public static String valueOf(int i) {
return Integer.toString(i);
}
public static String valueOf(long l) {
return Long.toString(l);
}
public static String valueOf(float f) {
return Float.toString(f);
}
public static String valueOf(double d) {
return Double.toString(d);
}
//如果不是基本类型,其若不为空,则调用对应的toString()方法
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
String.ValueOf()
方法内部在基本类型传入之后使用的依然是其对应的包装类的toString()方法,但特殊的如:String.valueOf(char ch)/String.valueOf(boolean b),以及String.valueOf(Object o)所使用的不是其对应包装类的toString()方法而Character的toString()方法内部使用的是String.valueOf()
Integer类的特殊
public class IntegerTest {
public static void main(String[] args) {
Integer a= 127, a1 = 128;
Integer b = 127,b1 = 128;
Integer c = Integer.valueOf(127),c1 = Integer.valueOf(128);
Integer d = new Integer(127),d1 = new Integer(128);
System.out.println("a==b?"+(a==b)+"\t"+"a1==b1?"+(a1==b1));
System.out.println("a.equals(b) = " + a.equals(b)+"\t"+"a1.equal(b1) = "+a1.equals(b1));
System.out.println("c==d = " + (c == d)+"\t"+"c1==d = "+(c1==d1));
System.out.println("c.equals(d) = " + c.equals(d)+"\t"+"c1.equals(d1) = "+c1.equals(d1));
}
}
a==b?true a1==b1?false
a.equals(b) = true a1.equal(b1) = true
c==d = false c1==d = false
c.equals(d) = true c1.equals(d1) = true
/**
* 返回表示指定int值的Integer实例。如果不需要新的Integer实例,通常应该优先使用此方法而不是构造函数Integer(int),因为此方法通过缓存频繁请求的值可能会产生显著更好的空间和时间性能。此方法将始终缓存-128到127(包括-128到127)范围内的值,并可能缓存此范围之外的其他值。 参数: I -一个int值。 返回: 表示i的Integer实例。 自: 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
总结: Integer a = 22其实就是调用Integer a = Integer.valueOf(22)这个方法,方法源代码如上,当传入的参数是IntegerCache.low - IntegerCache.high之间,即-128 – 127之间,返回的是缓存中提前存在的integer对象,当非-128 – 127之间的时候,则new Integer(int value)新对象。