Java面试——从JVM角度比较equals和==的区别

2023-11-19

1.  Java中数据类型分类

1.1    基本数据类型

又称为原始数据类型,byte,short,char,int,long,float,double,boolean,他们之间的比较该使用(==,比较的是他们的值

1.2    复合数据类型

当复合数据类型用(==)进行比较,比较的是他们在内存中的存放地址

当复合数据类型之间进行equals比较时这个方法的初始行为是比较对象在堆内存中的地址,但在一些诸如String,Integer,Date类中把Object中的这个方法覆盖了,作用被覆盖为比较内容是否相同

2.  String类的讨论

String s1 = "Hello";
String s2 = "Hello";
if (s1 == s2){
 System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}

输出:s1 == s2

说明:双等号在进行复合数据类型比较时,比较的是内存中的存放地址。因此s1s2引用同一个String对象。

String s1 = "Hello";
String s2 = new String("Hello");
if (s1 == s2){
System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}
if (s1.equals(s2)) {
System.out.println("s1 equals s2");
}else{
System.out.println("s1 not equals s2");
}

输出:
s1 != s2
s1 equals s2

说明:s1 s2分别引用了两个对象。显然,两者内容是相同的,因此equal返回true。第一个例子也一样。

我们接下来将详细讨论,为什么在上面两个例子中,s1s2出现了两种不同的指向对象的情况。

3.   解释

String str = new String("abc"); 
String str = "abc"; 

两种的形式来创建,第一种是用new()来新建对象的,那么这种情况的内存是怎么分配的呢,答案是在堆空间字符串常量池中。每调用一次就会在堆中创建一个新的对象,如果常量池中已经存在"abc",那么就不会额外在常量池中生成引用。因此这句话会产生一个或者两个对象

而第二种是先在常量池中创建一个对String类的对象引用变量str,然后查找常量池中有没有存放"abc",如果没有,则将"abc"存放并令str”abc”,如果已经有”abc”则直接令str指向“abc” 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。 具体可以查看此篇String、StringBuider以及StringBuffer的区别和使用场景

4.  String类的intern方法

String s1 = "Hello";
String s2 = new String("Hello");
s2 = s2.intern();
if (s1 == s2){
System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}
if (s1.equals(s2)) {
System.out.println("s1 equals s2");
}else{
System.out.println("s1 not equals s2");
}

程序输出:
s1 == s2
s1 equals s2

这次加入:s2 = s2.intern()java.lang.Stringintern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。但是这也仅仅是JDK1.6以及以前的过时的处理方法,如果想了解更全更清晰的intern()方法,请务必参考我的这篇博文Java技术——你真的了解String类的intern()方法吗

5.  为什么Java1000==1000false100==100true

Integer i1 = 100,i2 = 100;
System.out.println(i1==i2);
Integer i3 = 1000,i4 = 1000;
System.out.println(i3==i4);

查看Integer.java类,会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。

所以例子中i1i2指向了一个对象。因此100==100true

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java面试——从JVM角度比较equals和==的区别 的相关文章

随机推荐

  • 7.19 数据结构顺序表的增删改查

    1 完成顺序表的按值进行修改函数 调用listSearchValue seqList S datatype e 按值查找函数先判断值是否存在 不存在返回的 2则该函数返回 1 打印顺序表中没有要修改的元素 如果返回的不为 2 则遍历顺序表依
  • USB device和USB host

    USB 英文全称 Universal Serial Bus 即通用串行总线 常常各种USB芯片同时具有host和device两种接口 host就是主的 可以起控制作用 device slave 就是从 是被控制的 比如PC机的USB口 可以
  • fastcgi的环境变量

    FCGI ROLE RESPONDER SCRIPT FILENAME scripts 5 cgi QUERY STRING aaa 11111111111111 bbb 2222222222222222 ccc 3333333333333
  • Spring3.0纯注解开发-越是高端越简洁

    附 类也称为接口 接口的范围很广泛 注解开发和纯注解开发不同点 1 纯注解新增加注解 configuration springcongfig类表名配置类 component xx springcongfig类 扫包注解 Scope sing
  • 一个基于golang开发的博客系统--如何部署goblog

    GoBlog是一个基于GoLang Mysql Redis相关技术实现的简单个人博客 GoBlog在GinCMS的基础上开发了前端展示界面 下载地址 https sn9 us file 20193518 406730634 https sn
  • 【IDEA】Idea 中使用Lombok找不到其自动生成的方法 字符串超长 javac eclipse编译

    1 概述 今天要做测试 然后我拷贝了一个超长的字符串 然后运行的时候报错字符串超长 java常量字符串 允许的最大长度仅为65534 归根结底是javac的问题 本身和idea没关系 但也不是 点关系没有 按照此路径打开 办法如下 File
  • wikioi 2147 bitset+map解决

    题目描述 Description 小明是一名天文爱好者 他喜欢晚上看星星 这天 他从淘宝上买下来了一个高级望远镜 他十分开心 于是他晚上去操场上看星星 不同的星星发出不同的光 他的望远镜可以计算出观测到的星星发出的光的数值W 小明当然想尽可
  • 国外有python专业的大学_有哪些国外大学非常容易申请?

    我来说几个门槛相对来说很低的学校吧 请注意 这里说的是相对他们的QS排名相当的其他学校 这所学校好进一些 1 天堂模式 澳洲八大除墨尔本 澳大利亚国立大学作为和香港大学 东京大学 加州伯克利 洛桑联邦理工学院排名相当的大学 录取门槛甚至远不
  • 系统内核升级回滚

    查看当前版本 root test app 45 92 uname r 3 10 0 1160 15 2 el7 x86 64 环境的不同 可能查下的内核会有所不同 操作步骤 本案例主要以4 4 234 1 el7 elrepo x86 64
  • LLaMA开源语言模型泄漏版下载

    Meta Facebook 开源语言模型LLaMA泄漏版国内网盘下载 该语言模型据说是比openAI的ChatGPT能力更强的 虽说是开源语言模型 但如果想要直接使用 还是需要通过Edu教育邮箱来申请资格的 得到批复邮件之后 可以做为科学研
  • pandas 数据导出为csv Excel格式

    import pandas as pd string to show exporting data to csv df to csv filepath or buffer path to story to sep column separa
  • 月薪1000到游戏创业赚百万,程序员到自媒体达人,他是怎么做到的?

    深圳雷哥 一位8年游戏开发经验的程序员游戏创业赚了百万从程序员转战自媒体写作与职场教练目前副业每月收入高达4K全网粉丝2 万 预计年底破5万下面来听听雷哥的传奇故事 希望对大家有所启发和帮助 01 我的学生时代 我叫雷巍 今年32岁 来自湖
  • 一位毕业生的自我分享

    活动地址 毕业季 进击的技术er 1 毕业后的去向 继续读研还是直接就业 我的大学是一个普通二本 学的是物联网工程专业 二本院校大家也都知道 是考研的主力军 我的很多同学从大二开始就决定考研了 而我从大二就决定毕业直接就业 他们考研的原因也
  • ESP32cam系列教程001:使用webcam摄像头实时查看视频

    文章目录 1 ESP32cam 介绍 2 arduino IDE 2 1 安装 arduino IDE 2 2 arduino IDE 获取 ESP32 开发环境 3 内网视频实时查看 3 1 选择 文件 gt 示例 gt ESP32 gt
  • LeetCode每日刷题:多数元素

    题目 给定一个大小为 n 的数组 找到其中的多数元素 多数元素是指在数组中出现次数 大于 n 2 的元素 你可以假设数组是非空的 并且给定的数组总是存在多数元素 解题思路 通过Hashmap的方法来解答 通过Hashmap来统计每个元素的个
  • HbuilderX运行uni-app开发的微信小程序

    HbuilderX运行uni app开发的微信小程序 Hbuilder下载地址 https www dcloud io hbuilderx html 当咱们创建了个uni app项目后 将整个项目用HbuilderX打开 记住一定是项目的根
  • BLE Mesh中广播包类型Mesh Beacon、Mesh Message、PB-ADV,以及代理的PB-GATT

    在BLE Mesh中常用于数据通信的几种方式 Mesh Beacon Mesh Message PB ADV PB GATT 前三种是广播类型 最后一种是基于代理走BLE连接的一种数据通信 广播包种类 广播包类型 Mesh Beacon 0
  • Python3,为了无损压缩gif动图,我不得不写了一个压缩神器,真香。

    gif动图无损压缩 1 引言 2 代码实战 2 1 模块介绍 2 2 安装 2 3 代码示例 3 总结 1 引言 小屌丝 鱼哥 求助 求助 求助 小鱼 你这是告诉我 重要的事情 说三遍吗 小屌丝 你可以这么理解 小鱼 好吧 什么事情 这么慌
  • Java获取当前时间前3分钟

    获取当前时间前3分钟 param stuff return public String getCurrentTime SimpleDateFormat sdf new SimpleDateFormat yyyy MM dd HH mm ss
  • Java面试——从JVM角度比较equals和==的区别

    1 Java中数据类型分类 1 1 基本数据类型 又称为原始数据类型 byte short char int long float double boolean 他们之间的比较应该使用 比较的是他们的值 1 2 复合数据类型 当复合数据类型