34、Java 中有了基本数据类型,为什么还需要有包装类型?包装类型是啥?

article/2025/8/19 1:41:44

文章目录

  • 一、引入(基本数据类型弊端)
  • 二、包装类
    • (1) 模拟包装类的实现
    • (2) 包装类(Wrapper Class)
    • (3) 自动装箱、自动拆箱
      • ① 自动装箱
      • ② 自动拆箱
  • 三、整数类型包装类细节 ☆

一、引入(基本数据类型弊端)

📜 对比引用类型,基本类型(byte、short、int、float、boolean …)有一些缺陷

✒️ 无法表示不存在的值(null值)

在这里插入图片描述

✏️ 假如你开了一家🏨酒店,你想统计一周的盈利💰情况(如:星期一赚💯万、星期二亏10万 …),你会怎么做 ?

✏️ 假如用基本数据类型,您可能会如下图哪样干:

在这里插入图片描述

✏️ 上图:用一个可存放7个int类型元素的数组存放盈利额。100 是盈利100万、-10 是亏损10万元。这样可以表达出酒店一周的亏损值,但如何表达星期二没有开门呢
✏️ 用数字【0】来表达: 有歧义,数字【0】也可能表达的含义是【开门了,但一个客人都没有,一点钱都没赚,也一点钱都没有亏】
✏️ 此时基本数据类型的弊端就显现了,无法表示不存在的值(null 值)


✒️基本类型的操作不够面向对象(比如用基本类型调方法)

二、包装类

📕 Java platform provides wrapper classes for each of the primitive data types. These classes “wrap” the primitive in an object.

✏️ Java 为每一个基本数据类型提供了包装类型。包装类型是对基本数据类型的封装(把基本数据类型包装为引用对象【】)


(1) 模拟包装类的实现

把基本数据类型 int 包装为引用类型:

/*** @author 庆医* @describe 把基本类型 int 包装为引用类型*/
public class Integer_ {// primitive 原始的(基本类型)private int primitive;public Integer_(int primitive) {this.primitive = primitive;}/*** 返回基本类型的值*/public int getPrimitive() {return primitive;}
}

使用自定义包装类型表达一周的盈利情况:

public class TestDemo {public static void main(String[] args) {/* 无法表达不存在的值 */// int[] weekMoney = {100, -10, 5, 123, -3, 12, 22};/* 使用包装类型 */Integer_[] weekMoney = {new Integer_(100),null, // 星期二没有开门new Integer_(5),new Integer_(123),new Integer_(-3),new Integer_(12),new Integer_(22),};/* 打印一周的亏损情况和开门情况 */for (int i = 0; i < weekMoney.length; i++) {if (weekMoney[i] == null) {System.out.println("周" + (i + 1) + ": 没有开门");continue;}int primitive = weekMoney[i].getPrimitive();System.out.println("周" + (i + 1) + ": " + primitive);}}
}

在这里插入图片描述

(2) 包装类(Wrapper Class)

✏️ Java 的java.lang包中内置了基本类型的包装类
✏️ Java 的数字类型 (byte、short、int、long、float、double) 的包装类最终都继承自抽象类java.lang.Number
✏️ char 的包装类是 Character
✏️ boolean 的包装类是 Boolean

在这里插入图片描述
在这里插入图片描述

(3) 自动装箱、自动拆箱

① 自动装箱

在这里插入图片描述

✏️ 自动装箱:Java 编译器会自动调用包装类型的 valueOf 方法,把基本类型转换为相对应的包装类型
自动装箱:

public class TestDemo {public static void main(String[] args) {// Integer i = Integer.valueOf(11);Integer i = 11;// add(Integer.valueOf(22));add(22);}private static void add(Integer n) {}
}

在这里插入图片描述

⭐️ 整数类型(Byte、Short、Integer、Long) 的包装类的valueOf方法的底层会有缓存的操作(缓存常用的数字的包装类型)


② 自动拆箱

在这里插入图片描述

✏️ 自动拆箱:Java 编译器会自动调用包装类型的 xxxValue 方法,把包装类型转换为相对应的基本类型

public class TestDemo {public static void main(String[] args) {Integer i1 = 88;// class java.lang.IntegerSystem.out.println(i1.getClass());// int i2 = i1.intValue();int i2 = i1;// System.out.println(i1.intValue() == 88);System.out.println(i1 == 88); // output: true// 自动装箱Integer[] ints = {11, 22, 33, 44};int result = 0;for (Integer i : ints) {// if(i.intValue() % 2 == 0)if (i % 2 == 0) {// result += i.intValue();result += i;}}System.out.println(result);}
}

public class TestDemo {public static void main(String[] args) {// 自动装箱// Object n = Integer.valueOf(12);Object n = 12;}
}

三、整数类型包装类细节 ☆

🖊 包装类的判等不要使用 ==!=,而应该用 equals 方法

public class TestDemo {public static void main(String[] args) {Integer n1 = 88;Integer n2 = 88;Integer n3 = 888;Integer n4 = 888;System.out.println(n1 == n2); // true// n3 和 n4 比较的是地址值(n3 和 n4 不是同一个对象)System.out.println(n3 == n4); // falseSystem.out.println(n1.equals(n2)); // trueSystem.out.println(n3.equals(n4)); // true}
}

在这里插入图片描述

⭐️ 【整数类型】的包装类的 valueOf 方法不是直接创建一个包装类对象
⭐️ 会有缓存的操作(上图是 Integer 类的 valueOf 方法的底层)


public class TestDemo {public static void main(String[] args) {Integer i1 = 88;Integer i2 = Integer.valueOf(88);Integer i3 = new Integer(88);// trueSystem.out.println(i1 == i2);// falseSystem.out.println(i1 == i3);}
}

结束,如有错误,请不吝赐教!


http://chatgpt.dhexx.cn/article/5o8gvCkq.shtml

相关文章

包装类和基本类型

什么是包装类 所谓包装类&#xff0c;就是能够直接将简单类型的变量表示为一个类&#xff0c;在执行变量类型的相互转换时&#xff0c;我们会大量使用这些包装类。 包装类 包装类有以下用途 1.集合不允许存放基本数据类型&#xff0c;故常用包装类 2.包含了每种基本类型的相…

包装类型和基本类型

包装类型和基本类型 Java中有八种基本数据类型&#xff0c;分别对应着八大包装类型&#xff0c;因为包装类型的实例都存在于堆中&#xff0c;所以包装类型也称为引用类型。 基本类型属于原始数据类型&#xff0c;变量中存储的就是原始值。包装类型属于引用数据类型&#xff0…

Java 的八大基本类型及其包装类型(超级详细)

Java 中有八种内置的基本数据类型&#xff0c;他们分别是 byte、short、int、long、float、double、char 和 boolean&#xff0c;其中&#xff0c;byte、short、int 和 long 都是用来表示整数&#xff0c;float 和 double 是用来表示浮点数的&#xff0c;那它们之间有什么区别和…

Java 八大包装类(超详细!)

一、8种基本数据类型对应的包装类型名 基本数据类型包装类型bytejava.lang.Byte&#xff08;父类Number&#xff09;shortjava.lang.Short&#xff08;父类Number&#xff09;intjava.lang.Integer&#xff08;父类Number&#xff09;longjava.lang.Long&#xff08;父类Numbe…

关于InnoDB的读写锁类型以及加锁方式

&#xff08;本文为了方便&#xff0c;英文关键词都都采用小写方式&#xff0c;相关知识点会简单介绍&#xff0c;争取做到可以独立阅读&#xff09; 文章开始我会先介绍本文需要的知识点如下&#xff1a; innodb的主键索引&#xff08;一级索引&#xff09;和二级索引&#x…

C++线程中的几类锁

C线程中的几类锁 多线程中的锁主要有五类&#xff1a;互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言&#xff0c;所得功能与性能成反比。而且我们一般不使用递归锁&#xff08;C提供std::recursive_mutex&#xff09;&#xff0c;这里不做介绍。 互斥锁 互斥锁用于控制多…

Oracle - 锁

锁概念 锁出现在数据共享的环境中&#xff0c;它是一种机制&#xff0c;在访问相同资源时&#xff0c;可以防止事务之间的破坏性交互。例如&#xff0c;在多个会话同时操作某表时&#xff0c;优先操作的会话需要对其锁定。 事务的分离性要求当前事务不能影响其他的事务&#…

用友数据库错误“未能读取并闩锁页(1:3355)(用闩锁类型SH)”修复

客户硬盘无法识别&#xff0c;检测后&#xff0c;硬盘有坏道&#xff0c;由于数据库正在坏道上&#xff0c;所以恢复出来的用友数据库无法附加。 通过无日志附加后&#xff0c;做DBCC检测数据库出现以下错误&#xff1a; “消息8966&#xff0c;级别16&#xff0c;状态1&#x…

Mysql中锁的类型有哪些?

Mysql中锁的类型有哪些&#xff1f; 1. 基于锁的属性分类&#xff1a;共享锁、排他锁2. 基于锁的粒度分类&#xff1a;行级锁&#xff08;INNODB&#xff09;、表级锁&#xff08;INNODB、MYISAM&#xff09;、页级锁&#xff08;BDB引擎&#xff09;、记录锁、间隙锁、临键锁。…

mysql 常见锁的类型(一)

文章目录 一、锁的分类1.1 加锁的目的1.2 锁的类别 二、乐观锁和悲观锁2.1. 乐观锁2.2. 悲观锁&#xff1a; 三、共享锁与排他锁四、表锁五、意向锁六、行级锁七、记录锁&#xff08;Record Locks&#xff09;八、间隙锁&#xff08;Gap Locks&#xff09;九、临键锁&#xff0…

MySQL-InnoDB常用锁类型解析

Shared&#xff08;乐观锁&#xff09; and Exclusive Locks&#xff08;互斥锁&#xff09;&#xff1a; InnoDB有两种锁类型&#xff0c;Shared&#xff08;s&#xff09; and Exclusive&#xff08;x&#xff09; Locks&#xff08;乐观锁和互斥锁&#xff09;。 Shared&…

MySql InnoDB锁类型

MySql InnoDB锁类型 从类型上来分类&#xff0c;InnoDB存储引擎实现了两种标准的锁 共享锁(S-Lock)&#xff1a;允许事务读一行数据 排它锁(X-Lock)&#xff1a;允许事务删除或者更新一行数据 如果一个事务获取了S锁&#xff0c;那么其他事务也可以立即获得S锁&#xff0c;…

锁的分类总结

锁的分类是从不同角度去看的。同一个锁也可以同时属于多种类型。 一、乐观锁与悲观锁 1. 互斥同步锁的劣势 阻塞和唤醒会带来性能的劣势 用户态和核心态切换上下文切换检查是否有被阻塞线程需要被唤醒等等 可能出现永久阻塞的问题&#xff1a;持有锁的线程永久阻塞了&#…

锁的介绍和分类(轻量级锁 重量级锁 偏向锁 自旋锁 互斥锁)

目录 公平锁 非公平锁 非公平锁 公平锁 可重入锁 不可重入锁 可重入锁&#xff08;递归锁&#xff09; 不可重入锁 轻量级锁 重量级锁 偏向锁 重量级锁 自旋锁(循环上锁) 轻量级锁 轻量级锁的释放 偏向锁 自旋锁和互斥锁 自旋锁 互斥锁 为何要使用自旋锁 自旋…

最全锁种类

你可能听说过很多锁&#xff0c;也看到过很多文章讲解锁&#xff0c;这篇我在这里将对锁的不同分类进行描述锁的设计 互斥锁–共享锁 互斥锁&#xff1a;顾名思义&#xff0c;就是互斥的&#xff0c;意思就是当前同步代码块只能被一个线程访问&#xff0c;sync、reentrantlock、…

锁的类型有哪些

锁的类型有哪些 基于锁的属性分类&#xff1a;共享锁、排他锁。 基于锁的粒度分类&#xff1a;行级锁(INNODB)、表级锁(INNODB、MYISAM)、页级锁(BDB引擎 )、记录锁、间隙锁、临键锁。 基于锁的状态分类&#xff1a;意向共享锁、意向排它锁 共享锁(Share Lock) 共享锁又称读锁&…

Kettle使用教程之Job使用

1、Kettle的Job使用十分简单&#xff0c;这里也只是演示比较简单的操作&#xff0c;创建Job 2、点击转换&#xff0c;然后点击浏览&#xff0c;选择转换对象 3、执行按钮&#xff0c;运行该转换 4、如果需要长期的进行定时转换&#xff0c;可以在Job中的start控件进行配置 转载…

Kettle使用教程之数据同步

Kettle使用教程之数据同步 数据模型原型如下&#xff1a; 1、表输入&#xff0c;针对最新的数据输入的表 2、目标表&#xff0c;需要更新的表 3、两个表都需要进行排序操作 4、合并&#xff0c;根据id进行合并 5、数据同步(包括更新、插入、删除) 6、点击运行&#xff0c;就可…

ETL开发工具KETTLE使用教程

Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新&#xff1a;kettle会自动对比用户设置的对比字段&#xff0c;若目标表不存在该字段&#xff0c;则新插入该条记录。若存在&#xff0c;则更新。 Kettle简介&#xff1a;Kettle是一款国外开源的ETL工具&#xff0…

ETL工具Kettle使用教程

Kettle使用教程之数据同步 数据同步标识字段 标志字段的值有4种&#xff0c;分别是&#xff1a; “Identical” : 关键字段在新旧数据源中都存在&#xff0c;且域值相同 “changed” : 关键字段在新旧数据源中都存在&#xff0c;但域值不同 “new” : 旧数据源中没有找到该…