本文列举一些关于Java基础的数据类型相关考点,方便以后复习查看
- Java 中的哪几种基本数据类型了解么?它们的默认值和占用空间大小知道不? 说说这八种数据类型对应的包装类型
基本类型和包装类型的区别?
int 和 Integer 的区别
为什么要有包装类型 ?
包装类型的缓存机制了解么?
自动装箱与拆箱了解吗?原理是什么?
遇到过自动拆箱引发的NPE问题么 ?
String 怎么转成 Integer 的?原理?
Java一共有八种数据类型分别为 byte short int long float double char boolean.
默认值 : byte-0 ,int-0 ,short-0, long-0L, float- 0.0f, double-0.0d char- '\u0000' , boolean-false
占用空间大小 : byte -1字节,short-2字节,int-4字节,long-8字节,float-4字节,double-8字节,char-2字节boolean-不确定.
对应的包装类型 : byte - Byte,int-Integer,short-Short,long-Long,float-Float,double-Double,boolean-Boolean.
默认值 : 基本类型都有自己的默认值,包装类型的默认值都是null
用于泛型 : 基本类型不能用于泛型,包装类可以用于泛型
存储区域 : 如果基本类型用于成员变量那存放在堆中,用于局部变量或者方法参数就会存放在Java虚拟机栈中. 而包装类型是对象类型(引用类型) 存放在堆中
占用空间 : 基本数据类型存放的数值都是在栈中,而包装类型在栈中存储对象的引用并且指向队中的对象, 相比于基本数据类型来说,包装类型要占用更多的内存空间
判断值相等时不同 : 对于==来说,如果是基本数据类型比较的是值,如果是引用数据类型(包装类型)比较的是两个变量的地址是否相等,对于equals来说,如果引用类型没有重写equals与==一样,如果重写了比较的是内容-->包装类一般都默认重写了equals,建议引用类型(对象类型)使用equals比较.基本数据类型使用==比较
默认值 : int默认值为0,Integer默认值为null
泛型 : int不能用于泛型,Integer是包装类型可以用于泛型
数据类型区别 : int是基本数据类型,Integer是包装类型
存储方式不同 : int类型直接在内存中存储的是值类型,放在栈中,而Integer类型在内存中存放的是对象的引用,指向堆空间中的对象.
实例化方式不同 : Integer需要实例化,int不需要
变量的比较不同 : 基本类型的比较相等使用==,包装类型使用equals比较的才是内容
为什么要有包装类型 ?
Java是属于面向对象的编程语言,为了让基本数据类型也有面向对象特征,就出现了包装类型.(在 Java 中,万物皆对象,所有的操作都要求用对象的形式进行描述比如 hashCode() 获取哈希值,或者 getClass() 获取类等.), 基本数据类型都有对应的包装类型,两者可以进行互相转化,这个过程叫做拆箱和装箱.
包装类型可以在集合中使用(比如在使用ArrayList的时候泛型的参数里只能使用包装类型),而基本类型不能用于泛型.
包装类型的缓存机制了解么?
Java中大部分包装类型都实现了缓存机制
Byte,Short,Integer,Long实现了缓存机制,这四种包装类创建了在[-127,128]范围内的缓存数据. 对于Character 创建了[0,127]范围内的缓存数据. Boolean直接返回True或者false,
而Float,Double则没有缓存机制.
- 缓存的作用是什么 ?
缓存的作用就是提高性能和节省内存-通过使用相同的对象引用实现了缓存与重用,
会在第一次使用包装类型的时候需要额外的一定时间来初始化这个缓存,下次如果使用的数字在缓存的范围内,可以直接使用相同的对象,不用在重新创建新的包装类对象了.
对于Integer类比较特殊,在Java6中可以通过Integer.IntegerCache.high来设置最大值,使得我们可以根据应用程序的实际情况来调整数值提高性能. Byte,Short,Long 缓存范围固定不能改变
- 那为什么 选择[-128,127]之间这个数值范围呢 ?
因为这个数值范围是最被广泛使用的.
自动装箱与拆箱了解吗?原理是什么?
自动装箱 : 把基本数据类型赋值给(转换)包装类型(将基本数据类型用对应的引用类型包装起来)
自动拆箱 : 将包装类型赋值给(转换)基本数据类型
Integer i = 10;//自动装箱
int n = i;//自动拆箱
自动装箱的原理是使用包装类的valueOf()方法(比如Integer a = Integer.valueOf(10))
自动拆箱的原理是使用包装类的xxxValue()方法(比如 int b= Integer.intValue(a))
我们如果想使用包装类型的话建议使用valueOf因为这样如果用的数字在缓存范围内是直接从缓存中取,否则new是直接创建一个对象,没有利用缓存.没有节省内存.
public static void main(String[] args) {
//对象的比较强烈建议使用equals比较
Integer in1= new Integer(127);//堆中
Integer in2 = new Integer(127);//堆中
System.out.println(in1==in2);//false (都是new的->两个不同的对象->地址不同)
System.out.println(in1.equals(in2));//true (比较的是内容)
//超过缓存范围不能重用对象
Integer in3= new Integer(128);//堆中
Integer in4 = new Integer(128);//堆中
System.out.println(in3==in4);//false (都是new的->两个不同的对象->地址不同)
System.out.println(in3.equals(in4));//true (比较的是内容)
Integer in5= 128;//堆中
Integer in6 = 128;//堆中
System.out.println(in5==in6);//false (超过缓存范围不能重用对象)
System.out.println(in5.equals(in6));//true (比较的是内容)
Integer in7= 127;//常量池中
Integer in8 = 127;//常量池中
System.out.println(in7==in8);//true (没有超出缓存范围可以重用对象)
System.out.println(in7.equals(in8));//true (比较的是内容)
Integer tt2 = Integer.valueOf(99);//常量池 利用的缓存
int tt3 = 99;
System.out.println(tt2 == tt3);// true
}
遇到过自动拆箱引发的NPE问题么 ?
稍后补充...
参考 :
Java 面试指南 | JavaGuide(Java面试+学习指南)
<<深入理解Java核心技术>>
面试官:int和Integer有什么区别?为什么要有包装类? - 掘金