java Integer判等问题、java基础问题

 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就可以判断是否析构了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章