Valhalla项目的价值类型是什么?

我已经开始阅读关于Project Valhalla的内容,而且有些东西我真的不明白,而且它是Value Types

这就是我的理解:

1)对象是否无法将其作为参考进行比较?

 final ValueType a = new ValueType(); final ValueType b = a; System.out.println(a==b); returns false???? 

Google AutoValue 代码示例中 ,它说明了这一点

 if(o == this){return true;}//equals method implementation what is this? I am comparing references here right? 

2)根据维基百科, 高效的小“对象”没有inheritanceSmall Objects? Without inheritance意味着什么?

这是不可能使用VT?

 public final class ValueType extends Any //is this not possible?? 

3)为什么使用它们? 将使用哪种方案以及如何使用它。

4)根据Google AutoValue Library ,简而言之, 值类型对象是没有标识的对象,即如果它们各自的内部状态相等,则认为两个值对象相等。 我的问题是:他们是否有状态,他们应该实现equalshashcode没有身份的对象意味着什么?

5)这个断言是否正确?

 public static void main(final String[] args) { final Test clazz = new Test(); final AutoValue value = new AutoValue("Java Belongs to SUN");//Constructor Name clazz.mutate(value); System.out.println(value.getName()); //would print: Java Belongs to SUN?? } private void mutate(final AutoValue value){value.setName("Java now is part of Oracle Corporation");return;} 

如果是这样,JVM是否会在方法调用之间获取内存而不跟踪此Objects or Values

Project Valhalla是Java 10初始项目的一部分,将于2018年左右准备就绪。

你的最后断言是正确的。 将ValueType变量作为参数传递给函数时,它们被完全复制,而不是通常只获取对象的引用副本。 这允许您将小对象视为类似int或boolean的值类型。

1)在Project Valhalla下,两个ValueTypes将直接与字段进行比较,即使对于==检查,也很像基本类型。 使用Google的AutoValue类型,您永远不会直接使用==,因为这仍然是身份检查。

2)小对象意味着这应该用于只有少数字段的对象,因为对象的整个内容将被重复复制。 通过引用传递更好地服务大对象。

没有inheritance意味着您将无法对Value Type对象使用多态。 因为值类型意味着直接存储,就像原始值一样,它们不包含任何类信息,因此JVM必须始终能够从程序本身而不是从对象上的任何信息推断出对象是什么。 例如,Integer字段可以是Value Type成员,而Number字段仍然必须通过引用。

3)它们用于避免访问对象成员通常所需的解除引用惩罚。 例如,对于List of Points,每个Point实际上是对内存中x和y值的引用,因此迭代列表将涉及许多解引用。 如果点直接存储在列表中,则可以避免这种情况。

4)没有身份的对象意味着对象的所有重要性都是它的价值。 正如值1的int应该与值为1的所有其他int相同,并且所有字符串“hello world”等于所有其他字符串“hello world”,无论它们是否实际上是同一个对象。 相比之下,两个同时为空的ArrayLists都具有标识,因为它们是可变的,并且向一个列表添加元素必须与向另一个列表添加元素不同。

5)在Project Valhalla下,AutoValue(如果它是一个Value Object)将是不可变的,因此不会调用setName方法。 它类似于你永远不会将1变为2的方式,而是修改1所在的位置,以便改为2。

资料来源: http : //cr.openjdk.java.net/~jrose/values/values-0.html

其他答案很好,但还有另一个关于对象核心点的观点:它们为您提供堆栈语义。

含义:在项目Valhalla之前,您要么具有原始 “对象”和引用对象。 第一个可以存在于堆栈中,但真实对象只存在于堆上。

值对象将改变它。 您可以拥有“真实”对象 – 但它们的数据驻留在堆栈上。 这意味着您没有引用(因此取消引用的成本)任何东西 – 就像原始类型一样,该直接放在堆栈上。 但是现在这个值可能不仅仅是一个int,long,… – 你可以拥有一个真正的“复杂”对象 – 但它的所有数据都直接存在于堆栈中。

因此,您现在可以很好地执行a == b – 因为现在您不再比较指向堆的引用 – 但ab直接具有相应的值。