1.8种基本数据类型
逻辑类型:boolean
整数类型:byte,short,int,long
字符类型:char
浮点类型:float,double
| 类型 | 字节 | 取值范围 | 包装类 |
|---|---|---|---|
| boolean | 1or4字节 | true/false | Boolean |
| byte | 1字节 | -2^7~2^7-1 | Byte |
| short | 2字节 | -2^15~2^15-1 | Short |
| int | 4字节 | -2^31~2^31-1 | Integer |
| long | 8字节 | -2^63~2^63-1 | Long |
| char | 2字节 | 0~65535 | Character |
| float | 4字节 | -3.4E+38-3.4E+38 | Float |
| double | 8字节 | -1.79E+308~+1.79E+308 | Double |
byte型
java中不存在byte型常量的表示方法,但可以把一定范围内的int型常量赋值给byte型变量。
short型同样不存在常量的的表示方法。
long型
在long型变量的声明中,数字后加L
long a=11111111L;
char型
使用单引号括起的Unicod表中的一个字符。
char a='s';
Char型可以赋值数字对应的是数字在Unicode表中对应的字符。
char a=97;
System.out.println(a);
对于无法直接输入的字符,可以使用转义字符。
char ch='\n';//换行
可以通过类型转换输出字符在Unicode表中的位置
char a='a';//a在表中的位置
int b=(int)a;
System.out.println(b);
float型
声明时数字后加f或F
float x=22.34f;
float w=222.231F;
float变量在存储float型数据时保留8位有效数据(相对于double称为单精度)
如将12345.123456789f赋值给float型变量x,x=12345.123456789f,那么x存储的实际值是:
12345.123046875(下划线为八位有效数字)。
double类型
声明时可在数字后加d或D,但允许省略。double型数据保留16位有效数字(相对于float称为双精度)。
float x=0.4f;//单精度
double y=0.4;//双精度
对于上式,由于y的有效位大于x的,因此y中的值小于x的值。
类型转换
精度从低到高
Byte short char int long float double
当把级别低的赋值给级别高的,自动完成数据类型的转换。
2.8种包装类
Java是面向对象的编程语言,但它也包含了8种基本数据类型。这8种数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备“对象”的特性:没有成员变量、方法可以被调用。这8种数据类型带来了一定的方便性,例如可以进行简单、有效的常规数据处理。但在某些时候,基本数据类型会有一些制约,例如所有引用类型变量都继承了Object类,都可以当成Object类型变量使用。但基本数据类型的变量就不可以。为了解决8种基本数据类型的变量不能当成Object类型变量使用的问题,Java提供了包装类的概念,为8种基本数据类型分别定义了相应的引用类型,并称之为基本数据的包装类。
包装类为了解决基本类型不具备“对象”特性的问题。
基本数据类型和包装类型的区别——
-
包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是;
-
包装类型是
引用的传递,基本类型是值的传递; -
声明方式不同,基本数据类型不需要new关键字,而包装类型需要new在堆内存中进行new来分 配内存空间;
-
存储位置不同,基本数据类型直接将值保存在值栈中,而包装类型是把对象放在堆中,然后通过对象的引用来调用他们,因此,包装类的效率会比基本数据类型的效率要低。
5.初始值不同,比如:int的初始值为0、boolean的初始值为false,而包装类型的初始值为null;
装箱和拆箱
即包装类和基本类型的转换
装箱:根据数据创建对应的包装对象。
Integer i = new Integer(3);//手动装箱
Integer i = Integer.valueOf(3);//手动
Integer j = 4;//jdk1.5 之后可以通过这种方式自动装箱
拆箱:将包装类型转换为基本数据类型。
int index2 = j.intValue();//手动拆箱
int index1 = j;//自动拆箱
装箱后就可以像类一样调用各种方法
自动装箱的弊端
自动装箱有一个问题,那就是在一个循环中进行自动装箱操作的情况,如下面的例子就会创建多余的对象,影响程序的性能。
Integer sum = 0;
for(int i=1000; i<5000; i++){
sum+=i;
}
上面的代码sum+=i可以看成sum = sum + i,但是+这个操作符不适用于Integer对象,首先sum进行自动拆箱操作,进行数值相加操作,最后发生自动装箱操作转换成Integer对象。其内部变化如下
int result = sum.intValue() + i;
Integer sum = new Integer(result);
由于我们这里声明的sum为Integer类型,在上面的循环中会创建将近4000个无用的Integer对象,在这样庞大的循环中,会降低程序的性能并且加重了垃圾回收的工作量。因此在我们编程时,需要注意到这一点,正确地声明变量类型,避免因为自动装箱引起的性能问题。
对象的比较
对于基本数据类型可以采用“==”比较,但包装类使用equals
“==”比较引用,equals比较值
基本数据类型比较值,包装类是引用
包装类方法举例
//将字符串转化为数字
String qq="10000";
Integer a=Integer.parseInt(qq);//int型
Integer a=Integer.valueOf(qq);//Integer型
System.out.println(a);
转化图