作者:孙玉昌,昵称【 一一哥】,另外【 壹壹哥】也是我哦
CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

配套开源项目资料

GitHub地址: https://github.com/SunLtd/LearnJava
Gitee地址: https://gitee.com/sunyiyi/LearnJava


前言

在上一篇文章中,壹哥给大家讲解了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或ffloat f = 10.2F;//float f = 3.14e38f; // 科学计数法表示的3.14x10^38System.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^-324System.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; // 计算结果为falseSystem.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. 第三题

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

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

  1. 44从零开始学Java之详解容易让初学者懵圈的abstract抽象类、抽象方法

    作者:孙玉昌,昵称[一一哥],另外[壹壹哥]也是我哦 千锋教育高级教研员.CSDN博客专家.万粉博主.阿里云专家博主.掘金优质作者 前言 经过前面几篇文章的讲解,我们现在已经对面向对象有了基本的认知, ...

  2. 15从零开始学Java之详解计算机中的进制转换

    作者:孙玉昌,昵称[一一哥],另外[壹壹哥]也是我哦 CSDN博客专家.万粉博主.阿里云专家博主.掘金优质作者 配套项目资料 https://github.com/SunLtd/LearnJava h ...

  3. flask与js交互的示例代码_Frida Java Hook 详解(安卓9):代码及示例(上)

    Frida Java Hook 详解(安卓9):代码及示例(上) 前言 1.1 FRIDA SCRIPT的"hello world" 1.1.1 "hello world ...

  4. Java集合排序及java集合类详解

    Java集合排序及java集合类详解 (Collection, List, Set, Map) 摘要内容 集合是Java里面最常用的,也是最重要的一部分.能够用好集合和理解好集合对于做Java程序的开 ...

  5. JAVE EE 企业级开发之从零开始学JAVA【51CTO技术论坛】

    http://bbs.51cto.com JAVE EE 企业级开发之从零开始学JAVA         从零开始学JAVA?YES!本刊内容全部为午饭redking整理.撰写,所涉及内容均为原创,非 ...

  6. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  7. Java异常详解及如何处理

    来源:Java异常详解及如何处理 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言 ...

  8. Java多线程详解(基本概念)

    嗨喽-小伙伴们我来啦, 从本章开始,我们就要开始介绍Java中一个非常重要的概念-----多线程.线程化思想是计算机领域的重要思想,有了线程,咱编写的程序才能更为高效准确地运行起来. 首先,咱来了解一 ...

  9. [转] Java内部类详解

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...

最新文章

  1. MVC – 9.mvc整体请求流程
  2. 21天战拖记——Day10:“书柜整理法”再学习(2014-05-13)
  3. jquery.dataTable.js 绘制表格使用详解
  4. mysql触发器如何获取当前表名_Mysql如何获取中位数
  5. 【英语学习】【Level 07】U04 Rest and Relaxation L6 Your home away from home
  6. SharePoint 2013 托管导航及相关配置
  7. gerrit项目配置
  8. Android 操作权限大全 (android.permission)
  9. 任务调度框架 Quartz 用法指南「超详细」
  10. h5 7个移动端框架
  11. Unity发布ios和Android获取相机权限的相关问题
  12. 我的原创软件作品——弹窗拦截器V1.0.1
  13. vos与呼叫中心系统的关系
  14. HTTPS/数字证书/数字签名
  15. 【机器视觉】圆形测量
  16. sklearn——转换器(Transformer)与预估器(estimator)
  17. mysql查询雇员地址和电话_数据库的查询(结合YGGL.sql)
  18. 广西工学院2000级计算机系,潘盛辉(电子信息与控制工程系)老师 - 广西工学院 - 院校大全...
  19. 注意力机制(attention)学习记录(二)
  20. 【NOIP2013模拟联考5】小麦亩产一千八题解

热门文章

  1. 基于JavawWeb的体育馆预定管理系统,java+vue实现体育场管理啊啊啊啊啊
  2. js怎么添加html空格,javascript-在JSX中添加空格的最佳做法
  3. 3par存储与linux系统多路径适配问题解决方案
  4. Java设计模式之 工厂模式(简单工厂模式)
  5. bat ren命令修改文件后缀名
  6. Simulink快速入门:如何搭建仿真模型——以双向直流变换器为例(附模型)
  7. element-ui表格列宽度根据内容计算最小宽度min-width实现自适应参考
  8. 《MTK平台上的KEY定义及应用》
  9. 第六天:通过python代码控制越疆机械臂完成抓取投递整个过程
  10. HTML5期末大作业:动漫网站设计——迪斯尼公主(6个页面) HTML+CSS+JavaScript 动漫网页HTML代码 学生网页课程设计期末作业下载 动漫大学生网页设计制作成...