Java 我必须创建Long的实例才能将Long作为参数发送吗?

Java 我必须创建Long的实例才能将Long作为参数发送吗?,java,oop,memory,casting,Java,Oop,Memory,Casting,我正在尝试向LinkedHashMap添加元素。LHM中的每个条目都是一个键和一个名为Page的类 我写了这段代码: public void addPage(Page<byte[]> addPage) { if(numOfPages < initialCapacity) // Checks that there is room { pages.put(new java.lang.Long(addPage.hashCode()), addPage

我正在尝试向LinkedHashMap添加元素。LHM中的每个条目都是一个键和一个名为Page的类

我写了这段代码:

public void addPage(Page<byte[]> addPage)
{
    if(numOfPages < initialCapacity) // Checks that there is room 
    {
        pages.put(new java.lang.Long(addPage.hashCode()), addPage);
        numOfPages++;
    }
}
语法无效。如果
映射
的键类型为
,则必须执行以下操作

pages.put((long) addPage.hashCode(), addPage);
因为
int
不会隐式转换为
Long

尽管看起来可能不太像,但此代码确实创建了一个新的
Long
实例,因为它会隐式地将
Long
框到一个新的
Long
(除非
hashCode
介于
-128
127
之间,因为这些
Long
被缓存)

看起来很浪费

是的。这是因为目前,原语不能用作泛型类型。我相信这将在Java10中改变

语法无效。如果
映射
的键类型为
,则必须执行以下操作

pages.put((long) addPage.hashCode(), addPage);
因为
int
不会隐式转换为
Long

尽管看起来可能不太像,但此代码确实创建了一个新的
Long
实例,因为它会隐式地将
Long
框到一个新的
Long
(除非
hashCode
介于
-128
127
之间,因为这些
Long
被缓存)

看起来很浪费

是的。这是因为目前,原语不能用作泛型类型。我相信这将在Java10中改变

这里的“Casting”只是对您隐藏对象创建,因此它同样有效

我倾向于这样写:编写
(long)addPage.hashCode()
,它将被编译成自动装箱(几乎在所有情况下都会)分配一个新的
long
对象

或者,您可以编写
Long.valueOf(addPage.hashCode())
,这将使装箱显式化,但会缓存较小的
hashCode
值。

这里的“Casting”只会对您隐藏对象创建,因此同样有效

我倾向于这样写:编写
(long)addPage.hashCode()
,它将被编译成自动装箱(几乎在所有情况下都会)分配一个新的
long
对象


或者,您可以编写
Long.valueOf(addPage.hashCode())
,这将使装箱显式,但会缓存较小的
hashCode
值。

pages.put(java.lang.Long(addPage.hashCode()),addPage)在语法上是错误的。这是在这里创建帖子时出现的复制粘贴错误,还是您实际使用这一行进行了尝试?hashCode()通常是
int
值,并且不能保证它是唯一的,您会得到重复的。当您比较映射条目的代码或所使用的值的大小时,这并不是浪费。这不太可能有什么不同。更大的问题是,hashCode()很可能在60K个条目上重复,而这远远早于您需要担心内存浪费的时间。我明白了。这确实是一个大问题。还有更好的散列方法吗?@OriaGruber通常的方法是使用
页面
实例本身作为键。“你不能这样做有什么原因吗?”保尔·伯丁顿说,是的。页面的类型必须为private java.util.Map。所以密钥必须是长的。
pages.put(java.lang.Long(addPage.hashCode()),addPage)在语法上是错误的。这是在这里创建帖子时出现的复制粘贴错误,还是您实际使用这一行进行了尝试?hashCode()通常是
int
值,并且不能保证它是唯一的,您会得到重复的。当您比较映射条目的代码或所使用的值的大小时,这并不是浪费。这不太可能有什么不同。更大的问题是,hashCode()很可能在60K个条目上重复,而这远远早于您需要担心内存浪费的时间。我明白了。这确实是一个大问题。还有更好的散列方法吗?@OriaGruber通常的方法是使用
页面
实例本身作为键。“你不能这样做有什么原因吗?”保尔·伯丁顿说,是的。页面的类型必须为private java.util.Map。因此,关键必须是长的。
java.lang.Long(addPage.hashCode())
pages.put((long) addPage.hashCode(), addPage);