[Java 基础]数据类型

基本类型和引用类型

Java中的数据类型有两类:

l 基本类型(又叫内置数据类型,或理解为值类型)

l 引用类型

基本类型和引用类型的区别

1. 从概念方面来说

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

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

2. 从内存构建方面来说

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

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

3. 从使用方面来说

基本类型:使用时需要赋具体值,判断时使用“==”号

引用类型:使用时可以赋null,判断时使用equals方法

Java 基本类型

​Java的每种基本类型所占存储空间的大小是固定的。它们的大小不像其他大多数语言那样随机器硬件架构的变化而变化。这种不变性是Java程序相对其他大多数语言而言,更容易移植的原因之一。

所有数值类型都有正负号,所以不要去寻找无符号的数值类型。

基本类型的分类

与绝大多数编程语言类似,Java也支持数值型、字符型、布尔型数据。

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

整数型

byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。

short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。

int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。

long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。

浮点型

float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。

double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。

字符型

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

布尔型

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

基本类型取值范围表

例:对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。

publicclass PrimitiveDemo  {      publicstaticvoid main(String[] args) {          // byte          System.out.printf("基本类型:byte 二进制位数:%d\n", Byte.SIZE);          System.out.printf("包装类:%s\n", Byte.class.getName());          System.out.printf("最小值(Byte.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Byte.MIN_VALUE,  Byte.MIN_VALUE);          System.out.printf("最大值(Byte.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Byte.MAX_VALUE,  Byte.MAX_VALUE);            // short          System.out.printf("基本类型:short 二进制位数:%d\n", Short.SIZE);          System.out.printf("包装类:%s\n", Short.class.getName());          System.out.printf("最小值(Short.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Short.MIN_VALUE,  Short.MIN_VALUE);          System.out.printf("最大值(Short.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Short.MAX_VALUE,  Short.MAX_VALUE);            // int          System.out.printf("基本类型:int 二进制位数:%d\n", Integer.SIZE);          System.out.printf("包装类:%s\n", Integer.class.getName());          System.out.printf("最小值(Integer.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Integer.MIN_VALUE,  Integer.MIN_VALUE);          System.out.printf("最大值(Integer.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Integer.MAX_VALUE,  Integer.MAX_VALUE);            // long          System.out.printf("基本类型:long 二进制位数:%d\n", Long.SIZE);          System.out.printf("包装类:%s\n", Long.class.getName());          System.out.printf("最小值(Long.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Long.MIN_VALUE,  Long.MIN_VALUE);          System.out.printf("最大值(Long.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Long.MAX_VALUE,  Long.MAX_VALUE);            // float          System.out.printf("基本类型:float 二进制位数:%d\n", Float.SIZE);          System.out.printf("包装类:%s\n", Float.class.getName());          System.out.printf("最小值(Float.MIN_VALUE): %s\n", Float.toString(Float.MIN_VALUE));          System.out.printf("最大值(Float.MAX_VALUE): %s\n\n", Float.toString(Float.MAX_VALUE));            // double          System.out.printf("基本类型:double 二进制位数:%d\n", Double.SIZE);          System.out.printf("包装类:%s\n", Double.class.getName());          System.out.printf("最小值(Double.MIN_VALUE): %s\n", Double.toString(Double.MIN_VALUE));          System.out.printf("最大值(Double.MAX_VALUE): %s\n\n", Double.toString(Double.MAX_VALUE));            // char          System.out.printf("基本类型:char 二进制位数:%d\n", Character.SIZE);          System.out.printf("包装类:%s\n", Character.class.getName());          System.out.printf("最小值(Character.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", (int)  Character.MIN_VALUE, (int) Character.MIN_VALUE);          System.out.printf("最大值(Character.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", (int)  Character.MAX_VALUE, (int) Character.MAX_VALUE);      } }

输出:

基本类型:byte 二进制位数:8 包装类:java.lang.Byte 最小值(Byte.MIN_VALUE):  0x80(十六进制), -128(十进制) 最大值(Byte.MAX_VALUE):  0x7f(十六进制), 127(十进制)   基本类型:short 二进制位数:16 包装类:java.lang.Short 最小值(Short.MIN_VALUE):  0x8000(十六进制), -32768(十进制) 最大值(Short.MAX_VALUE):  0x7fff(十六进制), 32767(十进制)   基本类型:int 二进制位数:32 包装类:java.lang.Integer 最小值(Integer.MIN_VALUE):  0x80000000(十六进制), -2147483648(十进制) 最大值(Integer.MAX_VALUE):  0x7fffffff(十六进制), 2147483647(十进制)   基本类型:long 二进制位数:64 包装类:java.lang.Long 最小值(Long.MIN_VALUE):  0x8000000000000000(十六进制),  -9223372036854775808(十进制) 最大值(Long.MAX_VALUE):  0x7fffffffffffffff(十六进制),  9223372036854775807(十进制)   基本类型:float 二进制位数:32 包装类:java.lang.Float 最小值(Float.MIN_VALUE):  1.4E-45 最大值(Float.MAX_VALUE):  3.4028235E38   基本类型:double 二进制位数:64 包装类:java.lang.Double 最小值(Double.MIN_VALUE):  4.9E-324 最大值(Double.MAX_VALUE):  1.7976931348623157E308   基本类型:char 二进制位数:16 包装类:java.lang.Character 最小值(Character.MIN_VALUE):  0x0(十六进制), 0(十进制) 最大值(Character.MAX_VALUE):  0xffff(十六进制), 65535(十进制)

数据类型间的转换

自动转换

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

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

(1)由“小”数据转换为“大”数据

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

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

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

这些类型由“小”到“大”分别为:(byteshortchar)< int < long < float < double

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

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

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

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

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

运行结果

x/y = 1.9607843

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

强制转换

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

转换方式为:在数值的前面用一个括号"()"把要强制转换的类型标注出来。

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

装箱和拆箱

Java中基本类型的包装类如下:

Byte <-> byte

Short <-> short

Integer <-> int

Long <-> long

Float <-> float

Double <-> double

Character <-> char

Boolean <-> boolean

装箱

装箱是将值类型转换为引用类型

例:

Integer i1 = new Integer(10); // 非自动装箱 Integer i2 = 10; // 自动装箱 System.out.println("i1 = " + i1); System.out.println("i2 = " + i2);

拆箱

拆箱是将引用类型转换为值类型

int i1 = new Integer(10); // 自动拆箱 Integer tmp = new Integer(20); int i2 = tmp.intValue(); // 非自动拆箱 System.out.println("i1 = " + i1); System.out.println("i2 = " + i2);

为何需要装箱

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

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

自动装箱、自动拆箱

基本数据(Primitive)类型的自动装箱(boxing)、拆箱(unboxing)是自Java SE5开始提供的功能。

Java SE5之前的形式:

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

Java SE5之后:

Integer i2 = 10; // 自动装箱

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏尾尾部落

普林斯顿大学算法公开课笔记——插入排序

现有一组数组 arr = [5, 6, 3, 1, 8, 7, 2, 4],共有八个记录,排序过程如下:

1051
来自专栏武培轩的专栏

Leetcode#88. Merge Sorted Array(合并两个有序数组)

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

992
来自专栏木子昭的博客

JavaScript 原始数据类型转换

Js基础数据类型有7种: 原始数据类型(6种) number (数值) string (字符串) boolean (布尔) null (空对象, typeo...

1932
来自专栏用户画像

7.3.2 快速排序

快速排序是对冒泡排序的改进。其基本思想是基于分治法:在待排序L[1...n]中任取一个元素privot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1....

593
来自专栏编程理解

排序算法(五):堆排序

的时间复杂度即可将二叉树重新调整为有序状态。若构造出一种具有特殊节点顺序的二叉树,使得每次对二叉树执行插入或删除节点操作后,都调整保持二叉树根节点的值为树中节...

972
来自专栏小樱的经验随笔

【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸

多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的。同理...

3145
来自专栏猿人谷

二维数组的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否...

1885
来自专栏尾尾部落

[剑指offer] 链表中倒数第k个结点 [剑指offer] 链表中倒数第k个结点

经典的双指针法。定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个...

882
来自专栏海天一树

图的深度优先搜索

图有两种最基本的搜索算法,一种是深度优先搜索,另一种是广度优先搜索。本节先介绍深度优先搜索。

642
来自专栏Python疯子

数据分析之numpy

ndarray概述 创建n维数组 接收的是列表类型,所有元素类型必须相同 shape表示各维度大小的元组 dtype表示数组数据类型对象

1071

扫码关注云+社区