基本数据类型
前面我们介绍了变量和常量,在介绍过程中我们提到了“数据类型”,现在我们就具体的介绍一下数据类型。
Java中有8种基本的数据类型来存储各种各样的值,如下图所示:
整数类型
整数类型使用来存储整数数值。
数据类型 | 字节 | 长度 | 取值范围 |
---|---|---|---|
byte | 1字节 | 8位 | -128~127 |
short | 2字节 | 16位 | -32768~32768 |
int | 4字节 | 32位 | -2147483648~2147483647 |
long | 8字节 | 64位 | -9223372036854775808~9223372036854775807 |
int是Java整型值的默认数据类型,当代码使用整数赋值或输出时,都默认为int,例如:System.out.println(3+2);
long类型的数值要以L或l结尾
会出现的一些问题
- 问题1:如果long类型的数值没有以L或l结尾,那么这个类型的变量其实是int类型的,一旦这个数值超出了int类型取值范围,那么获取到的值会是一个与你想要的不一致的一个值。举个栗子:
public class Main {
public static void main(String[] args) {
long number = 123456789 * 987654321;
System.out.println( number);
}
}
上面这段代码中,我们声明了一个long类型的变量number,这个变量用来保存123456789*987654321的值,但给其赋值的时候我们没有以l或L结尾,这样在运行过程中会这么执行:
public class Main {
public static void main(String[] args) {
int a = 123456789;
int b = 987654321;
int c = a * b;
long number = c;
System.out.println(number);
}
}
最终输出的结果是:-67153019,这明显与我们预期想要的输出结果不一致。
再举个栗子:
public class Main {
public static void main(String[] args) {
long number = 21474483647;
System.out.println(number);
}
}
上面这段代码中,我们声明了一个long类型的变量,给变量的值超过了int类型的最大值,这时编译器会报错,执行后出现下面这个错误:
- 问题2 进制问题
在Java中整型数据有3中形式:十进制、八进制、十六进制
十进制:除了0以外其余的数字都不能以0开头
·八进制必须以0开头
十六进制必须以0X或0x开头
举个栗子:
public class Main {
public static void main(String[] args) {
int ten = 11;
int eight = 011;
int sixteen = 0x11;
System.out.println("11的十进制值为:" + ten);
System.out.println("11的八进制值为:" + eight);
System.out.println("11的十六进制值为:" + sixteen);
}
}
浮点类型
所谓的浮点类型数据就是带有小数的数据。在Java语言中浮点类型的数据有float(单精度)和double(双精度)。
数据类型 | 字节 | 长度 | 取值范围 |
---|---|---|---|
float | 4字节 | 32位 | 1.4E-45~3.0428235E38 |
double | 8字节 | 64位 | 4.9E-324~1.7976931348623157E308 |
double是Java浮点类型的默认数据类型,浮点类型的数值必须需要以f或F结尾,否则会报错。double类型的是以d或D结尾的,但因为它是默认的浮点类型所以可以不加。下面举个栗子:
public class Main {
public static void main(String[] args) {
double a = 5.55;
float b = 55.55f;
/*
变量c的声明会报错,因为没有以f或F结尾,Java会自动将5.55识别为double类型也就是说会自动进行类型转换。
将double转换为float
*/
float c = 5.55;
}
}
又出现问题了
问题1:我们先看一段代码,猜猜看输出的结果是多少?
public class Main {
public static void main(String[] args) {
double a = 4.35 * 100;
System.out.println(a);
}
}
435,你是不是猜输出结果是435?435是错误的,虽然4.35 *100 的正确答案是435,但实际输出的结果是434.99999999999994,这很接近435。不信你可以运行看一看。
这是因为浮点类型的值是一个近似值,所以在程序运算后的结果可能与实际有些偏差
解决方案:利用四舍五入获取正确的实际值
public class Main {
public static void main(String[] args) {
double a = 4.35 * 100;
System.out.println(a);
//Math.round是一个四舍五入的数学函数调用。
a = Math.round(a);
System.out.println("a = " + a);
}
}
问题二:从问题1中我们得出了一个解决浮点值的运算结果与实际值有偏差的问题,但并不能完全解决偏差问题。下面我们再看一段代码:
public class Main {
public static void main(String[] args) {
double a = 0.1;
double b = 10-9.9;
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("a==b的结果 " + (a==b));
}
}
这次的输出结果是:
很明显,四舍五入在这里就不起作用了,因为一旦四舍五入,我们得到的b是0.0而不是0.1,不信你可以试试。
解决方案
public class Main {
public static void main(String[] args) {
double a = 0.1;
double b = 10-9.9;
System.out.println("a = " + a);
System.out.println("b = " + b);
/*
Math.abs()用于取绝对值,1e-6表示1*10-6次是计算机中最小数的概念
如果两数之差的绝对值小于最小数,则认为两个数是相等的。
*/
boolean bool = Math.abs(a - b) < (1e-6);
System.out.println("两数之差绝对值小雨最小数的结果:" + bool);
}
}
字符类型
char类型
char类型是用于存储单个字符的类型占16位(两个字节)的内存存空间。char类型的值要用英文字符单引号('')引起来
Java语言将cahr类型的值当做整数来对待,字符的值其实就是编码的值,而Unicode编码(点击这查看更多Unicode的信息)采用无符号编码,可以存储65536个字符,所以java几乎可以处理所有国家的语言文字。
需要注意的是:
- char的默认值为空格,也可以用于整数运算
- 可以使用Unicode表中的序位号来声明一个字符,例如:
char ch = 65
ch的值是’A’
转义字符
Java中有些符号是编写代码所需要,所以不能直接赋值给变量或直接打印出来例如:
我们想要让a 的值为一个单引符号,如果直接赋值char a = ''';
或者是换行输出会报错,这时我们就需要用到转义字符了
转义字符表
转义字符 | 描述 |
---|---|
\' | 单引符号 |
\" | 双引符号 |
\\ | 反斜杠\ |
\t | 制表符tab |
\r | 回车 |
\n | 换行 |
\b | 退格 |
\f | 换页 |
布尔型(boolean)
布尔型又称逻辑型,只有true和false两个值,代表”真“和”假“,常常用于流程控制的判断条件。
数据类型转换
在一定规则下,数据类型之间是可以进行转换的。类型转换分为隐式转换和显示转换
转换的规则
- 布尔类型的数据不能参与转换
- 任意类型的数据可以转换成String类型
- 只能将低精度的数据转换成高精度的数据,例如double类型的数据如果转换成了float类型的数据,会出现溢出,那么会出现信息丢失,甚至有可能失败。
隐式转换
这种转换方式是由Java自己完成,我们不需要进行任何操作,举个栗子:
public class Main {
public static void main(String[] args) {
int a = 5;
float b = a;
System.out.println(b);
}
}
使用int类型变量为float类型变量赋值,此时int类型变量隐式转换为float类型变量,b的值为5。
显示转换
显示转换又称强制转换,显示转换的语法如下:
(类型名) 值
举个栗子:
public class Main {
public static void main(String[] args) {
int a =(int)4.5;
long b = (long)5.5f;
char c = (char)97.55;
System.out.println("double类型的4.5强制转换成int类型的值为:" + a);
System.out.println("float类型的5.5f强制转换成long类型的值为:" + b);
System.out.println("double类型的97.55强制转换成char类型的值为:" + c);
}
}
如果将整数复制给byte、short、int、long型变量时,不能超出这些变量类型的取值范围,否则必须进行强制转换。例如 byte a =(byte)129;