该文章Github地址:https://github.com/AntonyCheng/java-notes【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】
在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template【有条件的情况下推荐直接访问GitHub以获取最新的代码更新】& CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!
上一章:由浅到深认识Java语言(3):关键字&变量&常量
10.Java中的数据类型
整数类型
Q
1
.
Q_1.
Q1.对于一个整数,为什么 Java 会给出 int byte short long
四个选择:
A 1 . A_1. A1.在创建变量时,因为不同数据类型整数,开辟的空间大小是不一样的,所以就要根据实际的情况来决定开辟多少大小的空间,在实际情况允许下,开辟尽量小的空间,能够节省内存的开销;
实际情况:要存放在变量中的数值的大小;例如我们要存放的值最多不超过127,那么就可以使用byte去定义变量;
类型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1字节 | − 128 ∼ 127 -128\sim127 −128∼127 |
short | 2字节 | − 2 15 ∼ 2 15 − 1 -2^{15}\sim2^{15}-1 −215∼215−1 |
int | 4字节 | − 2 31 ∼ 2 31 − 1 -2^{31}\sim2^{31}-1 −231∼231−1 |
long | 8字节 | − 2 63 ∼ 2 63 − 1 -2^{63}\sim2^{63}-1 −263∼263−1 |
float | 4字节 | − 3.403 E 38 ∼ 3.403 E 38 -3.403E38\sim3.403E38 −3.403E38∼3.403E38 |
double | 8字节 | − 1.798 E 308 ∼ 1.798 E 308 -1.798E308\sim1.798E308 −1.798E308∼1.798E308 |
char | 2字节 | 0 ∼ 65535 0\sim65535 0∼65535 |
boolean | 理论上 1/8 字节 |
一般情况下,对于整数来说我们都用 int
;
对于long类型的注意事项:
当我们已经给一个 int
型变量赋值后,JVM 会默认给所有整数类型设置为 int
型,这是赋值一个 超过 int
型内存的 long
型的整数就会报错;
为了避免这样一个报错,我们需要在 long
型整数后面加上一个大写 L
;
浮点数类型
JVM
默认的是 double
,如果想要 float
型浮点数,那么需要在浮点数后面加上 f
;
//在Java的浮点运算中,这三种的打印结果如下:
10.0/0.0 ==> Infinity
-10.0/0.0 ==> -Infinity
0.0/0.0 ==> NaN
字符类型
char
:一个字符型变量只能存放一个字符,不能存放多个字符;
字符类型用单引号包裹,字符串类型用双引号包裹;
注意:String
这个不是基础数据类型,而是引用数据类型;
强烈建议在程序中不要使用char类型,除非确实需要处理UTF-16代码单元,原因参考《Java核心技术 卷Ⅰ》
数据类型的转换
当不同数据类型变量之间进行运算时就会涉及到数据类型转换;
-
自动类型转换:
容量小的数据类型允许被转换成容量大的数据类型,这一动作是自动完成的;
容量大的数据类型不被允许转换成容量小的数据类型;
这里的容量指的是数据类型的表数范围
class demo{ public static void main(String[] args){ int a = 10; //long b = a; 自动类型转换成功 //byte c = a; 自动类型转换失败 } }
自动转换的大小顺序:
但是这里要注意
byte short char
:byte short char
之间进行运算时,会先转换成int
;因为在 Java 中,整数类型默认的是 int 型,所以如果要如下运算就不行;
byte a = 10; char b = a + 10;//a 是 byte ,10 默认的是 int ,int 的容量比 char 大,所以赋值会失败 char c = 10 + 20;//这里则能够将其看成 10+20 后自动转换成 char
自动类型转换没有布尔值(boolean);
-
强制类型转换:
如果容量大的数据转换成容量小的就必须得通过强转符
()
实现强制类型转换;double
打印效果如下:
解释:高位转 byte 是 -128~127 的循环;高位转 char 是对应的 ASCII 码,显然 199 超出了 ASCII 码范围;
数值类型之间的转换补充:
6个实线箭头,表示无信息丢失的转换,另外三个虚线箭头,表示可能有精度损失的转换;这九个箭头均表示可以进行数据类型的”自动“转换,但是不能逆箭头”自动“转换,或者无箭头”自动“转换,若需转换则应该使用强制转换的方式;
基本类型之间可以互相转换,转换结果无论错对,至少程序可以进行,但是引用类型之间的互相转换可能会报错;
大数
大数这个概念是第二次复习Java所补充的笔记,如果你是第一次看到这个笔记,那么请继续读下去,下面会对在此之前没有提到的概念进行说明;
这个元素确切来说并不是Java中的数据类型,但是它能够解决一些关键性的问题,比如当基本的整数和浮点数精度不能满足我们程序的要求时,我们就需要用到 java.math 包中的两个类(类这个概念后面会有介绍):BigInteger和BigDecimal,这两个类可以处理包含任意长度数字序列的数值,其中BigInteger类能实现任意精度的整数运算,BigDecimal类能实现任意精度的浮点数运算,大数可以使用valueOf()
方法将整数和浮点数转换为大数类型:
import java.math.BigDecimal;
import java.math.BigInteger;
/**
* @author AntonyCheng
* @date 2022/8/28 17:32
*/
public class Demo {
public static void main(String[] args) {
int a = 100;
double b = 200.2;
BigInteger c = BigInteger.valueOf(a);
BigDecimal d = BigDecimal.valueOf(b);
System.out.println("c = " + c);
System.out.println("d = " + d);
}
}
当然,当我们需要更大的数据(像一个 long 都没办法表示的数据),我们可以使用一个带字符串(字符串这个引用数据类型在后面会有介绍)参数的构造器(构造器这个概念在后面会有介绍)创造出来:
import java.math.BigDecimal;
import java.math.BigInteger;
/**
* @author AntonyCheng
* @date 2022/8/28 17:32
*/
public class Demo {
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger("99999999999999999999999999999999999");
String a = bigInteger.toString();
BigDecimal bigDecimal = new BigDecimal("99999999999999999999999999.9999999999999999");
String b = bigDecimal.toString();
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
在大数类中的计算并不是我们平时那样直接用 +
-
*
/
去计算,而是需要用到类中的方法(方法这个概念后面也会提到):
import java.math.BigDecimal;
import java.math.BigInteger;
/**
* @author AntonyCheng
* @date 2022/8/28 17:32
*/
public class Demo {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("9999999999999999999999999999");
BigDecimal b = new BigDecimal("1111111111111111111111111111");
//大数之间相加
BigDecimal addResult = a.add(b);
System.out.println("addResult = " + addResult);
//大数之间相减
BigDecimal subtractResult = a.subtract(b);
System.out.println("subtractResult = " + subtractResult);
//大数之间相乘
BigDecimal multiplyResult = a.multiply(b);
System.out.println("multiplyResult = " + multiplyResult);
//大数之间相除
BigDecimal divideResult = a.divide(b);
System.out.println("divideResult = " + divideResult);
}
}
其实大数主要是用来处理浮点精度不准确问题的,例如2.0-1.9得到的结果并不是0.1,因为在二进制中无法整处理0.1;