等等与equals的区别

  • 前言
  • 代码一
  • 代码二
  • 总结

前言

我们都知道, == 是比较内存地址,equals是比较值

但是这种非常错误的一种观点

  • ==:比较基本数据类型的时候,比较的是值,引用数据类型比较的是地址(new的对象,==比较永远是false)
  • equals:属于Object类的方法,如果我们没有重写过equals方法,那么它就是 ==,但是字符串里面的equals被重写过了,比较的是值

代码一

/*** equals和等等的区别** @author:轻狂书生FS* @create: 2020-10-03-8:50*/
public class EqualsDemo {static class Person {private String name;public Person(String name) {this.name = name;}}public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("abc");System.out.println(s1 == s2);System.out.println(s1.equals(s2));Set<String> set1 = new HashSet<>();set1.add(s1);set1.add(s2);System.out.println(set1.size());System.out.println("==============");String s3 = "cbd";String s4 = "cbd";System.out.println(s3 == s4);System.out.println(s3.equals(s4));Set<String> set3 = new HashSet<>();set3.add(s3);set3.add(s3);System.out.println(set3.size());System.out.println("==============");Person person1 = new Person("abc");Person person2 = new Person("abc");System.out.println(person1 == person2);System.out.println(person1.equals(person2));Set<Person> set2 = new HashSet<>();set2.add(person1);set2.add(person2);System.out.println(set2.size());}
}

最后结果

false(==:如果是new出来的对象,比较的时候永远是false)
true:(字符串中的equals被重写过,比较的是值)
1:(HashSet底层是HashMap,HashMap内部是调用equals 和 HashCode,但是String内部的HashCode和equals也被复写)
==============
true(我们通过这种方式创建的会放在一个字符串常量池中,相同的字符串,会指向常量池中同一个对象,因此他们的地址是一样的)
true(字符串中的equals被重写过,比较的是值)
1
==============
false(==:如果是new出来的对象,比较的时候永远是false)
false(Person中的equals没有被重写,相当于等等)
2

代码二

String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
String str4 =  "xxx";
String str5 = "abc" + "xxx";
String str6 = s3 + s4;System.out.println("str1 == str2:" + (str1 == str2));
System.out.println("str1.equals(str2):" + (str1.equals(str2)));
System.out.println("str1 == str5:" + (str1 == str5));
System.out.println("str1 == str6:" + (str1 == str6));
System.out.println("str5 == str6:" + (str5 == str6));
System.out.println("str5.equals(str6):" + (str5.equals(str6)));
System.out.println("str1 == str6.intern():" + (str1 == str6.intern()));
System.out.println("str1 == str2.intern():" + (str1 == str2.intern()));

运行结果:

str1 == str2:false
str1.equals(str2):true
str1 == str5:false
str1 == str6:false
str5 == str6:false
str5.equals(str6):false
str1 == str6.intern():false
str1 == str2.intern():true

下面解释关于 intern方法

一句话,intern方法就是从常量池中获取对象
返回字符串对象的规范表示形式
字符串池最初为空,由类字符串私下维护
调用intern方法时,如果池中已包含由equals(Object)方法确定的与此String对象相等的字符串,则返回池中的字符串
否者,此字符串添加到池中,并返回对此字符串对象的引用
因此,对于任意两个字符串s和t,s.intern() == t.intern() 在且仅当 s.equals(t) 为 true时候,所有文字字符串和字符串值常量表达式都会被插入

总结

点赞+关注,谢谢

关于Java你不知道的那些事之等等与equals的区别相关推荐

  1. java 静态代码块_关于Java你不知道的那些事之代码块

    前言 普通代码块:在方法或语句中出现的{},就被称为代码块 静态代码块:静态代码块有且仅加载一次,也就是在这个类被加载至内存的时候 普通代码块和一般语句执行顺序由他们在代码中出现的次序决定,先出现先执 ...

  2. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

  3. 关于Java你不知道的那些事之Java注解和反射

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:轻 ...

  4. 关于Java你不知道的10件事

    转载自 关于Java你不知道的10件事 作为 Java 书呆子,比起实用技能,我们会对介绍 Java 和 JVM 的概念细节更感兴趣.因此我想推荐 Lukas Eder 在 jooq.org 发表的原 ...

  5. 关于系统架构你不知道的那些事-架构设计流程:评估和选择备选方案

    关于系统架构你不知道的那些事-架构设计流程:评估和选择备选方案 前言 架构设计第 3 步:评估和选择备选方案 评估和选择备选方案实战 备选方案 1:采用开源 Kafka 方案 备选方案 2:集群 + ...

  6. 关于系统架构你不知道的那些事-架构设计流程:设计备选方案

    关于系统架构你不知道的那些事-架构设计流程:设计备选方案 前言 架构设计第 2 步:设计备选方案 第一种常见的错误:设计最优秀的方案. 第二种常见的错误:只做一个方案. 第三种常见的错误:备选方案过于 ...

  7. 看完就会明白windows RT推出的原因、它和window 8到底有些什么区别、微软有什么战略企图--有关于微软Windows RT 你不知道的那些事

    关于微软Windows RT 你不知道的那些事 Microsoft与Windows这两个单词对于个人电脑用户而言可以说无人不知,最初的微软Windows系统仅是PC端为用户提供办公与生活的操作系统软件 ...

  8. Java 混淆那些事(五):ProGuard 其他的选项

    本文已授权微信公众号「玉刚说」独家发布. 这篇是我们「Java 混淆那些事」第五讲,其实通过前四篇大家已经能够写出正常的混淆规则了,这一篇是简单的介绍一下不怎么常用的一些命令,个人觉得重要的会单独拿出 ...

  9. 读研期间学计算机,你不知道的考研事之读研期间学习生活大揭秘(学习篇)

    随着各大院校考研复试的陆续进行,研究生招生阶段也逐渐进入尾声.接下来一批又一批努力而优秀的同学在经过备考.初试.复试的洗礼也将步入令人振奋的研究生阶段,开启人生的新篇章.这既是对于奋发拼搏精神的总结和 ...

最新文章

  1. Winform开发框架之插件化应用框架实现
  2. Linux疑难杂症解决方案100篇(二)-SHELL编程函数的定义及调用
  3. kafka高性能揭秘:顺序写和零拷贝
  4. HandlerThread用法
  5. eval函数 php_PHP的一句话木马代码和函数eval的简介
  6. 与计算机病毒相关的小故事,我和计算机病毒的故事2000字论文
  7. 超详细java中的ClassLoader详解
  8. 分布式系统设计之DB类(来自深空老大)
  9. char*转换为jstring
  10. linux 备份到云存储空间,Ubuntu 使用教程- 自动备份Ubuntu 14.04到Box云存储上
  11. [ExtJS] ExtJS颜色选择器
  12. verilog语法基础
  13. 汉化 工具 批量 自动化 批处理
  14. 华为S6720系列万兆交换机光模块解决方案
  15. c语言程序设计教程答案王晓云,【单选题】华人图灵奖获得者是( ) A. 吴恩达 B. 王小云 C. 姚期智 D. 杨振宁...
  16. Java Code Review 介绍
  17. mac 修改文件权限为777可读可写可执行
  18. warning incompatible implicit declaration of built-in function 'printf'
  19. eclips下第一个java程序 hello world!
  20. 深度学习benchmark汇总

热门文章

  1. 【record】1、FS-I6设置与对码
  2. NIUSHOP wap端广告页面设置
  3. 〖Python 数据库开发实战 - MySQL篇⑩〗- MySQL 中不同的数据类型
  4. 佛山计算机专业刁,计算机应用基础 高职计算机大类专业 刁爱军项目策划方案汇报 原始.pptx...
  5. c++ union学习
  6. Echarts地图实现闪动气泡,或者加载本地图片,改变颜色和symbolSize大小效果
  7. 计算机网络9 无线网络和移动网络
  8. python截取视频_python+ffmpeg截取视频段
  9. springmvc配置ssl_Spring Mvc和Spring Boot配置Tomcat支持Https
  10. Mac电脑SecureCRT安装步骤