摘要
在Java基础中,数据类型及其对应的包装类是我们必学的内容,但是大部分学习者对其中的一些地方还是处在模棱两可的理解,本文我将针对这部分内容需要注意的地方做一些总结
相关问题
1.Java中的基本数据类型占几个字节
在Java中,
byte,boolean占1个字节,对应的包装类型分别为Byte Boolean
char short占2个字节,对应的包装类型分别为Character Short
int float占4个字节,对应的包装类型为Integer Float
long double占8个字节,对应的包装类型为Long Double
2.基本数据类型与包装类的区别
在Java中,数据类型分为两大类,基本数据类型与引用类型,所以在程序中,当基本书库类型和包装类的对象作为类的实例变量时,默认初始值是不同的。包装类对象的默认初始值为null,基本数据类型变量默认初始值根据变量类型不同而不同,入int整型的默认初始值为0等,另外,包装类是不可变类
我们来看看代码
public class DataTypeTest {
byte b;
Byte b1;
boolean bb;
Boolean bb1;
char c;
Character c1;
short s;
Short s1;
Integer i;
int i1;
float f;
Float f1;
double d;
Double d1;
long l;
Long l1;
public static void main(String[] args){
System.out.println("byte-->"+new DataTypeTest().b);
System.out.println("Byte-->"+new DataTypeTest().b1);
System.out.println("boolean-->"+new DataTypeTest().bb);
System.out.println("Boolean-->"+new DataTypeTest().bb1);
System.out.println("char-->"+new DataTypeTest().c);
System.out.println("Character-->"+new DataTypeTest().c1);
System.out.println("short-->"+new DataTypeTest().s);
System.out.println("Short-->"+new DataTypeTest().s1);
System.out.println("int-->"+new DataTypeTest().i);
System.out.println("Integer-->"+new DataTypeTest().i1);
System.out.println("float-->"+new DataTypeTest().f);
System.out.println("Float-->"+new DataTypeTest().f1);
System.out.println("double-->"+new DataTypeTest().d);
System.out.println("Double-->"+new DataTypeTest().d1);
System.out.println("long-->"+new DataTypeTest().l);
System.out.println("Long-->"+new DataTypeTest().l1);
}
}
打印结果
byte-->0
Byte-->null
boolean-->false
Boolean-->null
char-->
Character-->null
short-->0
Short-->null
int-->0
Integer-->null
float-->0.0
Float-->null
double-->0.0
Double-->null
long-->0
Long-->null
3.在声明时需要注意的问题
1.我们在声明一个小数时应该使用double类型,比如1.2默认就是double类型的,一次对float类型的变量进行赋值的时候需要进行类型转换。如float i = 1.2f;
2.null不是一个合法的Object实例,所以虚拟机并没有为其分配内存,null仅仅用于表明该引用目前没有指向任何对象。
4.缓存策略
以Integer为例来说下缓存策略,对于Integer缓存,在类加载时就将-128到127的Integer对象创建了,并保存在cache数组中(Integer cache[]),一旦程序调用Integer.valueOf(i)方法,如果i的值在-128到127之间,就直接在cache缓存数组中去取Integer对象,不在此范围的话,就创建新的包装对象。这就是Integer的缓存策略。
我们可以看看Integer valueOf(i)的方法的源码:
public static Integer valueOf(int i){
if(i >= -128 && i < IntegerCache.high){
return IntegerCache.cache[i+128];
}else{
return new Integer(i);
}
}
同理 Short的缓存范围在(-128——127),Long的范围为(-128——127),Float和Double没有缓存
下面是测试代码:
public class DataTypeTest {
public static void main(String[] args){
Integer integer1 =3;
Integer integer2 = 3;
System.out.println(integer1 ==integer2);
Integer integer3 = 300;
Integer integer4 = 300;
System.out.println(integer3 == integer4);
Integer a3 = new Integer(100);
Integer a4 = new Integer(100);
System.out.println(a3 ==a4);
int a = 1000,b=1000;
System.out.println(a==b);
Integer c =1000,d=1000;
System.out.println(c==d);
Integer e =100,f=100;
System.out.println(e==f);
}
}
输出结果
true
false
false
true
false
true
另外,当Integer对象与int类型数值进行比较的时候,Integer会自动拆箱成为int类型再进行比较
5.原始数据类型与包装类作为参数传递时,都是按值传递
我们知道,Java方法中的参数的传递方式都是按值传递,当需要传递的参数为原始数据类型时,传递的是保存栈内存中的值,如果传递的参数为包装类型时,传递的是保存在栈内存中的包装类型的引用。