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

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




  

相关话题

  为什么java版本更新这么慢? 
  学了 3 年 Java,包括自学和大学学习,如今工作一开始需要我学 C#,觉得不甘心怎么办? 
  网站如何升级成https的? 
  如何去阅读并学习一些优秀的开源框架的源码? 
  Java中 栈内存的存取速度仅次于寄存器,如何做到的? 
  为什么 JetBrains 选择用 Java 开发 GUI? 
  学习java开发,应该重视哪些部分? 
  网站如何升级成https的? 
  如何看待阿里巴巴Java开发程序员孤尽觉得Java是世界上最好的语言? 
  为什么程序代码被编译成机器码就不能跨平台运行? 

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





© 2024-05-20 - tinynew.org. All Rights Reserved.
© 2024-05-20 - tinynew.org. 保留所有权利