Java顺序结构之基本数据类型转换

基本数据类型转换

在 Java 开发之中,经常会涉及到不同类型数据之间进行相互转换。那 Java 之间又是如何转换数据类型的呢?

Java 中数据类型的转换有两种:

自动转换;

强制转换。

首先我们得需要知道 Java 基本数据类型之间的范围大小。

Java 中整型和浮点型按照范围从小到大:

byte -> short -> int -> long -> float -> double

字符型转换为整型:
char -> int

自动类型转换

自动类型转换 (也叫隐式类型转换) ,其实就是小范围的数据类型向大范围的数据类型转换,你可以想象一下,把一杯水往一个容积大的空桶中倒进,水不会流出来。

注意:自动类型转换的前提条件,必须是把数据类型范围小的数值或变量赋给数据类型范围大的变量。

例子:

int d = 100;
// 当一个 int 类型和一个 long 型相加时,类型会自动转换为 long
long c = 12500000;
long l = c + d;

自动转换也要小心数据溢出问题,看下面的例子。

int d = 1;
int c = 2147483647;
// c+d 本质上依然是 int 型,这里将结果转化为 long
long l = c + d;
System.out.print(l);

执行结果:

-2147483648

结果却输出的是负数,这是因为两个 int 相加得到的结果是 int,相加的结果超出了 int 的代表范围。这种情况,一般把第一个数据转换成范围大的数据类型再和其他的数据进行运算。

int d = 1;
int c = 2147483647;
long e = c;
long l = e + d;
System.out.print(l);

执行结果:

2147483648

我们在之前的实训中了解到了当两个整型做 / 运算时,/ 实际上是求整,那如果我们想要求出准确的结果,我们该怎么做呢?

我们可以将整型转化为浮点型,例如:

int d = 5;
int c = 2;
double e = d;     // 将变量d类型转换为double
System.out.print(e/c);

也可以简写为:

int d = 5;
int c = 2;
System.out.print((double)d/c);

执行结果为:

2.5
当范围小的数据与范围大的数据进行运算时,类型会自动转换为范围大的那个类型。所有的 byte 类型、short 类型、char 类型在运算时将被提升到 int 类型。

注意:char 类型比较特殊,char 自动转换成 int、long、float 和 double,但 byte 和 short 不能自动转换为 char,而且 char 也不能自动转换为 byte 或 short。

强制类型转换

强制类型转换 (也叫显式类型转换) ,其实就是大范围的数据类型向小范围的数据类型转换,它需要加强制转换符来实现强制转换。
例子:

double a = 2.31;
int b = (int)a;
System.out.print(b);

执行结果:
2
在强制类型转换中,如果是将浮点类型的值转换为整数,直接去掉小数点后边的所有数字;而如果是整数类型强制转换为浮点类型时,将在小数点后面补零。

强制转换需要注意两点:

把一个浮点数强制转换为整数时,Java 会直接截断浮点数的小数部分,造成数据丢失;

把一个超出数据范围的数值赋给数据类型时,会出现数据溢出的情况,造成数据的缺失。例如:int 类型的 a 的值为 249,将其强转为 byte 类型时结果会变为 -7,数据溢出。

String、StringBuffer、Stringbuilder

(1)字符修改上的区别
在这里插入图片描述
(2)初始化上的区别,String可以空赋值,后者不行,报错

①String

String s = null;

String s = “abc”;

②StringBuffer

StringBuffer s = null; //结果警告:Null pointer access: The variable result can only be null at this location

StringBuffer s = new StringBuffer();//StringBuffer对象是一个空的对象

StringBuffer s = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象,对象的内容就是字符串”

小结:(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。

おすすめ

転載: blog.csdn.net/qq_52297656/article/details/120468028