Byte构造函数和Byte.valueOf()方法的区别

3
Byte byte1=new Byte("10");
Byte byte2=Byte.valueOf("10");

System.out.println(byte1);
System.out.println(byte2);

byte1和byte2都打印了相同的值10。那么构造函数参数化的Byte和valueOf()方法之间有什么区别呢。


我会使用 byte 而不是 Byte。除非你有一个期望对象或者你可以有 null 的库,否则应尽可能使用原始类型。 - Peter Lawrey
5个回答

12

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都会创建一个新值。由于字节是不可变的(它们没有可变状态),因此没有理由为任何给定值创建多个对象。


1
请注意,在JDK6中,Byte.valueOf(byte)使用缓存,但Byte.valueOf(String)不使用!(我猜只是疏忽了 - 在http://bugs.sun.com/view_bug.do?bug_id=6480728下修复) - bacar

9

valueOf() 方法的文档对此进行了解释:

如果不需要创建新的 Byte 实例,则通常应该优先使用此方法而不是构造函数 Byte(byte),因为由于所有字节值都被缓存,此方法可能会产生更好的空间和时间性能。


这是否意味着使用valueOf()方法比使用带参数的Byte构造函数性能更好,而没有其他影响......我感到困惑。 - rajeev
@rajeev 正确。也就是说,您将节省空间,因为您不必让多个包含相同值的框浮动存在。 - John Dvorak

1

Byte.valueOf("10") 是一个静态工厂方法,它将返回 byte 对象,而 new Byte("10") 是一个构造函数。


1

Byte.valueOf()会返回一个缓存的实例。

new Byte()总是返回一个新对象。


0

valueOf() 是一个静态工厂方法,通常比 new Byte() 更好,有效的 Java 项1:考虑使用静态工厂方法而不是构造函数。类似的类是 Boolean.valueOf(),TRUE 或 FALSE 实例化在静态 final 字段中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接