百科问答小站 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 岗位面试,面试官最后说,你还有什么要问的吗? 
  if(x>y)和if(x-y>0)有没有区别(x,y都是int)? 
  为什么jdbc:Access的url需要三个///符号呢? 
  为什么很多程序员不用 switch,而是大量的 if...else if ...? 
  Java中 栈内存的存取速度仅次于寄存器,如何做到的? 
  为什么很多程序员不用 switch,而是大量的 if...else if ...? 
  C#在开源框架的数量和质量上有希望追上JAVA么? 
  怎样算是学好了 Java? 
  程序员如何快速上手一个自己不太熟悉的新项目?有什么技巧? 
  PHP 比 Java 的开发效率高在哪? 

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





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