12从零开始学Java之详解必须掌握的数据类型

Source

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦

CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

在上一篇文章中,壹哥给大家讲解了Java中变量的定义、使用及基本原理等内容,这个内容并不是很难,但却是我们走向Java大神的第一步!壹哥希望你从第一天就要认真对待哦。

在前面讲解变量时,壹哥给大家提到了数据类型的概念。比如我们见到并使用了第一个数据类型--整型,那么在Java中还有没有别的数据类型呢?这些数据类型都有什么特点?该怎么用?今天这篇文章,壹哥就会给大家讲解数据类型相关的内容。

-----------------------------前戏已做完,精彩即开始----------------------------

全文大约【5800字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图视频,让你更好的理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

一. 数据类型

1. 简介

有些初学者可能不太理解,数据就数据呗,为啥数据还要有类型?

在计算机程序中,其实会有非常多需要我们处理的数据,那么计算机底层是如何对这些数据进行处理的呢?举个栗子,假如现在有个大型的仓库用来堆放双十一期间的各种快递。我们不可能把所有的快递一股脑的都堆放在一起,肯定需要分类存放,蔬菜放一块,服装放一块,玩具放一块......这样才能最大程度地利用空间,而且也更容易查找货物。

放到计算机程序中也是一样的道理。计算机程序里有海量的数据,我们也需要把这些不同的数据归类管理。把不同类型的数据,在内存中开辟出专有的存储空间进行存放,数据类型不同,开辟的内存大小也就不同!这就是数据类型的由来!那么Java中都有哪些具体的数据类型呢?我们继续往下看。

2. 分类

Java中的数据类型总体可以分为两大类,分别是基本类型和引用类型,如下图所示:

从上图可以看出,Java中的数据类型整体是2大类:基本数据类型和引用数据类型,其中基本数据类型有3种8个子类,引用类型有3种接下来壹哥就给大家分别介绍一下这几种数据类型都有哪些特点。

二. 数据存储单位

在开始讲解Java的数据类型之前,壹哥有必要先给大家简单说说计算机中的数据存储单位有哪些,以及这些单位大小之间的关系,因为接下来我们在学习数据类型时会涉及到这些内容。

1. 位bit

很多小伙伴可能都知道,计算机进行数据处理时,无论处理的是什么数据,最终都要把这些数据转换成“0”和“1”这样的二进制数据。在计算机中,一个二进制的逻辑“0”或者逻辑“1”,就是1位(bit)。所以位(bit)是计算机中最基本,也是最小的数据存储单位,每一个位(bit)可以存储一个1位的二进制码比如“01010001”就是8位的二进制码,该二进制码就需要占用8位的存储空间。

2. 字节Byte

字节(Byte,B)是计算机中处理数据的基本单位,一个字节由8位(bit)组成,即8位组成一个单元,1B=8bit。

3. 字word

字(word)是计算机数据存储和处理运算的单位,代表着计算机处理指令或数据的二进制位数。但是一个字到底占多数个字节,却不是固定的。因为字的大小,跟计算机系统的架构方案有关系,不同的计算机架构方案,字的长度是不同的。32位的计算机与64位的计算机,字的大小往往不同。32位计算机:1字=4字节=32位;64位计算机:1字=8字节=64位。

4. 其他存储单位

对于现在的计算机来说,数据是海量的。如果用位、字节、字这样的单位来表示数据,数据就会显得太长了,就好比你用“分”来表述现在咱们国家的GDP,合适吗?所以除了上面这3个最基本的数据存储单位,计算机中还有其他一些常见的存储单位,比如:

KB:早期用的软盘有360KB和720KB的,不过现在软盘已经很少使用。1KB=1024B
MB:早期计算机的内存有128MB、256MB、512MB,现在的内存都是8GB、16GB甚至更大。1MB=1024KB
GB:早期计算机的硬盘有60GB、80GB,目前都是500GB、1TB甚至更大。1GB=1024MB
TB:目前个人计算机的存储容量基本就是使用这个级别。1TB=1024GB
PB:目前大型服务器的存储容量可以使用这个级别。1PB=1024TB
其他单位......

在对上面这些内容有了基本的了解之后,壹哥开始给大家分别介绍这些数据类型都是怎么回事。

三. 基本数据类型

1. 简介

所谓的基本数据类型,是指CPU可以直接进行运算的类型,包括以下几种:

整数型 :byte、short、int、long;
浮点型 :float、double;
字符型 :char;
布尔型 :boolean

2. 整数型

2.1 byte

byte是字节类型,1个byte占8位,代表有符号的、以二进制补码表示的整数,具有如下特点:

最小值是 -128(-2^7)
最大值是 127(2^7-1)
默认值是 0
byte 类型比较节约空间,因为 byte 变量占用的空间只有 int 类型的四分之一。
/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {

    public static void main(String[] args) {
        // 定义byte类型的变量
        // byte b = 10;
        // byte b = 127;
         byte b = -128;
         System.out.println(b);

        //注意:如下定义,在编译阶段就会出错
        //byte b = 128;
        //System.out.println(b);
    }
}

注意:

因为byte的取值范围在-128~127之间,如果我们定义byte变量的值=128,就超过了byte的范围,所以在编译阶段就会出错,“Type mismatch: cannot convert from int to byte”,意思是“类型不匹配:无法从byte转为int”,如下图所示:

2.2 short

short 是短整型,占16 位,代表有符号的、以二进制补码表示的整数,具有如下特点:

最小值是 -32768(-2^15);
最大值是 32767(2^15 - 1);
默认值是 0;
short 数据类型也可以像 byte 那样节省空间,一个short变量是int型变量所占空间的二分之一。
/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {
    public static void main(String[] args) {
        //定义short类型的变量
        //short s = 128;
        short s = 12800;
        System.out.println(s);
    }
}

2.3 int

int 是整型,占32位,代表有符号的、以二进制补码表示的整数,如有如下特点:

最小值是 -2,147,483,648(-2^31);
最大值是 2,147,483,647(2^31 - 1);
默认值是 0 ;
我们在开发时,一般都是用int表示整型变量。
/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {
    public static void main(String[] args) {    
        //定义int类型的变量
        int i = 100000; 
        System.out.println(i);
    }
}

2.4 long

long 是长整型,占64 位,代表有符号的、以二进制补码表示的整数,如有如下特点:

最小值是 -9,223,372,036,854,775,808(-2^63);
最大值是 9,223,372,036,854,775,807(2^63 -1);
默认值是 0L,"L"理论上不区分大小写,但若写成小写的"l",容易与数字"1"混淆,不容易分辩,所以最好写成大写的“L”;
该类型主要用在需要较大数值的场景中。
/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {
    public static void main(String[] args) {    
        //定义long类型的变量,后面要带L或l(不是1,也不是i)
        long l = 364748123123L; 
        System.out.println(l);
    }
}

2.5 补充说明

Java中只定义了带符号的整型,因此最高位的bit表示正负符号,0表示正数,1表示负数,如:

1(十进制) = 0000 0001(二进制);
127(十进制) = 0111 1111(二进制);
-128(十进制) = 1000 0000(二进制)

关于二进制及进制间的转换、原码、反码、补码等内容,壹哥会在后面再单独讲解!

3. 浮点型

浮点数可表示的范围非常大,float类型可最大表示3.4x1038,而double类型可最大表示1.79x10308。

3.1 float

float 是单精度的浮点类型,占32位,是符合IEEE 754标准的浮点数,具有如下特点:

float 在储存大型浮点数组时,可以节省内存空间;
默认值是 0.0f,"f"理论上不区分大小写;
float浮点数不能用来表示精确的值,如不能用float来表示货币等。
/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {
    public static void main(String[] args) {    
        //定义float类型的变量,后面带F或f
        float f = 10.2F;
        //float f = 3.14e38f; // 科学计数法表示的3.14x10^38
        System.out.println(f);

        float f1 = 9999.9994f;
        System.out.println(f1);
    }
}

3.2 double

double 是双精度的浮点类型,占64 位,是符合 IEEE 754 标准的浮点数,具有如下特点:

浮点数的默认类型为 double 类型;
默认值是 0.0d,"d"理论上不区分大小写;
double类型同样不能表示精确的值,如货币。
/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {
    public static void main(String[] args) {    
        //定义double类型的变量,后面可以带D或d,也可以不带
        double d = 10d;
        //double d = 4.9e-324; // 科学计数法表示的4.9x10^-324
        System.out.println(d);

        double d1 = 12345678910111213.0;
        System.out.println(d1);
    }
}

3.3 补充说明

float和double的最小值和最大值都是以科学记数法的形式输出的结尾的"E+数字"表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14 × 103=3140,3.14E-3 就是 3.14 x 10-3 =0.00314。

4. 字符型

4.1 字符的特点

char是一种表示字符的类型。Java的char类型除了可以表示标准的ASCII,还可以表示一个Unicode字符,代表一个单一的16位 Unicode 字符,具有如下特点:

最小值是 \u0000(十进制等效值为 0);
最大值是 \uffff(即为 65535);
char 数据类型可以储存任何字符。

4.2 字符的三种表现形式

在java中,字符和字符串是两种不同的数据类型。char类型使用单引号''表示,单引号里面只能有一个字符。字符串用双引号""表示,双引号中可以有很多字符字符有三种表现形式:

字符 'a' 、'中';
数字 97、20;
十六进制 '\u0041'。

4.3 代码案例

/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {
    public static void main(String[] args) {    
        //定义字符型,字符带有英文的''
        char c1 = '中';
        char c2 = 20013;
        char c3 = '\u0041';
        //单引号中只能有一个字符!
        //char c4 = '中国';

        System.out.println(c1);//中
        System.out.println(c2);//中
        System.out.println(c3);//A
    }
}

大家要注意,单引号''中只能有一个字符,否则会出现如下错误:”Invalid character constant“,无效的字符常量!

4.4 转义字符

在上面的代码案例中,我们可以看到有些字符的前面带有反斜杠(\),这个反斜杠其实也是一个字符,它是一种转义字符,对编译器来说有着特殊的含义。下表展示了Java中常用的几个转义字符含义:

转义序列

描述

\t

在该处插入一个tab键

\b

在该处插入一个后退键

\n

在该处插入换行符

\r

在该处插入回车符

\f

在该处插入换页符

\'

在该处插入单引号

\"

在该处插入双引号

\\

在该处插入反斜杠

当然,除了以上转义字符之外,还有一些其他的转义字符,我们以后在代码中用到时再进行单独说明。

5. 布尔型

boolean是布尔类型,该类型只表示一位信息,布尔类型是关系运算的计算结果,具有如下特点:

布尔类型只有两个值:true 和 false;
默认值是 false;
该类型一般是作为一种标志,来记录 true/false 的情况。
/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {
    public static void main(String[] args) {    
        //boolean类型,真假(一般用条件判断),true false
        //boolean flag = true;
        boolean flag = false;
        System.out.println(flag);
        
        int age = 12;
        boolean isAdult = age >= 18; // 计算结果为false
        System.out.println(isAdult);
    }
}

Java对布尔类型的存储范围并没有做明确的规定,理论上存储布尔类型只需要占1 bit,但通常JVM内部会把boolean表示成4个字节整数,后面在6.3节中对此会有单独说明!

6. 取值范围

6.1 范围对比

我们在讲解8种基本类型时,大家会发现,不同的类型大小不同,也就是它们有不同的取值范围。接下来壹哥给大家总结一下这几种不同类型的取值范围。

类型

所占字节(byte)

所占位数(bit)

取值范围

byte

1

8

-2^7 ~ 2^7-1

short

2

16

-2^15 ~2^15-1

int

4

32

-2^31 ~ 2^31-1

long

8

64

-2^63 ~ 2^63-1

char

2字节

16位

0~65535

float

4字节

32位

±3.4E+38

double

8字节

64位

±1.7E+308

boolean

详见下面6.3节描述

详见下面6.3节描述

true\false

6.2 原理剖析

有的初学者可能不理解,为什么不同数据类型的取值范围大小不一样?比如同样都是整数,为什么有的范围大有的范围小?壹哥简单给大家举个例子。计算机的每个内存单元,都有自己的内存地址,一般都是从0开始编号。而每个内存单元都可以看作是一个房间,房间有大有小,并且房间的类型不同,有的是大床房,有的是标间,有的是总统套房。另外内存地址就是房间的门牌号,方便我们找到对应的房间。

不同的数据类型之所以取值范围不同,就好比每种类型都是不同的房型,有大有小,如下图所示:

这些不同的类型,占用的字节大小不同,所以取值范围自然也不一样。

6.3 boolean类型补充说明

在上面6.1小节中,关于boolean类型所占的字节大小,壹哥在表格中并没有说明。这是因为根据官方文档描述,boolean类型经过编译之后采用int来定义(所以此时boolean占4字节,32bits),但如果是boolean数组则占1字节(8 bits)详见下图红色标注:

7. 关于void

实际上,java中还有另外一种基本类型 void,它也有对应的包装类 java.lang.Void。但我们无法对它们直接进行操作,所以一般不把它们当做基本类型对待。

8. 包装类型

虽然Java是面向对象的语言,但为了方便我们开发,在Java中继续沿用了C语言的基本数据类型。我们在进行常规的数据计算时,可以直接使用基本类型。但因为基本数据类型不具备面向对象的行为特征,不能通过方法的形式进行调用,且基本类型也不能存入到Java的集合中。所以后来Java提供了与基本类型对应的8个包装类,使其具有了对象的属性和方法。基本类型与其对应的包装类如下表所示:

关于包装类和面向对象的特征,以及基本类型与包装类型的区别,壹哥今天先不讲,后面我会再细说!

9. 转义字符

9.1 概念

所有的ASCII码都可以用"\"加数字(一般是8进制数字)来表示。Java中定义了一些字母前加"\"来表示特殊含义的字符,如\0、\t、\n等,这些都被称为转义字符(Escape Character),它们可以用来转变某个字符原有的含义。

9.2 案例

大家要注意,我们在开发时会用到两种斜线,包括“/”和“\”。其中 “/” 斜线(slash)又称为forward slash (前斜线),原本是一种标点符号。“\”则是后斜线,在Java中作为转义字符,常见的组合如下:

\n:表示换行;
\b:表示退格;
\r:表示回车;
\":表示双引号;
\':表示单引号;
\\:表示反斜线;
\':表示单引号;
\t:表示tab制表;
\f:表示走纸换页;
/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {
    public static void main(String[] args) {    
        //常见转义字符:\n 表示换行;\t表示制表位
        
        //转义字符:\t,可以空4格;\n,可以换下一行;
        System.out.println("hello\tworld");
        System.out.println("hello\nworld");

        //转义字符,\"",输出中文的“”
        System.out.println("你\"真棒\"");        

        //转义字符:默认情况下,斜杠是不能单独输出使用的,需要加一个转义字符才能输出。
        System.out.println("D:\\a\\b");
    }
}

效果如下图所示:

9.3 常用转义字符

以下是一些常用的转义字符供大家参考使用。

9.4 转义字符配套视频

转义字符的配套视频链接如下:

https://player.bilibili.com/player.html?bvid=BV1FK4y1x7Ny&p=12&page=12

四. 引用数据类型

1. 简介

在Java中,除了基本类型之外,其余的类型都属于引用数据类型。引用类型定义的变量非常类似于C/C++的指针,它内部存储一个“地址”,可以指向一个对象在内存中的位置指向对象的变量就是引用变量,这些变量在声明时被指定为一个特定的类型,比如People、System等。变量一旦声明后,其类型就不能被改变。

Java类、接口、数组等都是引用数据类型;
所有引用类型的默认值都是null;
一个引用变量可以用来引用任何与之兼容的类型;
String字符串是引用类型。

2. 案例

我们先来一个简单的关于String字符串的案例:

/**
 * @author 一一哥Sun
 * QQ:2312119590
 * CSDN、掘金、知乎找我哦
 */
public class TypeDemo01 {
    public static void main(String[] args) {    
        //String是引用数据类型---String类!        
        //在java中,一切用""包裹起来的类型都是String类型。      
        String name = "一一哥";
        String hobby = "美女";
        String job = "java程序员";
        System.out.println("姓名为:"+name+"\n爱好为:"+hobby+"\n职业为:"+job); 
    }
}

关于引用类型,在这篇文章中壹哥暂时不做过多讲解,后面学习面向对象和集合时,会重点讲解类、接口、数组等内容。

-----------------------------正片已结束,来根事后烟----------------------------

五. 结语

至此,壹哥就把数据类型及自动类型转换、强制类型转换等相关的内容讲解完毕了,本文的重点有如下这些:

Java里的数据类型有哪些?各自特点是什么?
基本数据类型有几种?
各类型的默认值;
long类型数据需要在最后添加L或l;
float类型数据需要在最后添加F或f;
字符必须使用''表示,字符串必须要使用"";

各数据类型默认值:

数据类型

默认值

byte

0

short

0

int

0

long

0L

float

0.0f

double

0.0d

char

'u0000'

boolean

false

String (or any object)

null

现在这些重点内容你都学会了吗?另外如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

六. 配套视频

如果你不习惯阅读技术文章,或是对文中的技术概念不能很好地理解,可以来看看壹哥帮你筛选出的视频教程。与本文配套的Java学习视频链接如下:

https://player.bilibili.com/player.html?bvid=BV1FK4y1x7Ny&p=9&page=9

七. 今日作业

1. 第一题

Java中有哪些数据类型,请在评论区默写出来。

2. 第二题

String字符串属于基本类型还是引用类型?评论区写出你的答案。

3. 第三题

说说每种基本类型的特点。