JAVA是一种强类型语言,每个变量都必须声明其数据类型,Java的数据类型分为2大类,基本数据类型和引用数据类型。
一、3类8种基本数据类型
- 数值型:
- 整数:byte(1字节)、 short(2字节)、 int(4字节) 、long(8字节)
- 浮点型:float(4字节) double(8字节)
- 字符型:char(2字节)
- 布尔型:boolean(1位)
1) 整型
整型数据类型 | ||
类型 | 占用存储空间 | 表示范围 |
byte | 1字节 | -128 ~ +127 |
short | 2字节 | -32468 ~ +32467 |
int | 4字节 | -2e31 ~ +2e31-1(约正负21亿) |
long | 8字节 | -2e63 ~ +2e63-1 |
1个字节为8位,其中1位用来做符号位!
java语言整型常量的4种表示形式:
1.十进制整数,如:1,2,3...
2.八进制整数,必须以0开头,如:013
3.十六进制数,必须以0x或0X开头,如:0x15
4.二进制数,必须以0b或0B开头, 如:0b00010011
Java语言的整型常量默认为int型,long类型需要加'l'或'L'。
2)浮点型
float类型为单精度,double类型为双精度。绝大数情况下我们使用的都是double类型,浮点型常量默认为double型。 java浮点型常量有2种表示形式:
- 十进制表示,如:3.14
- 科学计数法,如:314e-2或314E-2
由于字长有限,浮点数可以精确表示的小数是有限的,因此实际浮点数也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近,但不等于。
java.math包下面的2个有用类:BigInteger和BigDecimal,这2个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。
雷区:不要使用浮点数进行比较!需要比较时请使用BigDecimal类!
示例1:浮点数是不精确的,一定不可以用于比较!
public class Main {
public static void main(String[] args) {
// 浮点数是不精确的,一定不能用于比较
float f=0.1f;
double d=1.0/10;
System.out.println(f);
System.out.println(d);
System.out.println(f==d);
float d1 = 123456789f;
float d2 = d1 + 1;
if (d1 == d2){
System.out.println("d1,d2相等!");
}else {
System.out.println("d1,d2不等!");
}
}
}
运行结果如下:
示例2:使用BigDecimal实现浮点数的比较
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal bd = BigDecimal.valueOf(1.0);
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
bd = bd.subtract(BigDecimal.valueOf(0.1));
System.out.println(bd);//0.6
System.out.println(1.0-0.1-0.1-0.1-0.1);//0.6000000000000001
}
}
运行结果:
3) 字符型变量/常量
字符型在内存中占2个字节,Java中使用单引号来表示字符常量。'A'表示一个字符,而"A"表示含有一个字符的字符串。String类其实是一个字符序列(char sequence)。char类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字,占2个字节,允许含有65536个字符。Unicode具有从0到65535之间的编码,通常使用'\u0000'到'\uFFFF'之间的十六进制值来表示(前缀为u表示Unicode)。
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 字符
char c = '严';
System.out.println(c);
// 以为可以使用Unicode编码表示一个字符
char d = '\u4e25';
System.out.println(d);
// utf-8编码的字节数组
byte[] a = {(byte)0xE4, (byte)0xB8, (byte)0xA5};
String e = new String(a, StandardCharsets.UTF_8);// 指定decode方式,将byte[]解析为字符串
System.out.println(e);
// 扩展:获取字符串指定编码的字节数组
byte[] b = "严".getBytes(StandardCharsets.UTF_8);
System.out.println(Arrays.toString(b));
for (int n : b){
System.out.print(Integer.toHexString(n & 0xFF));
System.out.print(",");
}
}
}
运行结果:(有关Unicode字符集,UTF-8编码的相关内容将在JAVA基础(四)中进行详细介绍)
4) 布尔型常量
boolean类型有2个常量值,true和false,在内存中占1位,与C不同的是,Java中不可以用0或非0的整数来代替true和false。
boolean用来做逻辑判断条件,但请不要这样写:if(flag == true),很容易犯if(flag = true)的错误。请直接使用if(flag)或if(!flag)。
二、java引用数据类型(后续再做详细介绍)
- 类
- 接口
- 数组
引用类型占4个字节,用来存储内存地址。