百科问答小站 logo
百科问答小站 font logo



Java为什么设计成`String`不能用`==`比较值? 第1页

  

user avatar   anthonyh 网友的相关建议: 
      

String可以用==比较,这是判断同一性;当用equals比较时,它是判断相等性。

其实还有一种等价性,比如true和True,虽然不相等,但作用是一样的,所以可以相互替换。它们是等价的。

C语言没有相等性。它只有同一性,只用==判断,1和1都是1,但“A”和“A”几乎不可能相等(自身比较,只读公共字符串等特殊情况相等)。

C++可以说是没有同一性,C++把==用做相等性判断(所以才能重载),少数从C继承过来的特性比如数组,函数之间比较是同一性判断。

有了直观的认识,就可以解释同一性和相等性。简单地说,昨天的我和今天的我是否相等,这个是同一性判断。虽然有些属性不一致了,但我还是我。放到编程中就是数据的标签一样,内容不一样,它还是同一个数据(不同状态)。

而相等性是我从超市买一瓶矿泉水调换了宾馆的同样的矿泉水。它们的商品编号肯定不一样,但实质一样就是相等的。

在这个问题上,C和C++都是实用主义,能用就行。Java试图做正确的事,区分了同一性(用==)和相等性(用equals),但是实际上不实用。很多朋友不知道这两个概念也用的挺好。

C#和之后发明的语言,做得更好一点,需要相等它们可以相等(struct),需要同一性也可以是同一性(class)。甚至可以重载一下把同一性变成相等性,类似int类型)。

糟糕的是JavaScript这种,==被搞翻了(同一性,相等性,等价性它都做),===来补救(只提供同一性,很有限的相等性),但是没有相等性判断也很难用。所以==还不能扔。==又有等价性判断的坑。

没有重载能力的lisp系列语言,如scheme,会提供eq,eqv,equal多种工具。

这是数据结构应该掌握的东西。




  

相关话题

  江湖上流传着哪些关于R大RednaxelaFX的黑暗传说? 
  如何看待阿里 P8 加面 coding 环节,而 P7 却做不出头条算法题? 
  为何在AI领域Java没有python火? 
  为什么 Java 总被黑? 
  公司规定所有接口都用 post 请求,这是为什么? 
  Spring是否代表着目前Java技术的顶峰,未来的Java将如何发展? 
  编程语言中类型前置和类型后置的优缺点各是什么? 
  计算机专业应该如何发展? 
  PC端Web胜利了,移动端为什么Web没能取代大量的APP? 
  Java bean 是个什么概念? 

前一个讨论
你认为中国编纂民法典时机成熟了么?
下一个讨论
如果未来发现宇宙从始至终只有一个粒子,且所有粒子都是它的不同时间态。会对人类看待宇宙产生怎样影响?





© 2024-11-24 - tinynew.org. All Rights Reserved.
© 2024-11-24 - tinynew.org. 保留所有权利