关于Integer、 int、 String 的比较判别

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
Java中==比较的是两个对象是否是同一个引用(即比较内存地址)
equals 对于从写了equals方法的类来说是比较值,没有重写仍然比较地址;

Integer 和 int

public class IntegerAndString {
    @Test
    public void test1(){
        int i1=5;
        Integer i2=5;
        System.out.println(i1==i2); //true

        Integer i3=5;
        Integer i9=new Integer(5);
        Integer i4=new Integer(5);  
        System.out.println(i3==i4); //false
        System.out.println(i9==i4);//false


        Integer i5=20;
        Integer i6=20;
        System.out.println(i5==i6); //true

        Integer i7=129;
        Integer i8=129;
        System.out.println(i7==i8); //false

        int a=new Integer(10);
        Integer b=10;
        System.out.println(a==b);//true
    }

int (是面向对象的残留) 当int 和Integer 数据类型进行比较时Integer会进行自动拆箱操作,所以只会比较实际的值,所以i1==i2 a==b

Integer是int的封装类,一般来说基础变量(int)赋值给Integer对象将自动装箱(Auto Boxing)并为Integer对象分配堆空间。因此即使基础变量值一样,封装类对象指向不同地址

当用Integer i=new Integer(6)创建对象时则是在堆区从新划分一个内存空间,把地址给i,所以i4==i9是false

由于因为JDK 的自动装箱操作可以用Integer i2=5来声明变量,Java在编译的时候会执行将代码封装成Integer i2=Integer.valueOf(5);通过查看源码发现

public static Integer valueOf(int i) {
        final int offset = 128;
        if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
        }
        return new Integer(i);
        }

也就是说这种方式声明一个Integer对象时,JVM首先会在Integer对象的缓存池中查找有木有值为20的对象,如果有直接返回该对象的引用;如果没有,则使用创建一个对象,并返回该对象的引用地址。),i5和i6都是引用的同一个对象结果为”true“ 且地址值都在常量池中,所以 i3==i4是false

而它维护的常量池从-128~127 当超出这个范围时就返回new Integer(129); 在堆区创建对象,返回地址值,所以i7==i8是false

String

public void test2(){
        String str1="hello";
        String str2="hello";
        System.out.println(str1==str2); //true

        String str3=new String("hello");
        System.out.println(str1==str3);//false

        String str4="ab";
        String str6="abc";
        String str5=str4+"c";
        System.out.println(str6==str5);//false

        String s1="a"+"b"+"c";
        String s2="abc";
        System.out.println(s1==s2);//true
        /*在java中有常量优化机制,byte=4+3 
         * (在编译时会判断将3+4=7在bytede 范围内)是对的,
         * 同理在编译时也变成了三个字符串abc
         * */
    }

String 的机制是String s=”hello” 创建对象时同样是现在常量池中找,若没有就创建,若有则返回地址引用,所以str1==str2

String str3=new String(“hello”),也会去常量池去找,没有就创建,创建完毕后会将这个字符串拷贝到堆区,在堆内存中再创建一个对象,然后将堆的地址返回 所以str3==str1是false

会先在常量池中创建str4和str6字符串对象,对于使用了+将变量str4和“c”相连接,首相会在堆区创建一个Stringbuffer对象,通过方法将其加在一起,产生一个地址值,然后调用它的toString方法转换成一个字符串并创建对象,产生一个地址值并返回,
内存图

Java面试 - StringInteger对象 == equals比较 问题汇总 == equals() == 它的作用是判断两个对象的地址是不是相等,即判断两个对象是不是同一个对象 基本数据类型比较的是值,引用数据类型比较的是地址 equals() 是判断两个对象是否相等,如果没有重写equals() 方法,就两个等号的意思是一样的 为什么要有hashcode? 为了减少equals()的比较次数,只要当hashcode相同的时候才会进行equals()的比较,极大提高了效率 为什么重写了equals()后就要重写hashcode方法 如果不重写hashcode方法的话,两个 阅读详情

相关推荐

华为OD机试真题解析:德州扑克牌型比较算法与多语言实现

在算法面试与编程能力考察中,字符串处理、数据结构应用逻辑抽象是核心基础。其原理在于将现实世界的复杂规则转化为计算机可执行的判定逻辑,这体现了算法设计在解决实际问题中的技术价值。典型的应用场景包括游戏规则模拟、自动化决策系统以及在线评测系统中的编程题目。本文聚焦于华为OD机试中的一道高频真题——德州扑克牌型比较,深入探讨如何通过特征值编码分层判定的方法,高效实现牌型检测与比较。文中将详细解析字符串解析、频率统计、同牌型比较规则等关键算法步骤,并提供C++、Java、Python三种语言的工程实践代码,帮助

dianxi0949的博客 323

IntegerString比较解析

Integer在遇到运算符时会进行自动拆包。缓存存储的范围为-128~127 字符串缓存。package com.jvmtest; public class ZhiDongZhuangXiang { public static void main(String[] args) { Integer a=1;//Integer a = Integer.valueOf(1); Integ...

dhfzhishi的专栏 5178

PHP json_decode函数深度解析:参数、错误处理与性能优化实战

JSON作为现代Web开发中数据交换的核心格式,其解析与序列化是前后端交互的基础。在PHP生态中,json_decode函数是实现JSON到PHP数据结构转换的关键内置函数。其工作原理涉及字符串解码、类型映射内存管理,理解其内部机制对于保障数据处理的准确性安全性至关重要。该函数的技术价值在于其高效性灵活性,但不当使用易引发数据丢失、精度错误或安全漏洞。在实际应用场景中,尤其是在处理API接口、第三方数据集成或用户输入时,开发者需重点关注字符编码、大整数处理、递归深度控制及异常捕获。通过合理配置关联数组

weixin_30681121的博客 394

Java IntegerString比较操作

// [-128,127] 自动装箱(box),同值是同一个对象 Integer a = 1; Integer b = 1; System.out.println("i1:" + (a == b)); // true// 不在[-128,127]装箱的Integer,值相同也不是同一个对象 a= 128; b = 128; System.out.println("i2:" + (a == b));

huabinzheng的博客 3824

IntegerString等封装对象比对最好用equals方法

Integer为封装对象,比较大小不要用“==”,而要用equals 当然有时候发现用”==”也有效,如下面代码结果就是true Integer a=Integer.valueOf(127); Integer b=Integer.valueOf(127); System.out.println(a==b); 这个是由于Integer.valueOf方法中做了判断,当值小...

kongtiao5的专栏 966

Integer比较==String比较==总结

坑: Integer的值为-128-127之间的时候就会自动的从Integer的缓存(IntegerCache)中去取,如果超过这个范围就会新建一个Integer的对象。   所以a==b(a=10,b=10)为true,c==d(c=150,d=150)为false。 nteger的值为-128-127的时候用==会返回true 不再这个区间要用equals才会返回true ...

王侯将象的博客 2594

IntegerInMemory与StringInMemory

IntegerInMemory与StringInMemory IntegerInMemory 前言 首先基本思路是先了解Java包装类,(本文包装类主要以Integer为例进行说明),然后自动拆装箱, Java中的基本数据类型没有方法属性,而包装类就是为了使其拥有方法属性,实现对象化交互,且为了符合面向对象这个基本特征。 首先要知道:数值型包装类都继承至Number,而字符型布尔型...

weixin_43914278的博客 323

JavaInteger.parseInt()

今天写某字符串题过程无意中发现了 Integer.parseInt(); public static int parseInt(String s, int radix) throws NumberFormatException 好用之处,基本用法就是返回一个字符串参数等价的整型值 s :包含整数的 String 。 radix :使用的进制 注意这个方法在分析过程中是将字符串作为有符号的整型数来分析的,也就是说这个方法内置判别有没有符号,整个字符串是不是符合一个带(不带)

Bry'ce的博客 598

8. String to Integer (atoi)

Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input case

shulixu的博客 208

[leetcode] 8.String to Integer (atoi)

题目: Implement atoi to convert a string to an integer.Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input ca

u014673347的专栏 295

Java 面试(一)基础知识

  1、java中“==”equalshashCode的区别   操作符“==”:   专门用来比较两个变量的值是否相等,即用于比较变量所对应的内存中所存储的数值是否相同。比如比较两个基本类型的数据是否相等或两个引用变量是否指向同一个对象等,需要使用“==”。   equals方法:   是Java类层次中根类Object中定义的方法,也就是说每个类都继承了这个方法,一般都来比较...

weixin_30274627的博客 161

LeetCode 7. Reverse Integer ( C ) - Easy

同步发于 JuzerTech 网站,里面有我软、硬件学习的纪录与科技产品开箱,欢迎进去观看。 题目为给定一个整数 ( INT ) ,反转此整数 ( INT )。 题目与范例如下 Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1].

JuzerTech的博客 195

Leetcode 8. String to Integer (atoi) 字符串转换整数 (atoi)

Leetcode 8. String to Integer (atoi) 字符串转换整数 (atoi) 标签: Leetcode 题目地址:https://leetcode-cn.com/problems/string-to-integer-atoi/ 题目描述 请你来实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符...

CoderWangSon 294

【哈希】【中等】字母异位词分组

给你一个字符串数组,请你将组合在一起。可以按任意顺序返回结果列表。解释:在 strs 中没有字符串可以通过重新排列来形成 “bat”。字符串 “nat” “tan” 是字母异位词,因为它们可以重新排列以形成彼此。字符串 “ate” ,“eat” “tea” 是字母异位词,因为它们可以重新排列以形成彼此。

2301_81831660的博客 195

常用API

Math 包含执行基本数字运算的方法- Object 是类层次结构的根,每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类,换句话说,该类所具备的方法,所有类都会有一份1. BigDecimal是用来进行精确计算的 2. 创建BigDecimal的对象,构造方法使用参数类型为字符串的。3. 四则运算中的除法,如果除不尽请使用divide的三个参数的方法。包装一个对象中的原始类型 int 的值。数组的高级操作 二分查找 (理解)- 二分查找概述、冒泡排序 、快速排序、Arrays ..

MemoryTa的博客 290

Java核心知识点与面试技巧全解析

Java作为主流的面向对象编程语言,其核心机制包括JVM平台无关性、自动内存管理多线程并发控制。理解Java三大特性(封装、继承、多态)的实现原理,掌握集合框架与异常处理机制,是开发高性能应用的基础。在面试场景中,HashMap实现原理、JVM内存模型GC调优策略是高频考点。通过深入分析值传递与引用传递的本质区别,以及泛型类型擦除机制,可以帮助开发者避免常见编码错误。合理运用动态代理反射等高级特性,能够构建灵活可扩展的系统架构。

weixin_33922670的博客 375

C++联合体成员类型限制解析:从内存模型到std::variant实践

在C++编程中,联合体(union)作为一种内存共享的数据结构,其核心原理在于同一块内存区域在不同时刻可解释为不同类型的数据。这种设计带来了高效的内存复用,但也引入了对象生命周期管理的挑战:编译器无法自动确定何时调用特定成员的构造函数析构函数。为了解决这一问题,C++标准对联合体成员类型施加了严格限制,禁止包含非平凡构造析构的类型,以确保内存安全。从工程实践角度看,这一限制推动了两种主要解决方案:对于简单场景,可使用只包含平凡数据类型(如int、double)的联合体配合手动标签管理;对于复杂类型存储需

weixin_34241036的博客 377

【SystemVerilog验证】数据类型

SystemVerilog相比Verilog在数据结构方面有显著改进,主要包括: 增强的数据类型 引入双状态数据类型(bit, byte等)提升性能并减少内存消耗 新增logic类型解决reg/wire选择困惑 支持字符串(string)处理 灵活的数组类型 动态数组:运行时确定大小 队列:结合数组链表优点,支持高效增删 关联数组:稀疏存储,支持复杂索引 合并数组:紧凑存储,支持多种访问方式 结构化数据类型 结构体(struct)组织相关数据 联合体(union)实现多格式数据访问 枚举类型(enum)增

wuyufei_sun的博客 430

零基础玩转 ETL:利用数智教育数据集完成学生考勤数据分析

后续可增加按班级、月份维度统计,设置定时调度,实现考勤数据自动更新。拖拽“记录集连接”组件至画布中,创建“按照学生编号进行排序”排序记录组件到“记录集连接 1”组件的连接线,由于考勤记录数据不是按“学号”升序记录的,所以在进行记录关联前,也需要对数据进行排序。经过多表关联前期接入,数据中会包含大量与考勤统计无关的字段,需要对关联后的数据进行冗余字段移除,因为这些冗余字段不仅会增加数据处理的负担,还可能导致后续聚合、计算出现干扰,只有移除冗余字段,保留核心有用字段,才能提升处理效率,确保统计逻辑清晰。

2301_79726376的博客 1317
下一篇: 线程详解、多线程及安全问题
桥豆麻呆
博客等级 码龄9年 2粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值