1、作为Java程序员,了解堆和栈,是最基础的基本功。一句话总结堆和栈的作用,就是:堆放对象栈放常量,当然,栈也放了其他一些东西,比如基本类型。
今天说说常量池,这东西是jdk1.5提供的一个“缓存池”,包装类型Integer 在赋值时,比如Integer a = 10,这个时候我们会考虑,这个a是个对象吧,那它应该存放在堆里面咯,但事实是这样吗?当a的范围在-128到127之间时,a的“数值”是存放于常量池的。
所以,当我们遇到面试题,integer之间判断大小,用==吗?integer和int比较大小,用==吗?之类的问题时,我们要明白其中的“隐藏点”。integer是对象,但不代表它的应用对象在值相同的情况下用==比较就为false,原因就在于缓存池!对象之间比较,比较值用equals方法,==比较的是引用地址。
但是当integer a =100,integer b = 100,a==b时,得到的结果是true,
Integer里弄了一个缓存,对于在 -128—127 之间的数值,会直接使用该缓存里的对象
也就是说 Integer c = 3 或者 Integer c = Integer.valueOf(3) ,最终 c 得到的是Integer里的缓存对象
Integer a=100;
Integer b=100;
Integer a1=111110;
Integer b1=111110;
System.out.println(a==b);
System.out.println(a1.equals(b1));
System.out.println(a1==111110); 被强制比较值
System.out.println(Objects.equals(a1,b1));
true
true
true
false
2、如何判断一个对象是否已经被回收:
1、通过弱引用来判断
2、如果对象已经被GC回收,那么很明显你是无法访问它的.而如果你可以访问到它,就说明这个对象还没被GC回收
3、给你要管理的每个对象分配一个ID,在对象析构的时候,把其ID写入到一个全局Hashtable里,后面你以ID为Key就可以判断是否析构了