官术网_书友最值得收藏!

Referential equality and structural equality

When working with a language that supports object-oriented programming (OOP), there are two concepts of equality. The first is when two separate references point to the exact same instance in memory. The second is when two objects are separate instances in memory but have the same value. What the same value means is specified by the developer of the class. For example, for two square instances to be the same, we might just require they have the same length and width regardless of coordinates.

The former is called referential equality. To test whether two references point to the same instance, we use the === operator (triple equals) or !== for negation:

    val a = File("/mobydick.doc") 
    val b = File("/mobydick.doc") 
    val sameRef = a === b 

The value of the test a === b is false because, although a and b reference the same file on disk, they are two distinct instances of the File object.

The latter is called structural equality. To test whether two objects have the same value, we use the == operator or != for negation. These function calls are translated into the use of the equals function that all classes must define. Note that this differs from how the == operator is used in Java—in Java, the == operator is for referential equality and is usually avoided:

    val a = File("/mobydick.doc") 
    val b = File("/mobydick.doc") 
    val structural = a == b 

Note that, in the double equals check, the value was true. This is because the File object defines equality to be the value of the path. It is up to the creator of a class to determine what structural equality means for that class.

The == operator is null safe. That is, we don't need to worry if we are testing a null instance as the compiler will add the null check for us.
主站蜘蛛池模板: 垫江县| 科技| 东莞市| 和田县| 右玉县| 原平市| 黄骅市| 贺兰县| 嵊州市| 屯昌县| 合作市| 大理市| 平山县| 密云县| 双鸭山市| 准格尔旗| 榆中县| 神木县| 新民市| 华蓥市| 四平市| 涡阳县| 离岛区| 宜兰市| 梁平县| 黎川县| 德安县| 永靖县| 永嘉县| 乐山市| 新邵县| 云霄县| 安岳县| 沽源县| 平凉市| 双江| 南丹县| 玛多县| 勃利县| 西盟| 酉阳|