课时10:Java数据类型划分(整型类型)

简介: 本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。

课时10:Java数据类型划分(整型类型)

摘要:本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。

1. 整形常量与变量

2. 整形数据溢出问题

3. 解决数据溢出的方案

4. 数据类型的转换

5. 整型数据的默认值问题

6. byte数据类型与int数据类型的关系

 

01、 整型变量与常量


在Java程序中,任何整数常量的类型都是int型。例如,定义一个整型变量的代码可以这样写:在新建的`test demo.java`程序中,编写`int num=10`。这里的`10`是一个整数常量,它的值不会改变。程序中,任何整数常量的类型都是int型,将一个整数常量赋值给int型变量是合理的。


如果执行`num*2`,由于`num`是int型变量,`2`是int型常量,按照Java的运算规则,`int`类型数据相乘,结果依然是`int`型。执行代码后可以验证结果是否符合预期。

image.png

image.png

 

02、 整型数据的溢出问题

 

在进行整型数据操作时,会存在数据溢出问题。当整型数据达到其最大或最小值后继续进行数学计算,就可能产生错误数据。

关于变量命名的要求:第一个单词的字母小写,而后每个单词的首字母大写:

例如:maxValue;通过代码示例来观察,

定义`int maxValue=Integer.MAX_VALUE`获取最大值,
`int minValue=Integer.MIN_VALUE`获取最小值。
输出这两个值,会得到最大值`2147483647`和最小值`-2147483648`。
在跟上System.out.println(maxValue);
System.out.println(minValue); 
System.out.println(maxValue+1);
System.out.println(minValue-1);

image.png

image.png

当执行`maxValue+1`时,理论上结果应该还是`int`型,但由于`maxValue`已经是最大值,加1后发生数据溢出,编译执行后结果变成了最小值;同样,`minValue-1`的结果变成了最大值。如果继续进行`minValue-2`操作,编译执行后会得到次最大值,这表明数据计算在超出数据类型范围后出现了偏差。当已经超过了数据类型的局限之后数据的计算就会出现偏差。所以一定要在操作前预估数据大小

image.png

 

03、 解决整型数据溢出的方案


既然`int`型存在溢出问题,解决方法是更换更大的数据类型,即`long`型。但直接使用`long`型处理`int`型溢出问题时,也可能存在陷阱。


例如,`longresult=maxValue+1`,由于程序执行顺序是从等号右边到左边,先在一个区域保存`maxValue+1`的计算结果(此时仍按`int`型计算,会产生溢出),再将结果赋值给`long`型变量,所以结果依然会有溢出问题。解决方式:更换更大的数据类型


范例:使用long来解决int的数据溢出问题。

在使用此类方式处理之前请一定要注意一个问题,所有的程序的执行顺序都是由等号的右边到左边,也就是说,如果你现在使用了 int 进行计算,那么计算结果依然会有溢出,所以最简化的做法是将其中的一个变量,首先做内容的扩充而扩充有两种实现方式。


1)先将`int`变量的内容赋值给`long`变量,再进行计算。如先将`maxValue`赋值给一个`long`型变量,然后再对该变量进行加1操作。

image.png

2)直接将某一个`int`型变量变为`long`型。例如,在`maxValue+1`前加上`long`,表示先将`int`型的`maxValue`变为`long`型,再加上`int`型常量`1`,结果就是`long`类型

image.png

通过这两种方式处理后,编译执行代码,就可以得到正常的计算结果。

 

04、 数据类型的转换


任何数据的整型都是int,但是该数据已经超过了int可以保存的数据范围,那么现在就需要将这个数据明确的表示是一个long型的常量。


(1)由大变小的转换

数据范围大的数据类型变为数据范围小的数据类型需要强制转换,但强制转换可能会丢失精度。例如,当一个大于`int`最大范围的数值要赋值给`int`型变量时,需要明确表示该数值是`long`型常量(在数值后加`l`或`L`,建议加大`L`)。

比如system.out.println(11+1l);容易混淆。如果不进行强制转换,直接赋值,编译时会报错“过大的整数”。

image.png

(2)由小变大的转换

在Java中,数据范围小的数据类型可以自动转换为数据范围大的数据类型,这在数学计算中是自动进行的。例如,`long`型和`int`型进行计算时,`int`型会自动转换为`long`型,然后再进行计算。


强制转换时,要设置目标类型。例如,将一个超出`int`范围的`long`型数据强制转换为`int`型,编译执行后,由于数据范围变小,可能会丢失精度,导致结果不符合预期,如得到最小值等情况。范围小的数据类型可以自动变换为范围大的数据类型。数据范围大的数据类型只有强制转换才能转换为范围小的数据类型。


在实际开发中,尽量避免进行这种可能丢失精度的强制转换操作,除非有特殊需求。面试时可能会遇到相关问题,比如60的阶乘一定不是int能装下的,不确定大小就用long类型。

 

05、 整型数据的默认值问题


在Java中,所有数据类型都有默认值。在方法声明中,如果定义了变量int num但未给其默认值,直接使用该变量会报错,提示“可能尚未初始化”。

解决这个问题有两种方案:

1)在使用变量前进行赋值,如`num=10`,然后再输出变量。但这种方式在老版本的JDK中可能会出错。

image.png

2)在定义变量时直接赋值,这是所有JDK通用的做法,也是最保险的方式。例如`int num=10`,这样可以确保程序正常运行。

image.png

而对于各个数据类型的默认值的时候,需要结合到类的情况下才可以观察到。

 

06、 byte数据类型与int数据类型的关系


(1)byte数据类型的范围

`byte`数据类型可以保存的范围是`-128`到`+127`之间。


(2)与int数据类型的转换

当声明一个`byte`变量并赋值为`10`时,虽然`10`是`int`型,但由于其数据量在`byte`范围内,所以编译执行不会报错,也不需要进行强制转换。

如果为`byte`变量赋值的内容大于`byte`的范围,如赋值为`128`,编译时会提示“不兼容类型”,此时需要进行强制转换。强制转换后,值会变为`-128`,这是因为数据溢出。

image.png

image.png

需要注意的是,如果要将`int`值直接赋值给`byte`变量,只能是常量,不能是`int`变量。例如,`intnum=10`(`10`在`byte`范围内),但如果直接将`num`赋值给`byte`变量,编译时会提示从`int`转换可能会损失精度,依然需要加上强制转换操作。在实际开发中,`byte`和`int`一起使用时进行转换操作存在弊病,尽可能避免,`byte`更多用于二进制流或编码转换等场景。

相关文章
|
2月前
|
存储 Java Go
【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举
牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!
193 2
|
2月前
|
Java Go 开发工具
【Java】(2)Java数据类型阐述、基本数据类型的占用和范围、二进制的讲述
数据的一种表示形式。十进制表示满十进一原则。二进制表示满二进一原则。例如:十进制例如:二进制计算机在任何情况下都只能识别二进制。
122 1
|
2月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
91 7
|
3月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
3月前
|
安全 Java
使用Java多态性进行数据类型转换
以上示范了如何通过多态性来执行安全有效地对于Java对象间相互之间进行正确方式与场合下正确格式与条件限定内对于各个层级关系内部成员及其功能调取与应有操作处理过程,并通过 `instanceof`关键字确保了程序运行期间遵循逻辑合理并符合预设规则条件限定内正常工作流程而无需担忧潜藏风险问题出现可能带来影响结果质量问题情况存在可能。
127 12
|
4月前
|
安全 算法 Java
Java泛型编程:类型安全与擦除机制
Java泛型详解:从基础语法到类型擦除机制,深入解析通配符与PECS原则,探讨运行时类型获取技巧及最佳实践,助你掌握泛型精髓,写出更安全、灵活的代码。
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
160 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
178 1
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案