百科问答小站 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多种工具。

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




  

相关话题

  为什么NodeJS领域那么多框架,而Java则可以SpringBoot一家独大? 
  面向对象中,平行继承体系是否尽量完全抛弃? 
  Java 为什么不采用 360 垃圾清理来进行垃圾回收呢? 
  谁能用通俗的语言解释一下什么是 RPC 框架? 
  C# 发明者与 Java 有关系么? 
  在职程序员们,如何看待高校学生的技术不断更新迭代? 
  如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的? 
  随着互联网的崛起,还有必要学习 C++ 吗?貌似 C++ 越来越难找工作了... 
  如何看待越来越多公司弃用 PHP 使用 Java? 
  怎样算是学好了 Java? 

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





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