Java 我必须创建Long的实例才能将Long作为参数发送吗?
我正在尝试向LinkedHashMap添加元素。LHM中的每个条目都是一个键和一个名为Page的类 我写了这段代码: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
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);