比较 / 编程语言 · 2023年 10月 8日 0

数据相等

45 次浏览

计算机编程语言的抽象,让相等变得更复杂。

不同编程语言的判等

较早的编程语言判断相等一般按数值判断(指针也算数值),后期编程语言增加了更多的判断方法,比如Python的is.

  • C/ObjC/C++数组名判断相等本质是指针判等,与内容无关。
  • C++运算符重载==可以支持内容判断或自定义。
  • Java对基本数据类型(非引用类型)用==和equals方法是等效的,本质都是数值判等,对于引用类型,==代表是否指向同一个对象(本质为判断指针地址); equals方法默认为判断引用,一般会重写为比较内容。
    • 查阅Object/Integer/String源代码equals的实现可知一二。
  • C#和Java类似,对于引用类型:
    • 如果是referenceEqual始终比较引用或地址。
    • Equals和==默认比较地址,用户自定义对象,为了方便理解,一般对于前面的Equals或者运算符==,都会重写或重载(Java没有运算符重载,就重写Equals方法)为比较内容,不过最终以用户代码为准。
      • 特例是string类型==和Equals都是比较内容。
  • Python的is用于比较对象的id是否相同(不同变量的id可能是同一个),==运算符只判断对象内容是否相等,不同的id内容可能相同可能不同。
    • is调用id(a) == id(b)检查,==调用__eq()__ 方法检查。
  • PHP提供==和===两种判等方式,前者是基本的数值判断,后者额外包含类型相同。
  • Swift用==提供为值类型或引用类型数据相等判断,===为引用类型判断同一性(地址相同)。
  • Go语言基本类型、字符串和结构体用"=="可判断内容相等,如果是切片、map,则默认比较的是指针。同时,Go语言也提供了自定义Equal方法。
  • JS的“=”是赋值,"=="判断相等,宽松比较,"==="是严格比较相等。
    基本字符串判等只需要比较值,即只需要==判断,而字符串对象判等需要判断地址,需要用===判断。
  • 仓颉 字符串可以用==判断内容是否相等。