【Java】(3)8种基本数据类型的分析、数据类型转换规则、转义字符的列举

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
注册配置 MSE Nacos/ZooKeeper,182元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 牢记类型转换规则在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!

1. 转义字符:

转义字符

  • \

当使用了转义字符那么将不再视为’\n’这是一个字符串而是"一个"字符

  • \n 这是一个"换行符",属于char类型的数据

反斜杠在java语言中具有转义功能

题外话:

  • System.out.println() 和 System.out.print() 的区别;
  • println输出后会进行换行操作,print表示输出,但不换行
转义字符 说明
\a 响铃
\b 退格
\f 换页
\u 联合后面的一串数字是某个文字的unicode编码
\n 换行
\r 回车
\t 制表符
\ \
\’ 单引号
\" 双引号
\0 空字符(null)
\ddd 1~3位八进制数代表的任意字符
\xhh 1~2位十六进制代表的任意字符

注:转义字符出现在特殊字符之前,会将特殊字符转换成普通字符

2. char 字符类型:

一个中文占用2个字节,char类型正好是2个字节;

  • 所以java中的char类型变量可以存储一个中文字符

以下声明报错:123属于字符串,该使用""双引号进行引起来;

- char k = ‘123’;

以下声明报错:"a"是字符串类型,k变量是char类型;

  • char k = “a”;

这属于类型不兼容,编译错误;

char类型正确声明方式:

char k = 'b';

3. 整数类型:

关键字 占用空间大小 取值范围 默认值
byte 1 [ -128 ~ 127 ] 0
short 2 [ -32768 ~ 32767] 0
int 4 [ -2147483648 ~ 2147483647] 0
long 8 0L

3.1 默认类型

java中“整数型字面量” 默认是:

  • int类型

要让“整数型字面值”被当作long类型来处理的话,需要在“整数型字面值”后面添加l/L,建议用大写

long a = 120L;

3.2 java中的整数型有三种表达方式:

第一种方式:十进制【是一种缺省默认的方式】

第二种方式:八进制【在编写八进制整数型字面值的时候需要以0开始】

第三种方式:十六进制【在编写十六进制整数型字面值的时候需要以0x开始】

  • 010 整数型字面值以0开头的,后面那一串数字就是八进制形式
  • 0x10 整数型字面值以0x开头的,后面哪一串字数就是十六进制形式

3.2.1 例子:

long x = 456;
// 小容量可以自动转换成大容量,'456' 被默认设为int类型,但是使用的是long类型声明变量进行赋值,所以会自动转换成long类型;
// 这种机制被称为:自动类型转换机制
long y = 2147483647;

2147483647 是 int类型,占用4个字节

  • 变量 y 是long类型,占用8个字节,自动将 值2147483647 转换成long类型
long z = 2147483648;

这样声明将会报错!在一开始整数型字面量默认当作int类型处理,2147483648已经超出int类型的取值范围所以报错;

  • 因为是在一开始的时候就已经报错,所以long声明的z无法进行类型转换!

解决错误:

long h = 2147483648L;
System.out.println(h); // 输出:2147483648
在值后面加上L;那么这个字面值一开始就会被当作long类型来处理;
2147483648   ------ int类型
2147483648L ------ long类型
// 以下代码不存在类型转换
long u = 2147483648L;
int i = 2416;

3.3 整数类型的转换

  • 以下程序编译报错:大容量不能直接赋值给小容量
long x = 100L;
int y = x;
  • 大容量转换成小容量,需要进行强制类型转换;
    强制类型转型需要加“强制类型转换符”
    加上转换符后编译通过,但是运行阶段可能损失精度
    所以强制类型转换谨慎使用,因为损失精度后可能会损失很严重
  • 强制转换符:(转换的数据类型[int,short,byte,long]) 字面量/字面值
long x = 100L;
int y = (int)x;

3.3.1 强制转换原理:

  • 原始数据:
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
    8字节long类型

》》》》》》 转换后 》》》》》

  • 强转后的数据:
    00000000 00000000 00000000 01100100
    4字节int类型
  • 将左边的二进制砍掉【所有的数据强转的时候都是这样完成的】
  • 当字面值没有超出byte类型取值范围的话,该字面值可以直接赋值给byte类型的变量;
byte b = 127;

3.3.2 精度损失:

计算机二进制有三种表示形式:

  • 原码
  • 反码
  • 补码

计算机在任何情况下底层表示的和存储数据的时候采用了补码形式。

  • 正数的补码:和原码相同
  • 负数的补码:负数的绝对值对应的二进制码所有的二进制位取反,再加1

补码:10000000

原码计算过程:

  • 10000000 - 1 --> 011111111
  • 10000000 --> 128
  • -128

4. 浮点型:

关键字 精度 占用空间(字节)
float 单精度 4
double 双精度 8

double的精度太低【相对来说】,不适合做财务软件

需要精度高的计算时,会使用SE类库中的一种引用数据类型:java.math.BigDecimal

  • 在java中,所有的浮点型字面值【3.2】,默认被当作double类型来处理;
  • 要想该字面值以float类型来处理,需要在字面值后面添加F/f

无限小数中例如:

  • 1.55555555555555555555555555555555555…

这样的小数在计算机中只能存储近似值;

5. 布尔型:

  • boolean

在java中,boolean类型只有两个值:true、false,没有其他值。

boolean a = false;
boolean b = true;

在底层存储的时候boolean类型占用1个字节,因为实际存储的时候flase底层是0,true底层是1

6. 类型转换

关于基本数据类型之间的互相转化:

  1. 八种数据当中除布尔类型不可转换,剩下的7种类型之间都可以进行转换
  2. 小容量向大容量转换,称为自动类型转换,容量从小到大排序:
  • byte < short < int < long < float < double
    char <

注:任何浮点类型不管占用多少个字节,都比整数型容量大。

char和short可表示的种类数量相同,但是char可以取更大的正整数

大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过,但是在运行阶段可能会损失精度,所以谨慎使用。

当帧数字面值没有超出byte,short,char的取值范围,可以直接赋值给byte,short,char类型的变量。

byte,short,char混合运算的时候,各自先转换成int类型再做运算。

多种数据类型混合运算,先转换成容量最大的类型再做运算。

6.1 例1:

double dd = 10/3;
System.out.println(dd); // 输出3.0

逻辑分析:

在最开始,整数型已经被当做是int类型进行除法,所以得3;

  • 因为赋值的是double类型所以输出的结果是3.0
  • 程序先运行10/3=3;int类型相除取整数!然后赋值给dd变量
  • 变量是double类型,所以结果是3.0

6.2 例2:

dd = 10.0 / 3;
System.out.println(dd); // 输出3.3333333333333335

逻辑分析:

与上方例子不同右方赋值项的式子是

  • double类型 / int类型;
  • 所以在一开始运算结果的时候就3.333333333333
  • 最后将dd重新设置为该值

6.3 例3:

long g = 10;
byte b = (byte)(int)g/3;

编译出错!

逻辑分析:

  1. 24行代码先把g变量弄明白是什么类型了再与3这个int类型做运算公式
  2. 最开始的g是long类型强制转换后成为了int类型再次转换后成为了byte类型
    long类型g > int类型g > byte类型g
  3. 24行代码运算结果 byte类型g(10) / int类型3 = int类型3;
    计算结果是int类型而赋值的变量是byte类型,大容量转小容量,精度受损所以报错

解决方法1:

int b = (byte)(int)g/3;
System.out.println(b);//输出3

解决方法2:

byte b = (byte)(int)(g/3);
System.out.println(b);//输出3

6.4 类型转换总结:

  • 牢记类型转换规则
  • 在脑海中将编译和运行两个阶段分开,这是两个不同的阶段,不要弄混!

7. ❤️Java基础专栏 - 前篇回顾

8. 💕👉 其他好文推荐

目录
相关文章
|
1月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
197 1
|
1月前
|
Java Go 开发工具
【Java】(2)Java数据类型阐述、基本数据类型的占用和范围、二进制的讲述
数据的一种表示形式。十进制表示满十进一原则。二进制表示满二进一原则。例如:十进制例如:二进制计算机在任何情况下都只能识别二进制。
108 1
|
1月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
304 98
|
2月前
|
安全 Java
使用Java多态性进行数据类型转换
以上示范了如何通过多态性来执行安全有效地对于Java对象间相互之间进行正确方式与场合下正确格式与条件限定内对于各个层级关系内部成员及其功能调取与应有操作处理过程,并通过 `instanceof`关键字确保了程序运行期间遵循逻辑合理并符合预设规则条件限定内正常工作流程而无需担忧潜藏风险问题出现可能带来影响结果质量问题情况存在可能。
107 12
|
2月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
3月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
119 4
|
Java C++ Perl
Java中常见的转义字符
转移字符对应的英文是escape character , 转义字符串(Escape Sequence)字母前面加上捺斜线"\"来表示常见的那些不能显示的ASCII字符.称为转义字符.如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。 所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。
973 0
Java中常见的转义字符
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
132 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
151 1
Java 数据库 Spring
130 0