455-javaSE进阶-自动装箱和自动拆箱
IntegerTest05.java
- 主要看装箱和拆箱的问题
package com.bjpowernode.javase1.integer1;
public class IntegerTest05 {
public static void main(String[] args) {
//自动装箱
//基本数据类型 --> 包装类
//100为基本数据类型,qwe为包装类,直接=,自动转换
/*那不同的数据类型进行转换,需不需要进行强制数据类型转换呢?*/
/* //答:发现自动装箱和自动拆箱,不是相同的数据类型不能进行转换,
//例如: int <--> Integer , double <--> Double */
Double qwe = 3.1415926;
//自动拆箱
//包装类 --> 基本数据类型
//qwe为包装类,a1为基本数据类型,直接=,自动转换
double a1 = qwe;
System.out.println(a1);
// z是一个引用,z是一个变量,z还是保存了一个对象的内存地址。
Integer z = 1000; // 等同于:Integer z = new Integer(1000);
/*自动装箱
* z是包装类*/
// 分析为什么这个没有报错呢?
// +两边要求是基本数据类型的数字,z是包装类,不属于基本数据类型,这里会进行自动拆箱。将z转换成基本数据类型
// 在java5之前你这样写肯定编译器报错。
System.out.println(z + 1);
/*包装类为什么可以进行加减?
* // 这里自动拆箱,+两边要求是基本数据类型的数字,现在是一个基本数据类型,然后进行加减*/
Integer a = 1000; // Integer a = new Integer(1000); a是个引用(变量),保存内存地址指向对象。
// 等价于Integer a = new Integer(1000)
/*自动装箱*/
Integer b = 1000; // Integer b = new Integer(1000); b是个引用(变量),保存内存地址指向对象。
/*自动装箱*/
System.out.println(a == b); //false
/*==比较的是内存地址,这里我觉得是不相等的,
* 因为在堆里生成了两个内存地址,a和b */
}
}
输出:
3.1415926
1001
false
进程已结束,退出代码 0
一个面试题
- 说明了缓存
- 缓存机制是为了提高效率
package com.bjpowernode.javase1.integer1;
/*
这个题目是Integer非常重要的面试题。
*/
public class IntegerTest06 {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
System.out.println(a == b); //true
/*
java中为了提高程序的执行效率,将[-128到127]之间所有的包装对象提前创建好,
放到了一个方法区的“整数型常量池”当中了,目的是只要用这个区间的数据不需要
再new了,直接从整数型常量池当中取出来。
原理:x变量中保存的对象的内存地址和y变量中保存的对象的内存地址是一样的。
*/
/*整数型常量池中已经有个很多对象*/
/*这里说到了缓存机制,主要是为了提高效率
* 提前创建好的,就像去吃饭,桌子是摆好的,下一个人去吃饭直接用桌子
* 这个桌子就可以看成缓存
* 缓存是一种优化,缓存机制可能是提前备好放到内存里
* 就像打开京东的主页面,很多图片和框架可能就是存在于内存中的,
* 直接从内存中拿,不需要从数据库里查询了,为了网页打开的效率,
* 缓存的优点:效率高 缓存的缺点:占用内存*/
System.out.println("==========");
Integer x = 128;
Integer y = 128;
System.out.println(x == y); //false
}
}
输出:
true
==========
false
进程已结束,退出代码 0