八种基本数据类型
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⼋种基本数据类型先说理论,⼋种基本数据类型:byte、short、int、long、float、double、boolean、char。
概念
byte
8位、有符号的以⼆进制补码表⽰的整数
min : -128(-2^7)
max: 127(2^7-1)
default: 0
对应包装类:Byte
short
16位、有符号的以⼆进制补码表⽰的整数
min : -32768(-2^15)
max: 32767(2^15 - 1)
default: 0
对应包装类:Short
int
32位、有符号的以⼆进制补码表⽰的整数
min : -2,147,483,648(-2^31)
max: 2,147,483,647(2^31 - 1)
default: 0
对应包装类:Integer
long
64位、有符号的以⼆进制补码表⽰的整数
min : -9,223,372,036,854,775,808(-2^63)
max: 9,223,372,036,854,775,807(2^63 -1)
default: 0
对应的包装类:Long
float
单精度、32位、符合IEEE 754标准的浮点数
float 在储存⼤型浮点数组的时候可节省内存空间
浮点数不能⽤来表⽰精确的值,如货币
default: 0.0f
对应的包装类:Float
double
双精度、64位、符合IEEE 754标准的浮点数
浮点数的默认类型为double类型
double类型同样不能表⽰精确的值,如货币
default: 0.0d
对应的包装类:Double
char
char类型是⼀个单⼀的 16 位 Unicode 字符
最⼩值是 \u0000(即为0)
最⼤值是 \uffff(即为65,535)
char 数据类型可以储存任何字符
对应的包装类:Character
boolean
boolean数据类型表⽰⼀位的信息
只有两个取值:true 和 false
这种类型只作为⼀种标志来记录 true/false 情况
对应的包装类:Boolean
实例
对于数值类型的基本类型的取值范围,我们⽆需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。
请看下⾯的例⼦:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
// byte
System.out.println("基本类型:byte ⼆进制位数:" + Byte.SIZE);
System.out.println("包装类:ng.Byte");
System.out.println("最⼩值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
System.out.println("最⼤值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
System.out.println();
// short
System.out.println("基本类型:short ⼆进制位数:" + Short.SIZE);
System.out.println("包装类:ng.Short");
System.out.println("最⼩值:Short.MIN_VALUE=" + Short.MIN_VALUE);
System.out.println("最⼤值:Short.MAX_VALUE=" + Short.MAX_VALUE);
System.out.println();
// int
System.out.println("基本类型:int ⼆进制位数:" + Integer.SIZE);
System.out.println("包装类:ng.Integer");
System.out.println("最⼩值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最⼤值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println();
// long
System.out.println("基本类型:long ⼆进制位数:" + Long.SIZE);
System.out.println("包装类:ng.Long");
System.out.println("最⼩值:Long.MIN_VALUE=" + Long.MIN_VALUE);
System.out.println("最⼤值:Long.MAX_VALUE=" + Long.MAX_VALUE);
System.out.println();
// float
System.out.println("基本类型:float ⼆进制位数:" + Float.SIZE);
System.out.println("包装类:ng.Float");
System.out.println("最⼩值:Float.MIN_VALUE=" + Float.MIN_VALUE);
System.out.println("最⼤值:Float.MAX_VALUE=" + Float.MAX_VALUE);
System.out.println();
// double
System.out.println("基本类型:double ⼆进制位数:" + Double.SIZE);
System.out.println("包装类:ng.Double");
System.out.println("最⼩值:Double.MIN_VALUE=" + Double.MIN_VALUE);
System.out.println("最⼤值:Double.MAX_VALUE=" + Double.MAX_VALUE);
System.out.println();
// char
System.out.println("基本类型:char ⼆进制位数:" + Character.SIZE);
System.out.println("包装类:ng.Character");
// 以数值形式⽽不是字符形式将Character.MIN_VALUE输出到控制台
System.out.println("最⼩值:Character.MIN_VALUE="+ (int) Character.MIN_VALUE);
// 以数值形式⽽不是字符形式将Character.MAX_VALUE输出到控制台
System.out.println("最⼤值:Character.MAX_VALUE="+ (int) Character.MAX_VALUE);
}
}
结果:
基本类型:byte ⼆进制位数:8
包装类:ng.Byte
最⼩值:Byte.MIN_VALUE=-128
最⼤值:Byte.MAX_VALUE=127
基本类型:short ⼆进制位数:16
包装类:ng.Short
最⼩值:Short.MIN_VALUE=-32768
最⼤值:Short.MAX_VALUE=32767
基本类型:int ⼆进制位数:32
包装类:ng.Integer
最⼩值:Integer.MIN_VALUE=-2147483648
最⼤值:Integer.MAX_VALUE=2147483647
基本类型:long ⼆进制位数:64
包装类:ng.Long
最⼩值:Long.MIN_VALUE=-9223372036854775808
最⼤值:Long.MAX_VALUE=9223372036854775807
基本类型:float ⼆进制位数:32
包装类:ng.Float
最⼩值:Float.MIN_VALUE=1.4E-45
最⼤值:Float.MAX_VALUE=3.4028235E38
基本类型:double ⼆进制位数:64
包装类:ng.Double
最⼩值:Double.MIN_VALUE=4.9E-324
最⼤值:Double.MAX_VALUE=1.7976931348623157E308
基本类型:char ⼆进制位数:16
包装类:ng.Character
最⼩值:Character.MIN_VALUE=0
最⼤值:Character.MAX_VALUE=65535
Float和Double的最⼩值和最⼤值都是以科学记数法的形式输出的,结尾的“E+数字”表⽰E之前的数字要乘以10的多少倍。
⽐如3.14E3就是3.14×1000=3140,
3.14E-3就是3.14/1000=0.00314。
关系
1、⾃动类型转换
⾃动类型转换,也称隐式类型转换,是指不需要书写代码,由系统⾃动完成的类型转换。
由于实际开发中这样的类型转换很多,所以 Java 语⾔在设计时,没有为该操作设计语法,⽽是由 JVM⾃动完成。
转换规则:从存储范围⼩的类型到存储范围⼤的类型。
具体规则为:byte→short(char)→int→long→float→double
也就是说 byte 类型的变量可以⾃动转换为 short 类型,⽰例代码:
byte b=10;
short sh=b;
这⾥在给sh赋值时,JVM⾸先将b的值转换成short类型然后再赋值给sh。
当然,在类型转换的时候也可以跳跃,就是byte也可以⾃动转换为int类型的。
注意问题:在整数之间进⾏类型转换的时候数值不会发⽣变化,但是当将整数类型特别是⽐较⼤的整数类型转换成⼩数类型的时候,由于存储精度的不同,可能会存在数据精度的损失。
2、强制类型转换
强制类型转换,也称显式类型转换,是指必须书写代码才能完成的类型转换。
该类类型转换很可能存在精度的损失,所以必须书写相应的代码,并且能够忍受该种损失时才进⾏该类型的转换。
转换规则:从存储范围⼤的类型到存储范围⼩的类型。
具体规则为:double→float→long→int→short(char)→byte
语法格式为:(转换到的类型)需要转换的值
double d=3.14;
int i=(int) d;
注意问题:强制类型转换通常都会存储精度的损失,所以使⽤时需要谨慎。
3.运算
同类型之间运算,只需注意考虑临界值的问题。
⾮同类型之间,会⽤到上⾯的1、2 转换相同类型进⾏运算。
经典⾯试题
1、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 +=1;有什么错?
答:对于short s1=1;s1=s1+1来说,在s1+1运算时会⾃动提升表达式的类型为int,那么将int赋予给short类型的变量s1会出现类型转换错误。
对于short s1=1;s1+=1来说 +=是java语⾔规定的运算符,java编译器会对它进⾏特殊处理,因此可以正确编译。
2、char类型变量能不能储存⼀个中⽂的汉⼦,为什么?
char类型变量是⽤来储存Unicode编码的字符的,unicode字符集包含了汉字,所以char类型当然可以存储汉字的,还有⼀种特殊情况就是某个⽣僻字没有包含在unicode编码字符集中,那么就char类型就不能存储该⽣僻字。
3、Integer和int的区别
int是java的8种内置的原始数据类型。
Java为每个原始类型都提供了⼀个封装类,Integer就是int的封装类。
int变量的默认值为0,Integer变量的默认值为null,这⼀点说明Integer可以区分出未赋值和值为0的区别,⽐如说⼀名学⽣没来参加考试,另⼀名学⽣参加考试全答错了,那么第⼀名考⽣的成绩应该是null,第⼆名考⽣的成绩应该是0分。
关于这⼀点Integer应⽤很⼤的。
Integer类内提供了⼀些关于整数操作的⼀些⽅法,例如上⽂⽤到的表⽰整数的最⼤值和最⼩值。
4、switch语句能否作⽤在byte上,能否作⽤在long上,能否作⽤在string上?
byte的存储范围⼩于int,可以向int类型进⾏隐式转换,所以switch可以作⽤在byte上
long的存储范围⼤于int,不能向int进⾏隐式转换,只能强制转换,所以switch不可以作⽤在long上
string在1.7版本之前不可以,1.7版本之后switch就可以作⽤在string上了
5.是否存在 x>x+1?为什么?
这就是临界值,当x=最⼤值时;再加1(根据⼆进制运算+1)就超过了它的临界值,刚好会是它最⼩值。
举个例⼦吧,byte 8位, -128 ~ 127
127 ⼆进制: 0111 1111
1 ⼆进制: 0000 0001
相加结果: 1000 0000
byte 8位有符号, 1000 0000 刚好为 -128
public class Test {
public static void main(String[] args) {
// int
System.out.println("基本类型:int ⼆进制位数:" + Integer.SIZE);
System.out.println("包装类:ng.Integer");
System.out.println("最⼩值:Integer.MIN_VALUE=" + Integer.MIN_VALUE);
System.out.println("最⼤值:Integer.MAX_VALUE=" + Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE+1);
}
}
结果:
基本类型:int ⼆进制位数:32
包装类:ng.Integer
最⼩值:Integer.MIN_VALUE=-2147483648
最⼤值:Integer.MAX_VALUE=2147483647
-2147483648。