二、Java基本语法(二)——基本数据类型
1、基本数据类型
Java各数据类型有固定的表数范围和字段长度,不受具体OS(操作系统)的影响,以保证java程序的可移植性。
1.1、整数类型: byte、 short、 int、 long
- bit: 计算机中的最小存储单位。 byte:计算机中基本存储单元。
- 整型的常量,默认类型为int型。
- 声明long型变量,变量值必须以"l"或"L"结尾。
- 通常,定义整型变量时,使用int型。
public class Test {
public static void main(String[] args) {
byte b1 = 12;
short s1 = 128;
int i1 = 1234;
// 编译失败:过大的整数,整型常量,默认类型为int型,int型存放不了这么大的值
// int l1 = 21332423235234123;
// long l1 = 21332423235234123;
// 声明long型变量,必须以"l"或"L"结尾
long l1 = 21332423235234123L;
System.out.println(l1);
}
}
1.2、浮点类型: float、 double
- 浮点型常量,表示带小数点的数值,有两种表示形式:
- 十进制数形式,如: 5.12、512.0f、.512 (必须有小数点)
- 科学计数法形式,如: 5.12e2、512E2、100E-2
- 浮点型常量的精度:
- float:单精度,尾数可以精确到7位有效数字。
- double:双精度,精度是float的两倍。通常采用此类型。
- 浮点型的常量,默认类型为double型。
- 声明float型变量时,变量值要以"f"或"F"结尾
- 通常,定义浮点型变量时,使用double型。
- float表示数值的范围比long还大。
public class Test {
public static void main(String[] args) {
double d1 = 123.3;
// 编译失败,浮点型常量,默认类型为double型
// float f1 = 12.3;
// 定义float类型变量时,变量要以"f"或"F"结尾
float f1 = 12.3F;
System.out.println(f1);
}
}
1.3、字符类型: char
- 定义char型变量,通常使用一对’',内部只能写一个字符(1字符=2字节)。
- 字符型变量的三种表现形式:
- 1、使用一对’'声明一个字符。 Java使用Unicode编码,故一个字符可以存储一个字母,汉字,或其他字符。如: char c1 = ‘a’; char c2 = ‘中’; char c3 = ‘9’;
- 2、使用转义字符‘\’。如: char c3 = ‘\n’; // 表示换行符。
- 3、直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中, XXXX代表一个十六进制整数。如: \u000a 表示 \n。
- char类型是可以进行运算的。因为它都对应有Unicode码。
public class Test {
public static void main(String[] args) {
// 1、使用一对''声明一个字符。
char c1 = 'a';// 97
// 2、使用转义字符‘\’。
char c2 = '\n';//换行符
// 3、使用 Unicode 值。
char c3 = '\u0043';
System.out.println(c3);
// 开发中非常少见,对应Unicode 中的一个字符'a'
char c4 = 97;
int i1 = (int)c1;
System.out.println(i1);//97
}
}
1.4、布尔类型: boolean
- 用来判断逻辑条件,用于流程控制:
- if条件控制语句;
- while、do-while、 for循环控制语句;
- 只能取两个值之一:true 、 false,无null。
- 不可以使用0或非0 的整数替代false和true。
- Java虚拟机中没有任何供boolean值专用的字节码指令, Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替: true用1表示, false用0表示。
public class Test {
public static void main(String[] args) {
boolean isMarried = true;
if(isMarried){
System.out.println("围城中!");
}else{
System.out.println("单身汪!");
}
}
}
2、基本数据类型变量间转换
2.1、自动类型转换(只涉及7种基本数据类型)
- 自动类型转换:当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型。
- 容量大小指的是,表示数的范围的大和小。比如:float容量要大于long的容量。
- byte,short,char之间不会相互转换,他们三者在计算时,首先转换为int类型。
- boolean类型不能与其它数据类型运算。
public class Test {
public static void main(String[] args) {
byte b1 = 12;
short s1 = 128;
int i1 = 1234;
int i2 = b1 + i1;// 1246
long l1 = b1 + i1;// 1246
float f1 = b1 + i1;// 1246.0
double d1 = s1;// 128.0
System.out.println(d1);
char c1 = 'a';//97
int i3 = c1 + b1;// 109
System.out.println(i3);
//编译失败,计算时,转换为了int类型
//byte b2 = b1 + 1;
//编译失败,计算时转换为了double类型
//float f2 = b1 + 12.3;
}
}
2.2、强制类型转换(只涉及7种基本数据类型)
- 自动类型转换的逆过程, 将容量大的数据类型转换为容量小的数据类型。
- 需要使用强转符:()
- 可能导致精度损失
- 字符串不能直接转换为基本类型, 但可以通过基本类型对应的包装类,把字符串转换成基本类型。
- boolean类型不可以转换为其它的数据类型。
public class Test {
public static void main(String[] args) {
//没有精度损失
long l1 = 123;
short s2 = (short)l1;
//精度损失举例1
double d1 = 12.9;
int i1 = (int)d1;//截断操作
System.out.println(i1);//12
//精度损失举例2
int i2 = 128;
byte b = (byte)i2;
System.out.println(b);//-128
}
}
3、基本数据类型与String间转换
String类型变量的使用
- String属于引用数据类型,翻译为:字符串;
- 声明String类型变量时,使用一对"";
- String可以和8种基本数据类型变量做运算,且运算只能是连接运算:+;
- 运算的结果仍然是String类型;
public class Test {
public static void main(String[] args) {
String s1 = "Hello World!";
System.out.println(s1);
int number = 10086;
System.out.println(s1 + number);// +:连接运算
//String str1 = 123;//编译错误
//int i = (int)s1;//编译错误
String str1 = 123 + "";
System.out.println(str1);
}
}
4、进制与进制间的转换
- 所有数字在计算机底层都以二进制形式存在。
- 对于整数,有四种表示方式:
- 二进制(binary):0,1 ,满2进1.以0b或0B开头。
- 十进制(decimal):0-9 ,满10进1。
- 八进制(octal):0-7 ,满8进1. 以数字0开头表示。
- 十六进制(hex):0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。 如:0x21AF +1= 0X21B0
public class Test {
public static void main(String[] args) {
int num1 = 0b110; // 二进制
int num2 = 110; // 十进制
int num3 = 0127; // 八进制
int num4 = 0x110A; // 十六进制
System.out.println("num4 = " + num4);
}
}
- 二进制定义整数int时,第32位是符号位;
- 二进制的整数有如下三种形式:
- 原码:直接将一个数值换成二进制数。最高位是符号位
- 负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
- 负数的补码:其反码加1。
- 计算机以二进制补码的形式保存所有数据的:
- 原因:简化运算设计,符号位也参与运算,1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法。
- 正数的原码、反码、补码都相同。
- 负数的补码是其反码+1。
- 进制的基本转换
- 十进制——》二进制:除2取余的逆
- 二进制——》十进制:乘以2的幂数
- 二进制《——》八进制:二进制中的3位表示八进制中的1位
- 二进制《——》十六进制:二进制中的4位表示八进制中的1位
- 十进制《——》八进制互转:转成二进制再转
- 十进制《——》十六进制互转:转成二进制再转
5、常见计算机字符编码:
5.1 ASCII 码
- 美国制定的一套字符编码, 规定了英语字符与二进制位之间的关系。
- 只占用了一个字节的后面7位, 最前面的1位统一规定为0。
- 缺点:
- 不能表示所有字符。
- 相同的编码表示的字符不一样。
5.2 Unicode 编码
- 所有的符号都纳入其中,每个符号唯一编码,没有乱码的问题。
- 缺点: Unicode 只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储(每个符号用几个字节表示):无法区别 Unicode 和 ASCII。
5.3 UTF-8编码
- 使用最广的一种 Unicode 的实现方式。
- 变长的编码方式。它可以使用 1-6 个字节表示一个符号,根据不同的符号而变化字节长度。
- UTF-8的编码规则:
- 单字节,最高位为0,其余7位用来对字符进行编码(等同于ASCII码)。
- 多(n)字节,第一个字节的前 n 位为1,第 n+1 位为0,剩余各位用来对字符进行编码。其余字节,最高两位为"10",剩余6位用来对字符进行编码。