【03】Java的数据类型 基本类型 引用类型 类型转换
📔 千寻简笔记介绍
千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes
,包含笔记源文件.md
,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助请帮我点一个Star
~
更新:支持在线阅读文章,根据发布日期分类。
文章目录
- 【03】Java的数据类型 基本类型 引用类型 类型转换
- 📔 千寻简笔记介绍
- 简介
- 本文关键词
- 1 数据类型
- 1.1 基本数据类型
- 1.2 引用数据类型
- 1.3 扩展知识
- 整数:
- 浮点数:
- 常用的方法比较浮点数:
- 字符:
- 转义字符:
- 布尔值:
- 2 类型转换
- 2.1 强制类型转换
- 2.2 自动类型转换
简介
本文关键词
数据类型
、基本数据类型
、引用数据类型
、扩展知识
、整数
、浮点数
、常用的方法比较浮点数
、字符
、转义字符
、布尔值
、类型转换
、强制类型转换
、自动类型转换
1 数据类型
强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
1.1 基本数据类型
Java中的基本数据类型分为四类,总共有八种基本数据类型。
- 整数类型(整型):
-
byte
:8位有符号整数,取值范围为-128到127。 -
short
:16位有符号整数,取值范围为-32,768到32,767。 -
int
:32位有符号整数,取值范围为-2,147,483,648到2,147,483,647。 -
long
:64位有符号整数,取值范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807。
- 浮点类型:
-
float
:32位浮点数,取值范围为1.4E-45到3.4028235E+38,可表示小数位数约为6-7位。 -
double
:64位浮点数,取值范围为4.9E-324到1.7976931348623157E+308,可表示小数位数约为15位。
- 字符类型:
-
char
:16位Unicode字符,可以存储任何Unicode字符。
- 布尔类型:
-
boolean
:表示真(true)或假(false)的布尔值。
1.2 引用数据类型
除了基本数据类型,Java还有引用数据类型。引用数据类型是由程序员自定义的类或Java提供的类,可以用来表示更复杂的数据结构。
一些常见的引用数据类型包括:
- 类(Class):类是Java中最基本的引用数据类型,用于创建对象。类是通过属性和方法的集合来描述对象的特征和行为。
- 数组(Array):数组是一种用来存储多个相同类型的元素的容器。数组可以是一维、二维或多维的,并且可以存储基本数据类型或引用数据类型。
- 接口(Interface):接口定义了一组方法的规范,实现该接口的类必须实现这些方法。接口提供了一种实现多态性的方式。
- 枚举(Enum):枚举是一种特殊的引用数据类型,用于定义一组固定的常量。枚举类型可以有多个枚举值,每个枚举值都可以对应一个名称和值。
- 字符串(String):字符串是由字符组成的不可变序列。在Java中,字符串是引用数据类型,但是使用起来比较特殊,可以像基本数据类型一样进行操作。
此外,还可以使用Java提供的许多其他引用数据类型,如集合(Collection)、列表(List)、映射(Map)等,这些类型用来处理更复杂的数据结构和算法。
1.3 扩展知识
整数:
在Java中,整数的表示方式可以通过不同的进制来表示,如二进制、十进制、八进制和十六进制。
- 二进制:使用前缀
0b
表示。例如,int i = 0b10;
表示二进制数值2。 - 十进制:默认的整数表示方式,不需要前缀。例如,
int i = 10;
表示十进制数值10。 - 八进制:使用前缀
0
表示。例如,int i = 010;
表示八进制数值8。 - 十六进制:使用前缀
0x
表示。例如,int i = 0x10;
表示十六进制数值16。
浮点数:
在Java中,浮点数用于表示带有小数部分的数值。
- float:使用关键字
float
表示,通常需要在数值末尾添加后缀f
。例如,float f = 0.1f;
表示浮点数0.1。 - double:使用关键字
double
表示,默认情况下,带小数点的数值都被视为double
类型。例如,double d = 1.0/10;
表示浮点数0.1。
由于浮点数的特性,存在舍入误差,因此在比较浮点数时要特别注意,最好不要使用相等运算符(==)进行比较,而是应该通过范围判断或使用特定的比较方法。
常用的方法比较浮点数:
- 使用范围判断:将两个浮点数之间的差值与一个小的阈值进行比较。例如:
double a = 0.1;
double b = 0.2;
double threshold = 0.000001; // 定义一个很小的阈值
if (Math.abs(a - b) < threshold) {
// 两个浮点数被认为是相等的
}
这种方法通过比较两个浮点数之差的绝对值来判断它们是否足够接近,如果差值小于阈值,则认为它们是相等的。
- 使用BigDecimal类:BigDecimal类是Java提供的用于高精度计算的数学工具类,可以避免浮点数的舍入误差。例如:
import java.math.BigDecimal;
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
if (a.compareTo(b) == 0) {
// 两个浮点数被认为是相等的
}
在这种方法中,使用BigDecimal类来创建精确的浮点数对象,并使用compareTo()
方法来比较它们的值。
- 使用第三方库:除了使用Java原生的方法进行浮点数比较,还可以使用一些第三方库,例如Apache Commons Math或Google Guava中提供的方法。这些库提供了更多的选项和工具来处理浮点数的比较和运算。
无论选择哪种方法,都要注意浮点数比较时可能存在的舍入误差,并根据具体情况选择合适的比较方式。
字符:
在Java中,字符使用关键字char
表示,用单引号括起来。每个字符都对应着一个Unicode编码。例如,char c1 = 'A';
表示字符’A’,char c2 = '中';
表示字符’中’。
可以使用强制类型转换将字符转换为其对应的Unicode数值,例如(int)c1
可以得到’A’的Unicode数值65。反过来,也可以使用Unicode的数值来指定一个字符,如char c3 = '\u0061';
等价于char c3 = 'a';
。
转义字符:
在字符串中,可以使用转义字符来表示一些特殊字符。
-
\n
:表示换行符。 -
\t
:表示制表符。
布尔值:
布尔值用于表示真(true)和假(false),在Java中使用关键字boolean
表示。布尔值常用于条件判断和控制流程。
例如,boolean flag = true;
表示布尔值为真,if(flag){}
可以用来判断条件是否成立。
2 类型转换
强制类型转换
和自动类型转换
是Java中处理数据类型转换的两种方式。
2.1 强制类型转换
当需要将一个数据类型转换为另一个数据类型时,可以使用强制类型转换。在强制类型转换中,将数据类型放在括号内,并将其放在要转换的值之前。强制类型转换通常用于将高容量的数据类型
转换为低容量的数据类型
。例如:
int i = 128;
byte b = (byte) i; // 强制将int类型转换为byte类型
char c = 'a';
int d = c + 1;
System.out.println(d); // 输出98
System.out.println((char) d); // 输出b
注意,在强制类型转换中可能会出现内存溢出和精度丢失的问题。因此,在进行强制类型转换时,需要谨慎处理。
2.2 自动类型转换
在Java中,当数据类型的范围小于
另一个数据类型时,会自动进行类型转换。这种类型转换被称为自动类型转换。自动类型转换通常用于将低容量的数据类型
转换为高容量的数据类型
。例如:
int i = 128;
double d = i; // 自动将int类型转换为double类型
float f = 23.7f;
int g = (int) f; // 强制将float类型转换为int类型
在自动类型转换中,较小类型的值被自动转换为较大类型的值,没有精度丢失的问题
。
需要注意以下几点:
- 不能对
布尔值(boolean)
进行转换。 - 不能把对象类型转换为不相干的类型。
- 在将
高容量
转换为低容量
时,需要使用强制类型转换
。 - 在进行数字运算时要特别小心,避免溢出问题。可以通过将其中一个操作数转换为更高容量的数据类型来解决,例如将一个操作数转换为
long
类型。
// 操作比较大的数的时候,注意溢出问题
// JDK7新特性,数字之间可以用下划线分割
int money = 10_0000_0000;
int years = 20;
int total = money*years; // -1474836480,计算是已经溢出
long total2 = money*years; // 默认是int,转换之前就已经存在问题
// 解决方式
long total2 = money*((long)years); // 先吧一个数转换为long