三、Java架的基本类型
八种基本类型
3.1 int
-整数的直接量为int
直接量(lieral)表示直接写出的整数
int a = 100;//100就是直接写出整数,类型默认为int。
整数直接量必须在int范围内
除了十进制书写形式外,整数的直接量经常表示为十六进制数值,0X或0x或者八进制的0开头
int c = 0x10;//16进制整数直接量
int d = 020;//8进制整数直接量
System.out.println(c);//16
System.out.println(d);//16
整数的除法运算的取整
除法运算保留整数部分,舍弃小数部分
//2.整数除法运算中的取整
int q = 5/3;//1
System.out.println(q);
int total = 87;
int error = 23;
int percent = error / total * 100;
System.out.println(percent + " %");//0
percent = 100 * error / total;
System.out.println(percent + "%");//26
运算数要防止溢出发生
整数运算的溢出:两个整数进行运算时,其结果可能会超出整数的范围而产生溢出。
//3.防止整数运算发生溢出
byte w = (byte)(127 + 1);
System.out.println(w);//-128
3.2 long
表示较大整数的时候,int范围不够的情况下,范围:-2^63 ~(2^63)-1
表示long类型的直接量,需要以L或I结尾。
long l1 = 2147483647;//对的
long l2 = 2147483648;//编译错误,超出整数直接量的范围,也就是int值得范围。
3.2.1 long类型进行较大整数的运算
较大整数:超过int范围的整数
long distance1 = 1000*365*24*299792458;//使用较大整数运算
/*
* 4个int类型的值相乘结果一定为int,且超出了int的范围,
* 再将值赋值给long类型,则结果时错误的
*/
System.out.println(distance1);//4个int相乘结果一定为int,则超出int范围导致溢出!
long distance2 = 1000*365*24*299792458L;
System.out.println(distance2);//4个int乘long,结果一定为long
3.2.2 通过时间毫秒数来存储时间和日期
- JDK提供了一个方法,返回1970年1月1日0点0分0秒到此时此刻所经历的毫秒数,其数据类型为long。
long time = System.currentTimeMillis();
System.out.println(time);
3.2.2.1 案例(计算程序运行时间)
public static void main(String[] args) {
// TODO Auto-generated method stub
long time = System.currentTimeMillis(); //获得系统的时间,单位为毫秒
//一个程序
try {
Thread.sleep(1000); //线程休眠
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long time2 = System.currentTimeMillis();
System.out.println(time2 - time);
}
3.3 double
浮点型,小数,包括float和double
double类型的精确度是fload 的两倍,因此double叫双精度浮点数。
3.3.1 浮点数的直接量为double类型
小数的写法有以下几种:
通常写法:3.14、314.0
科学计数法:1.25E2、1.25e2、1.25E-2
eg:1.25E2 1.25*10^2=125.0
默认浮点直接量为double类型。如果需要表示float类型,则需要在末尾加F或f。
float f = 1.253555155F;
3.3.2 double运算时会出现舍入误差(面试)
二进制无法舍入误差
确切的表示1/10,就和10进制无法精确表示1/3一样
二进制表示进制可能会有误差
double money = 3.0;
double price =2.9;
System.out.println(money - price);//输出结果为0.100000000009 舍入误差!
3.4 char
本质16位无符号的整数,对应的字符集的编码。
采用的编码是Unicode编码(世界通用的定长字符集,所有字符都是16位)。
//字符型
char c1 = '中';
char c2 = '\u4e2d';
char c3 = (char) (c1 + 1);
int i = '中' + 1;//'中' 20013
//0000 0000 0001 0000 == 16
int z = '中';//20013
char c4 = '1';
char c5 = 1;//ASCII码值
System.out.println(c1);//中
System.out.println(c2);//中
System.out.println(c3);//不认识的汉字 丮
System.out.println(i);//20014
System.out.println(z);//20013
System.out.println(c4);//1
System.out.println(c5);//_
3.4.1 对char型变量进行赋值
整数变量:0~65535之间的整数数值
字符直接量:用单引号括起来的内容就为字符的实际内容’A’、‘1’
Unicode形式:‘\u004e’、‘\u4e2d’,Unicode的16进制形式
//1.char型变量赋值
char c1 = 65;
char c2 = 'A';
char c3 = '\u0041';
System.out.println(c1);//A
System.out.println(c2);//A
System.out.println(c3);//A
3.4.2 使用转义字符
对于不方便输出的字符采用转义
转义 | 含义 |
---|---|
\n | 回车符 |
\r | 换行符 |
’ | 单引号 |
" | 双引号 |
\ | 单斜杠 |
3.5 boolean
boolean是逻辑运算类型
赋值只有TRUE或者FALSE
经常用于存储关系运算的结果值
//2.逻辑运算
int age = 18;
boolean isChild = age > 16;
System.out.println(isChild);//true
3.6 基本数据类型之间的转化(重点)
3.6.1 基本类型转换
自动类型转换(隐式类型转换):小类型–>大类型
可以自动转换的,且大小关系如下图:
强制类型转换:大类型–>小类型
需要转化符,格式为:(需要转换的类型)变量
注意:转换过程中可能会出现精度丢失或溢出。
3.6.2 强制转化的精确度丢失和溢出
//3.精度丢失和溢出
int a = 100;
int b = 200;
long c = a + b;//自动类型转换
System.out.println(c);//300
long l1 = 1024l;
int i = (int)l1;//强制类型转换
System.out.println(i);//1024 没有超出int的范围
long l = 1024L*1024*4*1024;
int j = (int)l;
System.out.println(j);//0 当超过long的最大值就会返回到long的最小值重新计时(就像一个环形球一样)
double pi = 3.141592654789456132; //最大输出小数点后15位
double pi1 = 3.141592654789456132; //最大输出小数点后7位
精度丢失:转化后存储的小数位不是原来的小数位。
3.6.3 数值运算时的自动转换
多种基本类型参与的表达式运算中,运算结果会自动向较大的类型转换。
//3.多种基本类型参与运算会向较大类型转换
long l3 = 123*456*789L;//int*int*long 向long转化
double d = 500-599.0;//-99.0
double persent2 = 80/100.0;//0.8
3.6.4 byte、short、char转换为int
byte、short、char实际存储数值都为整数
在参与运算时,将会byte、short、char都转化为int在进行运算。
short x = 12;
byte y = 3;
char z = 'A';
int res = x + y + z;//65+3+12
System.out.println(res);//80