Java基本数据类型及其包装类

143 阅读5分钟

1.8种基本数据类型

逻辑类型:boolean

整数类型:byte,short,int,long

字符类型:char

浮点类型:float,double

类型字节取值范围包装类
boolean1or4字节true/falseBoolean
byte1字节-2^7~2^7-1Byte
short2字节-2^15~2^15-1Short
int4字节-2^31~2^31-1Integer
long8字节-2^63~2^63-1Long
char2字节0~65535Character
float4字节-3.4E+38-3.4E+38Float
double8字节-1.79E+308~+1.79E+308Double

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种基本数据类型分别定义了相应的引用类型,并称之为基本数据的包装类。

包装类为了解决基本类型不具备“对象”特性的问题。

基本数据类型和包装类型的区别——

  1. 包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是;

  2. 包装类型是引用的传递,基本类型是值的传递;

  3. 声明方式不同,基本数据类型不需要new关键字,而包装类型需要new在堆内存中进行new来分 配内存空间;

  4. 存储位置不同,基本数据类型直接将值保存在值栈中,而包装类型是把对象放在堆中,然后通过对象的引用来调用他们,因此,包装类的效率会比基本数据类型的效率要低。

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);

转化图