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

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

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

4

5 回答 5

11

JDK 7 中字节类的源代码显示了这一点:

(我选择了字节版本而不是字符串版本,因为代码少,但思路完全一样)

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

于 2013-09-08T02:58:36.720 回答
9

该方法的文档解决了valueOf()这个问题:

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

于 2013-09-08T02:46:56.000 回答
1

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

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

于 2013-09-08T03:15:00.167 回答
1

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

于 2013-09-08T02:47:52.673 回答
0

valueOf() 是静态工厂方法,通常比 new Byte() 更好,有效的 java item1:考虑静态工厂方法而不是构造函数。类似的类是 Boolean.valueOf(),TRUE 或 FALSE 是静态最终字段中的实例化。

于 2020-05-03T15:34:03.040 回答