1. 导读

JAVA中针对八种基本数据类型提供了相对应的包装类, 今天主要基于几个问题来分享下个人对于包装类的理解, 本期先分享下面两个问题:

.1 什么是包装类? 有了基本类型, 为什么还需要有包装类;

.2 包装类干了什么?

2. 什么包装类

众所周知, JAVA提供了八种基本类型, 同时也对这八种基本类型做了相应的封装, 形成了八种包装类:

table.jpg

其实void在JAVA也是一种数据类型, 也有对应的包装类Void, 只是我们无法对其进行操作, 也就没有放在上面的表格中了;

3. 为什么需要包装类

JAVA是面相对象的编程语言; 那么要理解面相对象, 首先需要知道这个对象是什么? 我的理解是:

.1 对象具有自己的属性以及行为;

.2 对象可以通过自己的行为或者动作向外界传递信息;

那么面相对象就是通过对象之间的信息交互来实现整个程序的功能; 而封装, 继承 和 多态是基于语言层面的约束;

有了面相对象编程的概念, 我们再来看为什么JAVA需要包装类;

.1 包装类在基本类型的基础上做了封装, 使其有了自身的行为; 那么有了行为有什么好处呢? 我们举个例子来说明:

封装类

通过int和Integer举例, 展示了基本类型和包装类型的判断和转String的区别:为什么达到同一个目的, 基本类型需要借助其他手段来实现; 而包装类却可以通过自身的动作达到, 这就是基本类型和包装类型的不同, 这也是面相过程与面相对象的区别: 面相过程需要自己实现需求, 面相对象则是调用目标对象对应的方法即可;

.2 初始化的不同: 未赋值时, 基本数据类型默认是0, 而封装类型默认是null; 当需要区分赋值与未赋值时, 封装类型就显得十分友好了; 比如在构建更新实体时, 有个字段是0, 就需要判断他的原始值是0还是需要更新成0; 而null则没有这种烦恼了;

.3 前面说过JAVA是面相对象的语言, 其很多设计都是针对对象来的, 比如HashMap的设计, 在插入时, 需要先调用插入key的Object::equals, 但是基本数据类型是没有行为的, 意味着基本数据类型无法作为HashMap的key; 如果没有封装类, 我们就无法实现用数值类型作为key了;

故而为何需要封装类?

.1 JAVA是面相对象的语言, 其语言设计初衷就需要"万物皆对象", 故需要对基本数据类型再次封装;

.2 JAVA内部很多实现需要调用对象相对应的动作, 而基本数据类型不是对象, 为了使用这些实现, 需要封装对象;

4. 包装类干了什么

这8个包装类大同小异, 我们以比较特殊的Integer来举例;

public final class Integer extends Number implements Comparable {

@Native public static final int MIN_VALUE = 0x80000000;

@Native public static final int MAX_VALUE = 0x7fffffff;

...

private final int value;

从上面的代码可看出, Integer的一些设计:

.1 Integer类是final的, 其底层存值的value也是final的; 这个设计和String是一样的, Integer也就是不可变的;

.2 Integer也设置了int相同的最大最小值, 因为Integer是基于int做的封装, 故而仍然存在溢出问题(当赋的值大于Integer.MAX_VALUE时, 发生溢出);

再来关注下Integer::equals, Integer重写了Object的equals方法:

public boolean equals(Object obj) {

if (obj instanceof Integer) {

return value == ((Integer)obj).intValue();

}

return false;

}

.1 如果传入对象是Integer类型的, 比较两者的value是相等;

.2 如果是非Integer类型的, 直接返回false;

.3 这里没有先比对两者的堆地址, 因为只有两者是同一个对象时才会直接返回true; 这个概率比较小(一般没人会自己比较自己吧), 所以直接省略了这一步;

继续关注Integer::hashCode的实现:

public static int hashCode(int value) {

return value;

}

Integer::hashCode直接返回了当前的值(hashCode返回的是个int类型的值, 直接返回Integer的值好像也没啥不对);

按这个逻辑, Long::hashCode是不是直接强转成int返回的呢? 因为精度问题, Long::hashCode做了特殊处理:

public static int hashCode(long value) {

return (int)(value ^ (value >>> 32));

}

Long::hashCode并不是如我们猜想的那样设计的:

.1 先把value右移32位, 因为long是64位的, 右移32位就把左边边的值都置为0了;

.2 再与原始值进行异或, 将得出的结果强转成int类型;

.3 至于为什么这么设计, 主要是以为int是32位的, 如果采用Integer::hashCode的方法, 那么当右边32位都是0时, 不管左边的32位是何值, 在转为int时, 左边32位都被摸除, 得出的结果都是0; 这样的方式显然会有很大的碰撞;

.4 故而Long::hashCode采用了低位32异或高位32的方式来获取hashCode;Double::hashCode的实现也是采用的这种方式;

Integer是实现了Compareable接口的, 我们来看下Integer::compareTo:

public static int compare(int x, int y) {

return (x < y) ? -1 : ((x == y) ? 0 : 1);

}

.1 使用了三目运算符; 第一层先判断是否小于, true则返回-1;

.2 第二层判断是否相等, true则返回0, 反之则返回1;

.3 如果两个Integer是相等的, 那么调用Integer::equals 和 Integer::compareTo的结果是一样的;

本期基于上面两个问题分享了个人对于封装类的理解, 如果上面有不当之处, 欢迎指正; 如果看了觉的有益处, 烦请点赞转发吧, 感谢;

java包装_Java基础之神奇的包装类(一)相关推荐

  1. 黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三)

    黑马程序员全套Java教程_Java基础教程_异常(含扩展)(二十三) 1.1 异常概述与异常体系结构 1.2 JVM遇到异常时的默认处理方案 1.3 异常处理 1.4 异常处理之try--catch ...

  2. java 必备_Java基础必备

    标签: 写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希 ...

  3. cmd运行java文件_Java基础 前传

    微信搜一搜秃然编程 一.关于MS-DOS MS-DOS(微软磁盘操作系统),是美国微软公司提供的磁盘操作系统.在美国微软公司推出Windows1.0.Windows3.0.1995年8月24日推出的操 ...

  4. java基本命令_java基础篇 快捷键 常见Dos命令等等

    (一) 计算机基础介绍 (二) jdk 安装 (三) 环境变量介绍及配置 (四) HelloWorld 实现 一 . 计算机概述 (1) 计算机 计算机(computer)俗称电脑,是一种用于高速计算 ...

  5. java包装_Java罐密封包装

    java包装 Java JAR provides option to seal the package. Java jar seal package means that if any program ...

  6. java嵌套循环_java基础之嵌套循环

    一. for循环双层嵌套 首先内层循环属于外层循环循环体的一部分,当循环体执行完以后外层循环才进入第二次循环,此过程中内层循环需要执行符合条件的完整循环.(外循环控制行数,内循环控制每一行的个数) f ...

  7. java三板斧_JAVA基础学习 三板斧

    JAVA基础学习 -1 三板斧 1. 引子 最近因为工作需要,开始学习JAVA,我之前常用的编程语言是C,C#,C++,基本没有用JAVA,JAVA需要从基础开始学习了. JAVA是从C++优化而来: ...

  8. java对象的包装_java中常见对象——基本包装类

    为了对基本数据类型进行更多的操作,更方便的操作,Java就针对每一种基本数据类型提供了对应的类类型.包装类类型: byte                         Byte short     ...

  9. java 类库_Java基础类库

    面向对象的核心-类和对象 类的语法定义 类的修饰符 static可以修饰变量和方法,称为类变量.类方法,它们属于类本身.不被static修饰的变量和方法称为实例变量.实例方法,属于类的实例. 在类准备 ...

最新文章

  1. 001_python单元测试
  2. c语言五子棋linux,在linux下ubuntu的五子棋游戏c语言代码.doc
  3. (61)分析 KiFindReadyThread 函数 —— 线程优先级
  4. react antd confirm content list_React造轮系列:对话框组件 - Dialog 思路
  5. 【渝粤教育】国家开放大学2018年春季 0599-21T工程造价管理基础理论与相关法规 参考试题
  6. 计算机术语中英文对照表(流水线/微架构/体系结构/指令集)
  7. 【转】Java 中正确使用 hashCode 和 equals 方法
  8. AD9导入CAD文件做封装外框
  9. 如何根据一张照片判断出女孩住在几层楼?
  10. 【第109期】那碗“我拒绝”的毒鸡汤,坑了多少游戏策划?
  11. HDU 4489 (DP递推计数)
  12. 城镇污水处理厂工艺概述及提标改造路线
  13. 数据集:大学毕业生收入
  14. 齐二TK6916/20/26/32系列数控落地铣镗床简介4
  15. python爬贴吧回复_Python爬虫——抓取贴吧帖子
  16. BLEU 评价 NLP 文本输出质量
  17. 【单线、双线以及多线如何区别】
  18. Java简单的计算器编程
  19. U盘被分区出EFI,格式化失败 win无法格式化
  20. MATLAB基于视频的人体姿态检测

热门文章

  1. 矩阵的卷积核运算(一个简单小例子的讲解)深度学习
  2. 将编译器pass添加到Relay
  3. Tengine MLOps概述
  4. 开放神经网络交换(ONNX)工具
  5. 空间点像素索引(一)
  6. 适配器(GenericServlet)改造Servlet
  7. 2021年大数据Kafka(二):❤️Kafka特点总结和架构❤️
  8. AttributeError: ‘NoneType‘ object has no attribute ‘span‘
  9. 0x开头的颜色值和#开头的颜色值的区别以及转化
  10. View requires API level 21 (current min is 15): Toolbar