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

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




  

相关话题

  自动注入到底比new好在哪? 
  现在(2021年)OSGi的发展前景如何? 
  为什么微软.NET,C#在美国,英国等国外都非常流行,而在国内却逐渐没落? 
  Spring Boot 是否很难用?为什么? 
  java中的关键字在哪定义的? 
  面向对象中,平行继承体系是否尽量完全抛弃? 
  Java 中的多态是不是违背了里氏替换原则? 
  Java 集合类库的顶层里的 Collection,List,Set 是抽象类的话是否更“正确”一些? 
  JAVA 学到什么水平就可以转战 Android 了? 
  如何评价去培训机构培训四个月后,月薪过万这种现象? 

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





© 2025-04-01 - tinynew.org. All Rights Reserved.
© 2025-04-01 - tinynew.org. 保留所有权利