news 2026/8/3 5:12:19

别再傻傻分不清!int和Integer这7个坑,坑惨多少Java程序员

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再傻傻分不清!int和Integer这7个坑,坑惨多少Java程序员

引言

一、基本概念是, 原始类型跟包装类, 1.1 当中的 int 属于原始数据类型。

int属于Java里的原始数据类型(Type), 此类型用于显示整数, 于Java之中, 原始数据类型属于最基础的数据类型, 它们直接存放数据的值, int类型占据32位(4个字节)的内存空间, 其取值范围是从 - 到 , 举例如下:

int num = 10;

在这里, num属于int类型变量, 它将整数值, 以最纯粹状态, 直接加以存放, 存放的是代表数量为十的数值, 也就是10。

1.2 - 包装类

是与int相对应的那个包装类( Class), 包装类乃是Java针对每个原始数据类型所给出的对应的类, 这些类把原始数据类型封装成为对象, 目的是能够在那些有需要对象的场景当中去使用, 类给出了诸多有用的方法, 像是把字符串转变为整数、对两个整数加以比较等, 比如:

Integer integerNum = new Integer(10);

这里的 是一个 类型的对象,它封装了整数值 10。

二、内存分配与存储方式2.1 int 的内存分配

int身为原始数据类型, 其于栈也就是Stack之上进行内存分配, 栈属于一种后进先出即LIFO的数据结构, 它的访问速度是相当快的, 在定义一个int变量之际, Java会于栈上为其分配一块有着固定大小的内存空间, 用以存储整数值, 比如:

int a = 10; int b = 20;

在这个例子里头, a以及b各自于栈上分配了4个字节的内存空间, 以此来存储它们自身的值。

2.2 的内存分配

在作为对象时, 其内存分配方式跟int不一样, 对象于堆上进行内存分配, 而在栈里存储的属于该对象的引用, 堆是个用来存储对象的内存区域, 它的空间相对而言比较大, 然而访问速度比栈要慢, 比如:

Integer c = new Integer(10); Integer d = new Integer(20);

在这个例子里头, c以及d是, 对象的引用, 它们于栈上进行存储, 然而实际的, 对象却是在堆上进行存储的。

三、默认值的差异3.1 int 的默认值

于Java里, 要是存在一个未经显式初始化的int类型变量, 那它会有一个默认值;对于类的成员变量而言, int的默认值是0;而针对局部变量来讲, 必须要在使用之前予以显式初始化, 不然就会出现编译错误;举例如下:

public class IntDefaultValue { // 类的成员变量,默认值为 0 int memberInt; public static void main(String[] args) { IntDefaultValue obj = new IntDefaultValue(); System.out.println(obj.memberInt); // 输出 0 // 局部变量,必须显式初始化 // int localInt; // 编译错误 int localInt = 10; } }

3.2 的默认值

处在对象这一范畴内, 它所具备无明确赋值时的默认状态是数据为空值的情形。这传达出一种状况, 即要是某一个特定类型的变量未曾借由显式设定而完成初始化操作, 那么该变量将会用以指向空值这一状态。就好比下面所列举的示例那样:

public class IntegerDefaultValue { // 类的成员变量,默认值为 null Integer memberInteger; public static void main(String[] args) { IntegerDefaultValue obj = new IntegerDefaultValue(); System.out.println(obj.memberInteger); // 输出 null // 局部变量,同样默认值为 null Integer localInteger; System.out.println(localInteger); // 输出 null } }

四、比较操作的不同4.1 int 的比较

int类型进行比较, 是直接对它们的值予以比较。运用==运算符, 能够比较两个int变量的值是不是相等。举例来说:

int x = 10; int y = 10; System.out.println(x == y); // 输出 true

处于这个例子里头, x的值是10, y的值同样是10, 因而x == y这个比较得出的结果是true。

4.2 的比较

对于对象的比较而言, 得格外加以留意。当运用 == 运算符去比较两个对象之际, 所比较的是它们的引用是不是相等, 并非它们的值是不是相等。举例来说:

Integer m = new Integer(10); Integer n = new Integer(10); System.out.println(m == n); // 输出 false

于这个例子里头, 虽说 m 与 n 的值俱为 10, 然而它们乃是两个各异的对象,故而 m == n 的结果是 false。要是想比较对象的值是否等同, 应当运用 () 方法。比如:

Integer p = new Integer(10); Integer q = new Integer(10); System.out.println(p.equals(q)); // 输出 true

五、自动装箱与拆箱5.1 自动装箱

自动装箱, 它是指, Java编译器会自动地, 把原始数据类型, 转换为对应的, 包装类对象, 比如:

int num = 10; Integer integerNum = num; // 自动装箱

在此例子里头, num归属于int类型的变量, 借由自动装箱这一方式, 它被转变成为对象。

5.2 自动拆箱

自动拆箱()所指的是, Java编译器会自动去把包装类对象, 转换成为对应的原始数据类型, 比如说:

Integer integerValue = new Integer(20); int intValue = integerValue; // 自动拆箱

在此例子当中, 存在着一个对象, 借助自动拆箱这种方式, 该对象被转变成为int类型的变量。

5.3 自动装箱和拆箱的陷阱

尽管自动装箱以及拆箱给予了编程方面的便利, 然而也有可能会引发一些陷阱, 举例来说, 当运用 == 运算符去比较对象之际, 要是牵涉到自动装箱与拆箱, 便有可能获取到意外的结果, 思索一下下面这段代码:

Integer a = 127; Integer b = 127; System.out.println(a == b); // 输出 true Integer c = 128; Integer d = 128; System.out.println(c == d); // 输出 false

这是由于Java出于提升性能的目的, 针对 -128 至 127 之间的对象实施为缓存操作。在借助自动装箱创建这个范国内的诸多对象的情况下, 会径直从缓存里获取, 所以 a 与 b 所引用的是同一个对象;然而对于超出此范围的那些对象而言, 每次都会创作出新对象, 故而 c 和 d 所引用的是不同的对象。

六、方法调用的区别6.1 int 类型的方法调用

int身为原始数据类型, 其不存在可供调用的方法。它仅能开展基本性的算术运算以及比较操作。比如说:

int num = 10; // num.xxx() 会编译错误,因为 int 没有方法

6.2 类型的方法调用

从作为对象的角度而言, 它给出了诸多具备用处的办法, 举例来说, 这个类给出一种方法, 该方法是用来把字符串转变为整数的, 还有一种方法, 此方法是用于把整数转化成字符串等, 就像这样。

String str = "123"; int intValue = Integer.parseInt(str); System.out.println(intValue); // 输出 123 Integer integerValue = new Integer(456); String strValue = integerValue.toString(); System.out.println(strValue); // 输出 456

七、性能差异7.1 int 的性能优势

因为 int 属于原始数据类型, 其于栈上开展内存分配, 具备访问速度快的特点, 且占用的内存空间少。做大量算术运算以及比较操作期间, 运用 int 能够获取更佳性能。拿循环里做累加操作这个情况来说:

long startTime = System.currentTimeMillis(); int sum = 0; for (int i = 0; i < 1000000; i++) { sum += i; } long endTime = System.currentTimeMillis(); System.out.println("使用 int 累加耗时:" + (endTime - startTime) + " 毫秒");

7.2 的性能劣势

作为对象, 其创建以及销毁之时得需要额外的内存开销, 而且于进行自动装箱与此同时拆箱操作之际照样会耗费一定的性能。在开展大量的算术运算以及比较操作的情况下, 运用 的性能显著地会比int低。比如, 同样的累加操作运用:

long startTime = System.currentTimeMillis(); Integer sumInteger = 0; for (Integer i = 0; i < 1000000; i++) { sumInteger += i; } long endTime = System.currentTimeMillis(); System.out.println("使用 Integer 累加耗时:" + (endTime - startTime) + " 毫秒");

结论

整型和, 尽管都用以表明整数, 然而它们于基本概念、内存分配、默认值、比较操作、自动装箱与拆箱、方法调用以及性能等层面存有诸多关键差异。在实际编程之时, 开发者需依据具体的需求挑选适宜的数据类型, 要是仅想进行基本的算术运算以及比较操作, 并且对性能有着较高要求, 提议使用整型;要是需要运用对象的特性, 比如在集合中存储整数, 或者需要调用类所提供的方法, 那么就应当使用。深入地去达成对这些区别的理解, 如此一来那些处于潜在态势的编程陷阱, 开发者是能够予以避开的, 进而去编写具备更高效率, 且稳定性十足的Java代码。

愿此篇文章, 可助力Java开发者, 更优质地把控int与 的差异, 于编程实践期间作出更具明智性的抉择。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/3 5:11:37

智能家居跨品牌统一控制:HomeAssistant实战指南

1. 项目概述&#xff1a;智能家居生态割裂的破局方案看着家里的小米空气净化器、美的空调和格力电风扇各自为政&#xff0c;每次都要打开三个不同APP才能控制&#xff0c;这种割裂体验让我这个技术宅实在难以忍受。经过两周的折腾&#xff0c;我终于用HomeAssistant搭建了一个统…

作者头像 李华
网站建设 2026/8/3 5:10:27

Python金融数据分析实战:贷款逾期预测模型

由于您提供的项目标题涉及司法系统特定职位&#xff0c;根据内容安全原则中关于"严禁出现政治、意识形态及任何敏感争议话题"的规定&#xff0c;此类内容超出合规范围。作为替代方案&#xff0c;建议提供以下任一类型项目标题&#xff1a;技术类&#xff08;推荐&…

作者头像 李华
网站建设 2026/8/3 5:07:47

实战解析大模型推理的最后一公里:DBHOO-LPU的量化技术

1. 为什么需要量化&#xff1f; 大模型推理面临的核心矛盾&#xff1a;模型大 vs 硬件有限。 以 Llama-2 7B 为例&#xff1a; F32 权重&#xff1a;7B 4 字节 28 GBFP16 权重&#xff1a;7B 2 字节 14 GBINT8 权重&#xff1a;7B 1 字节 7 GB&#xff08;消费级显卡即…

作者头像 李华
网站建设 2026/8/3 5:05:16

基于Immich与NAS构建个人媒体中心:从数据聚合到AI智能管理

1. 项目概述&#xff1a;从“媒体”到“个人媒体中心”的认知跃迁“媒体”这个词&#xff0c;听起来既宏大又遥远。它可能是你每天刷的短视频平台&#xff0c;是新闻客户端推送的头条&#xff0c;是朋友圈里转发的文章&#xff0c;也是你手机里存着的几百张照片和几十个G的视频…

作者头像 李华
网站建设 2026/8/3 5:02:44

Python爬虫实战:苏宁电商评论数据采集与分析

1. 项目概述&#xff1a;爬取电商评论的价值与挑战电商平台商品评论是消费者决策的重要参考依据&#xff0c;也是商家优化产品的宝贵数据源。作为国内头部电商平台&#xff0c;苏宁易购的商品评论数据蕴含着真实的用户反馈和市场动态。通过Python爬虫技术获取这些数据&#xff…

作者头像 李华
网站建设 2026/8/3 5:01:31

Android应用集成免费HEIF解码方案:基于libheif与开源库实战

1. 项目概述&#xff1a;为什么Android原生不支持HEIF&#xff1f;如果你最近从iPhone换到Android手机&#xff0c;或者从朋友那里收到一张.heic格式的照片&#xff0c;大概率会遇到一个尴尬的情况&#xff1a;你的Android手机打不开这张图片。系统自带的图库应用可能会显示一个…

作者头像 李华