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

时间:2013-09-08 02:44:25

标签: java

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

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

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

4 个答案:

答案 0 :(得分:11)

JDK 7中字节类的source code显示:

(我选择了字节版本而不是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 :(得分:9)

valueOf()方法的documentation解决了这个问题:

  

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

答案 2 :(得分:1)

Byte.valueOf(“10”)是一个静态工厂方法,它将返回字节对象,而新的字节(“10”)是一个构造函数

答案 3 :(得分:1)

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

new Byte()始终返回一个新对象。