Java为什么不把==转义兼容字符串equals?

walkuere 2016-09-19 09:30:33
感觉java的字符串==基本是没人用的,用起来肯定是字符串.equals
为什么不直接就把==解释为equals?
是不是可以DIY转义啊,怎么弄啊
...全文
912 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码禅诗 2016-10-29
  • 打赏
  • 举报
回复
单独对字符串来讲,用==取代equals是靠谱的,因为有字符串常量池的存在,==的比较有很大的不确定性,比较字符串一定是比较内容,比较内存地址毫无意义。但对于整个java来讲,就不行,有的时候就是要判断两个引用指向的是不是同一个对象,并且自己定义的类型怎么比较一定要重写equals方法,重写equals时有时还要考虑哈希表的效率,所以比起重写equals,在调用equals时写两个等号还是写六个字母实在无关紧要。
巷子里的鸟 2016-10-28
  • 打赏
  • 举报
回复
引用 18 楼 NewMoons 的回复:
按楼主的理解,equals方法可以禁用了(因为基本数据类型变量如int、boolean等只能用==)。 全部用==。编译器一看到是非基本数据类型的变量也就是对象使用==,就转义为equals执行,对吗? 谁能举个反例啊,必须比较对象引用的逻辑?
我来强行举个例子,比如说在数组线性表中跟踪一个对象位置。把一个对象加入线性表,用IndexOf找到该对象在线性表中的位置。经过一定操作后,再次寻找该对象位置。因为线性表可以添加相同对象,所以要使用==,用equals可能找到引用不同的对象。 只是强行举个例子,也许没什么实际意义。
JPF1024 2016-10-28
  • 打赏
  • 举报
回复
两个完全不一样的概念。 ==比较地址 equals比较内容。 而且有的数字比较用equals岂不是浪费了? 存在了这么多个版本,肯定是有道理的。。
NewMoons 2016-10-28
  • 打赏
  • 举报
回复
按楼主的理解,equals方法可以禁用了(因为基本数据类型变量如int、boolean等只能用==)。 全部用==。编译器一看到是非基本数据类型的变量也就是对象使用==,就转义为equals执行,对吗? 谁能举个反例啊,必须比较对象引用的逻辑?
walkuere 2016-10-27
  • 打赏
  • 举报
回复
引用 15 楼 qq_36525552 的回复:
equals() 默认就是 == ,但像String类 包装类 File类 Date类这些重写Object类的equals()方法,比较是两个对象的 ”实体内容"是否完全相同
==难道不是比较指针的地址?
朔北冥 2016-10-27
  • 打赏
  • 举报
回复
习惯上来收,自建类时都可以加上一个equals()的方法
qq_36525552 2016-10-26
  • 打赏
  • 举报
回复
equals() 默认就是 == ,但像String类 包装类 File类 Date类这些重写Object类的equals()方法,比较是两个对象的 ”实体内容"是否完全相同
walkuere 2016-10-25
  • 打赏
  • 举报
回复
引用 9 楼 weixin_34881029 的回复:
那你要判读是不是一个地址找谁哭去啊?
讲道理,如果有程序员来CSDN抱怨说:我想知道两个字符串地址是否相等,没有==的话该怎么写 第一反应肯定是:什么场合会有这种奇葩需求 可以用一个类似instanceof的,比如sameAddress或者封装一个内部的函数,来比较两个String是不是引用同一个地址 哪个程序员偶尔要用到的时候查一下 当然现在程序员基本都知道用equals也就稍微麻烦一些罢了。
walkuere 2016-10-25
  • 打赏
  • 举报
回复
我有另外一种猜测,因为String之后有一些扩展类比如StringBuffer StringBuilder,那么这些类之间的==大概就不太好定义,到底==是理解为字符串的内容相等还是一般对象的地址相等,所以索性大家辛苦一些,全部用equals解决,==就还是用作地址。 另外就是开发==转义可能些麻烦
网络咖啡 2016-10-25
  • 打赏
  • 举报
回复
估计是保留选择吧,让开发者可以选择是比较地址还是内容吧
自由自在_Yu 2016-10-25
  • 打赏
  • 举报
回复
判断两个字符串对应的地址是否相同,对应的地址保存在Java内存的栈中,指向同一个地址的两个字符串肯定比指向不同的地址要节省内存
bcsflilong 2016-10-25
  • 打赏
  • 举报
回复
引用 6 楼 lonrence 的回复:
==是运算符,equals是方法 运算符基本上是操作基本类型,equals对应对象引用。当然==也可以操作对象引用,比较的是地址值
顶一个
kiyoki 2016-09-24
  • 打赏
  • 举报
回复
你要想清楚了,假设 String a = null; String b = "xxxxxxx"; 如果把 a == b 强转成 a.equals(b) ,这是就抛 NullPointerException 没商量了
纵骑横飞 2016-09-24
  • 打赏
  • 举报
回复
那你要判读是不是一个地址找谁哭去啊?
  • 打赏
  • 举报
回复
==是运算符,equals是方法 运算符基本上是操作基本类型,equals对应对象引用。当然==也可以操作对象引用,比较的是地址值
逗泥丸的平方 2016-09-19
  • 打赏
  • 举报
回复
这个问题与其说是 == 的问题 倒不如说是 String的问题. java 的String机制本来就比较奇怪.
逗泥丸的平方 2016-09-19
  • 打赏
  • 举报
回复
引用 3 楼 bree06 的回复:
有想法. 其实java内部可以考虑操作符重载的, string对象的==可以实现equals. 字符串==的确是很少使用, 但是并不是完全不用, 估计设计者要考虑到少数使用==的情况.
java只重载了字符串的加号(其实也不好算是重载,更像是编译的时候做了一点小手脚). 运算符重载并不是什么好事情.. 双等号作为一个运算符,在java中的功能是不可取代的.而类是可以扩展的 我觉得java的想法应该是,如果你需要的话,就去自己重写equals,或者自己再去继承/扩展一个新的方法吧.
bree06 2016-09-19
  • 打赏
  • 举报
回复
有想法. 其实java内部可以考虑操作符重载的, string对象的==可以实现equals. 字符串==的确是很少使用, 但是并不是完全不用, 估计设计者要考虑到少数使用==的情况.
walkuere 2016-09-19
  • 打赏
  • 举报
回复
引用 3 楼 bree06 的回复:
有想法. 其实java内部可以考虑操作符重载的, string对象的==可以实现equals. 字符串==的确是很少使用, 但是并不是完全不用, 估计设计者要考虑到少数使用==的情况.
我觉得那些很少用的字符串==可以另外做一个类似instanceof的,sameObject函数,因为我可以说用==的场合和equals相比,人家十万分之一都没有,应该照顾大多数用equals的用户
soton_dolphin 2016-09-19
  • 打赏
  • 举报
回复
equals 默认就是用==比较引用得是不是一个对象, 只是String 类重写了这个方法来比较String的内容相等。
加载更多回复(1)

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧