Byte byte1=new Byte("10");
Byte byte2=Byte.valueOf("10");
System.out.println(byte1);
System.out.println(byte2);
byte1和byte2都打印了相同的值10。那么构造函数参数化的Byte和valueOf()方法之间有什么区别呢。
Byte byte1=new Byte("10");
Byte byte2=Byte.valueOf("10");
System.out.println(byte1);
System.out.println(byte2);
byte1和byte2都打印了相同的值10。那么构造函数参数化的Byte和valueOf()方法之间有什么区别呢。
JDK 7中byte类的源代码显示如下:
(我选择了byte版本而不是String版本,因为代码更少,但是思路完全相同)
public static Byte valueOf(byte b)
{
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
并且:
public Byte(byte value)
{
this.value = value;
}
ByteCache所在位置:
private static class ByteCache
{
private ByteCache(){}
static final Byte cache[] = new Byte[-(-128) + 127 + 1];
static
{
for(int i = 0; i < cache.length; i++)
cache[i] = new Byte((byte)(i - 128));
}
}
基本上,构造函数版本用于创建全新的对象,而valueOf
版本则返回预先存在的对象。这样可以节省内存,因为无论您调用多少次Byte.valueOf(10)
,都只有一个值,但如果使用new Byte(10)
,每次调用new
都会创建一个新值。由于字节是不可变的(它们没有可变状态),因此没有理由为任何给定值创建多个对象。
Byte.valueOf(byte)
使用缓存,但Byte.valueOf(String)
不使用!(我猜只是疏忽了 - 在http://bugs.sun.com/view_bug.do?bug_id=6480728下修复) - bacarvalueOf()
方法的文档对此进行了解释:
如果不需要创建新的 Byte 实例,则通常应该优先使用此方法而不是构造函数 Byte(byte),因为由于所有字节值都被缓存,此方法可能会产生更好的空间和时间性能。
Byte.valueOf("10") 是一个静态工厂方法,它将返回 byte 对象,而 new Byte("10") 是一个构造函数。
Byte.valueOf()
会返回一个缓存的实例。
new Byte()
总是返回一个新对象。
valueOf() 是一个静态工厂方法,通常比 new Byte() 更好,有效的 Java 项1:考虑使用静态工厂方法而不是构造函数。类似的类是 Boolean.valueOf(),TRUE 或 FALSE 实例化在静态 final 字段中。
byte
而不是Byte
。除非你有一个期望对象或者你可以有null
的库,否则应尽可能使用原始类型。 - Peter Lawrey