数据类型分类

Java 中的数据类型有两类:

String

值类型

Java 语言提供了 8 种基本类型,大致分为 4 类

整数型

byte - 8 位。

short - 16 位。

int - 32 位。

long - 64 位,赋值时一般在数字后加上 l 或 L 。

浮点型

float - 32 位,直接赋值时必须在数字后加上 f 或 F 。

double - 64 位,赋值时一般在数字后加 d 或 D 。

字符型

char - 16 位,存储 Unicode 码,用单引号赋值。

布尔型

boolean - 只有 true 和 false 两个取值。

值类型和引用类型的区别

从概念方面来说

基本类型:变量名指向具体的数值。

引用类型:变量名指向存数据对象的内存地址。

从内存方面来说

基本类型:变量在声明之后,Java 就会立刻分配给他内存空间。

引用类型:它以特殊的方式(类似 C 指针)向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。

从使用方面来说

==equals

:point_right: 扩展阅读: Java 基本数据类型和引用类型

这篇文章对于基本数据类型和引用类型的内存存储讲述比较生动。

数据转换

Java 中,数据类型转换有两种方式:

自动换行

强制转换

自动转换

一般情况下,定义了某数据类型的变量,就不能再随意转换。但是 JAVA 允许用户对基本类型做 有限度 的类型转换。

如果符合以下条件,则 JAVA 将会自动做类型转换:

由小数据转换为大数据

显而易见的是,“小”数据类型的数值表示范围小于“大”数据类型的数值表示范围,即精度小于“大”数据类型。

所以,如果“大”数据向“小”数据转换,会丢失数据精度。比如:long 转为 int,则超出 int 表示范围的数据将会丢失,导致结果的不确定性。

反之,“小”数据向“大”数据转换,则不会存在数据丢失情况。由于这个原因,这种类型转换也称为 扩大转换 。

这些类型由“小”到“大”分别为:(byte,short,char) < int < long < float < double。

这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。

转换前后的数据类型要兼容

由于 boolean 类型只能存放 true 或 false,这与整数或字符是不兼容的,因此不可以做类型转换。

整型类型和浮点型进行计算后,结果会转为浮点类型

示例:

longx =30;floaty =14.3f;System.out.println("x/y = "+ x/y);

输出:

x/y = 1.9607843

可见 long 虽然精度大于 float 类型,但是结果为浮点数类型。

强制转换

在不符合自动转换条件时或者根据用户的需要,可以对数据类型做强制的转换。

强制转换使用括号 () 。

引用类型也可以使用强制转换。

示例:

float f =25.5f;intx = (int)f;System.out.println("x = "+ x);

装箱和拆箱

包装类、装箱、拆箱

Java 中为每一种基本数据类型提供了相应的包装类,如下:

Byte<->byteShort<->shortInteger <->intLong<->longFloat<->floatDouble<->doubleCharacter <->charBoolean<->boolean

引入包装类的目的就是:提供一种机制,使得 基本数据类型可以与引用类型互相转换 。

基本数据类型与包装类的转换被称为 装箱 和 拆箱 。

装箱 (boxing)是将值类型转换为引用类型。 例如: int 转 Integer

装箱过程是通过调用包装类的 valueOf 方法实现的。

拆箱 (unboxing)是将引用类型转换为值类型。 例如: Integer 转 int

拆箱过程是通过调用包装类的 xxxValue 方法实现的。(xxx 代表对应的基本数据类型)。

自动装箱、自动拆箱

基本数据(Primitive)型的自动装箱(boxing)拆箱(unboxing)自 JDK 5 开始提供的功能。

JDK 5 之前的形式:

Integer i1 =newInteger(10);// 非自动装箱

JDK 5 之后:

Integer i2 =10;//自动装箱

Java 对于自动装箱和拆箱的设计,依赖于一种叫做享元模式的设计模式(有兴趣的朋友可以去了解一下源码,这里不对设计模式展开详述)。

:point_right: 扩展阅读: 深入剖析 Java 中的装箱和拆箱

结合示例,一步步阐述装箱和拆箱原理。

装箱、拆箱的应用和注意点

装箱、拆箱应用场景

一种最普通的场景是:调用一个 含类型为 Object 参数的方法 ,该 Object 可支持任意类型(因为 Object 是所有类的父类),以便通用。当你需要将一个值类型(如 int)传入时,需要使用 Integer 装箱。

另一种用法是:一个 非泛型的容器 ,同样是为了保证通用,而将元素类型定义为 Object 。于是,要将值类型数据加入容器时,需要装箱。

当 == 运算符的两个操作,一个操作数是包装类,另一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。

示例:

Integer i1 =10;// 自动装箱Integer i2 =newInteger(10);// 非自动装箱Integer i3 = Integer.valueOf(10);// 非自动装箱inti4 =newInteger(10);// 自动拆箱inti5 = i2.intValue();// 非自动拆箱System.out.println("i1 = ["+ i1 +"]");System.out.println("i2 = ["+ i2 +"]");System.out.println("i3 = ["+ i3 +"]");System.out.println("i4 = ["+ i4 +"]");System.out.println("i5 = ["+ i5 +"]");System.out.println("i1 == i2 is ["+ (i1 == i2) +"]");System.out.println("i1 == i4 is ["+ (i1 == i4) +"]");// 自动拆箱// Output:// i1 = [10]// i2 = [10]// i3 = [10]// i4 = [10]// i5 = [10]// i1 == i2 is [false]// i1 == i4 is [true]

示例说明:

上面的例子,虽然简单,但却隐藏了自动装箱、拆箱和非自动装箱、拆箱的应用。从例子中可以看到,明明所有变量都初始化为数值 10 了,但为何会出现 i1 == i2 is [false 而 i1 == i4 is [true] ?

原因在于:

i1、i2 都是包装类,使用 == 时,Java 将它们当做两个对象,而非两个 int 值来比较,所以两个对象自然是不相等的。正确的比较操作应该使用 equals 方法。

i1 是包装类,i4 是基础数据类型,使用 == 时,Java 会将两个 i1 这个包装类对象自动拆箱为一个 int 值,再代入到 == 运算表达式中计算;最终,相当于两个 int 进行比较,由于值相同,所以结果相等。

装箱、拆箱应用注意点

装箱操作会创建对象,频繁的装箱操作会造成不必要的内存消耗,影响性能。所以 应该尽量避免装箱。

基础数据类型的比较操作使用 == ,包装类的比较操作使用 equals 方法。

小结

(1)Java 中的数据类型有两类:

值类型( byte 、 short 、 int 、 long 、 float 、 double 、 char 、 boolean )

引用类型(除值类型以外,都是引用类型,包括 String 、数组)

(2)Java 中,数据类型转换有两种方式:

自动换行

强制转换

强制转换使用括号 () 。

基础数据类型可以自动转换,转换原则如下:

由小数据转换为大数据

转换前后的数据类型要兼容

整型类型和浮点型进行计算后,结果会转为浮点类型

(3)包装类有如下种类:

Byte<->byteShort<->shortInteger <->intLong<->longFloat<->floatDouble<->doubleCharacter <->charBoolean<->boolean

(4)什么是装箱、拆箱

装箱 (boxing)是将值类型转换为引用类型。 例如: int 转 Integer

装箱过程是通过调用包装类的 valueOf 方法实现的。

拆箱 (unboxing)是将引用类型转换为值类型。 例如: Integer 转 int

拆箱过程是通过调用包装类的 xxxValue 方法实现的。(xxx 代表对应的基本数据类型)。

(5)装箱、拆箱的应用场景

Object

==

(6)装箱、拆箱的应用注意点

装箱操作会创建对象,频繁的装箱操作会造成不必要的内存消耗,影响性能。所以 应该尽量避免装箱。

基础数据类型的比较操作使用 == ,包装类的比较操作使用 equals 方法。

参考资料

Java 基本数据类型和引用类型

深入剖析 Java 中的装箱和拆箱

欢迎工作一到五年的Java工程师朋友们加入Java技术交流:697558955

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

深入理解 Java 基本数据类型相关推荐

  1. 深入理解Java原始数据类型和包装类关于==和equals的比较

    1.运算符 == 对于六大Java数值类原始数据类型,==比较的是数值 对于六大Java原始数据类型对应的包装类,==比较的是内存地址 2.equals() equals()方法只有对象才有,所以我们 ...

  2. java数据类型怎样理解_深入理解Java之数据类型

    一.概述 我们通过编程解决一个具体问题时,首先要做的工作是用各种"数据结构"表示问题中的实体对象,而后才能着手研究描述具体业务逻辑的算法.这也正印证了"程序 = 数据结构 ...

  3. [转载] Java内存管理-你真的理解Java中的数据类型吗(十)

    参考链接: Java中的字符串类String 1 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 推荐阅读 第一季 0.Java的线程安全.单例模式.JVM内存结构等知识 ...

  4. 理解Java自定义类作为数据类型——引用数据类型

    目录 说在前面的话 复现问题 引用数据类型的理解 总结 说在前面的话 前言:Java的数据类型按照类型可分为基本数据类型(byte.short.int.long.double.float.char.b ...

  5. mysql种编译码写在哪_深入理解Java虚拟机(程序编译与代码优化)

    对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就从虚拟机层面来看看虚拟机对我们所编写的代码采用了哪些优 ...

  6. 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析

    来自:好好学java 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这些知识之后,才能更好的进行Jvm调优或者更加深入的学习,本来这些知识是晦涩难懂的,所以希望能够 ...

  7. 深入理解 Java 注解

    本文内容基于 JDK8.注解是 JDK5 引入的,后续 JDK 版本扩展了一些内容,本文中没有明确指明版本的注解都是 JDK5 就已经支持的注解. :notebook: 本文已归档到:「blog」 : ...

  8. 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程

    许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存.CPU.缓存等予以说明.实际上,在实际的 ...

  9. 深入理解Java中的内存泄漏

    理解Java中的内存泄漏,我们首先要清楚Java中的内存区域分配问题和内存回收的问题本文将分为三大部分介绍这些内容. Java中的内存分配 Java中的内存区域主要分为线程共享的和线程私有的两大区域: ...

最新文章

  1. gin 优雅重启或停止
  2. 数据挖掘Apriori算法
  3. python filter函数_Python列表的8个实用技巧
  4. 课程上线 -“新手入门 : Windows Phone 8.1 开发”
  5. 春节礼品:iPhone 11 抱回家
  6. TIS教程04-客户端
  7. vue2实践揭秘pdf_《Vue2.0 实践揭秘》终于出版啦!
  8. python编程书籍资料整理大全
  9. 世界卫生组织高血压防治指南_建立对团队和组织的信任的指南
  10. 福建省计算机应用基础一级考试,福建省高等院校学生计算机一级考试大纲
  11. ArcGIS案例学习笔记_3_2_CAD数据导入建库
  12. AngularJS图片上传功能的实现
  13. Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
  14. 从零开始实现一个颜色选择器(原生JavaScript实现)
  15. 风险模型—VaR模型1
  16. 如何营造医院合理的组织文化和价值观?
  17. 用java生成二维码
  18. linux查询进程号是否存在启动脚本,Shell实现判断进程是否存在并重新启动脚本分享...
  19. 华夏幸福转让平安资管5.69%股份,价款合计42.03亿
  20. Android开发:隐藏和显示底部导航栏

热门文章

  1. Bromo-PEG4-acid,1393330-38-5,溴代-四聚乙二醇-羧酸的化学性质
  2. buu Reverse学习记录(19) [GWCTF 2019]pyre
  3. 在线怎么将pdf文件转换成word文档转换器
  4. 计算机台式硬件排名价格,CPU天梯图2018年1月最新版 台式电脑处理器天梯排行 (全文)...
  5. 信号处理之一阶RC低通滤波器宏指令实现(繁易触摸屏)
  6. Typora换行后消除格式
  7. 【折半查找判定树画法思路】
  8. UserWarning: Failed to load image Python extension: [WinError 126] 找不到指定的模块。 warn(f“Failed to load
  9. Java扑克牌洗牌代码
  10. 泛微-E8流程 审批人意见显示位置调整