Day014 包装类:装箱,封箱
java中8种基本类型又对应准备了8种包装类,8种包装类属于引用数据类型,父类是Object
-
8种基本数据类型不够用
所以sun公司又提供了对应的8种包装类型
8 种数据类型对应的包装类型名
以上八种包装类中,重点以Integer为主
-
八种包装类中其中6个都是数字对应的包装类。他们的父类都是Number,可以先研究Number中的公共方法:
Number是一个抽象类,无法实例化对象
Integer i = new Integer(123);
//基本数据类型 (转换为)-》引用数据类型 (装箱)
float f= i.floatValue();
System.out.println(f);//123.0
//将引用数据类型 (转换为)——》基本数据类型 (拆箱)
关于Integer类的构造方法,有两个:
Integer(int)
Integer(String)
出现横线表示已 过时了;
在jdk1.5之后,支持自动拆箱。和自动装箱
面试题
-
String是为啥不可变得: 我看过源代码
String类中有一个byte数组,并且这个byte数组是使用final修饰的
因为数组一旦创建长度是不可变得,并且被final修饰的引用一旦指向某个对象之后,不可再指向其他对象,所以String是不可变的。
-
Stringbuilder、stringbuffer 为什么是课可变的呢?
我看过源代码!Stringbuffer、StringBuilder内部实际上是一个byte【】数组
这个byte【】数组没有被final修饰,stirngBuffer\StringBuilder的初始化容量我记得应该是16.当存满之后会进行扩容,底层调用了数组拷贝的方法
System.arraycopy()……是这样扩容的,所以StringBuilder、StringBuffer
适合于使用字符串的频繁拼接操作
-
字符串不可变得意思
是指双引号里面的字符串对象一旦创建不可变
放在字符串常量池
自动装箱,自动拆箱
自动装箱:基本数据类型自动转换成包装类
自动拆箱:包装类自动转换成基本数据类型
有了自动拆箱之后,Number类中的方法就用不着了
Integer z =1000; 等同于 Integer z = new Integer(1000)保存的是内存地址指向对象
// == 比较的是对象的内存地址,
==这个运算符不会触发自动拆箱机制,(只有+-*/等运算的时候才会)
System.out.println(z + 1);
//“+”;两边要求是基本数据类型的数字,z是包装类,不属于基本数据类型,这里会进行自动拆箱,将z转换成基本数据类型
z是一个引用
自动拆箱,自动装箱的好处就是为了方便编程。
-
==这个运算符不会触发自动拆箱机制,(只有+-*/等运算的时候才会)
java中为了提高程序的执行效率。将{-128到127}之间所有的包装对象提前创建好放到一个方法区的“整数型常量池”当中。目的是只要用这个区间的数据不需要再new,直接从整数型常量池中取出来。
Integer中非常重要的面试题
静态代码块 在类加载时候执行
Integer类加载的时候会初始化整数型常量 池 :256个对象
池:cache,就是缓存机制
-
缓存优点:效率高
-
缓存缺点:耗费内存
缓存机制要重视,大型项目中的重要优化手段是:cache缓存机制
总结之前学过的经典异常
-
parseInt
p617
浙公网安备 33010602011771号