zoukankan      html  css  js  c++  java
  • Integer一类的比较问题

    总体主要分为两个方面
    ①比较的是值
    一、基本数据类型与引用数据类型进行比较时,引用数据类型会进行拆箱(自动拆装箱需要在jdk1.5以上),然后与基本数据类型进行值的比较
    举例:
    int i = 12;
    Integer j = new Integer(12);
    i == j 返回的是true


    二、引用数据类型与基本数据类型进行比较(equals方法),基本数据类型会进行自动装箱,与引用数据类型进行比较,Object中的equals方法比较的是地址,但是Integer类已经重写了equals方法,只要两个对象的值相同,则可视为同一对象,具体看API文档,所以这归根到底也是值的比较!
    举例:
    int i = 12;
    Integer j = new Integer(12);
    j.equals(i) 返回的是true


    ②比较的是地址
    一、如果引用数据类型是这样 Integer i = 12;直接从常量池取对象,这是如果数值是在-128与127之间,则视为同一对象,否则视为不同对象
    举例:
    Integer i = 12; Integer j = 12; i == j 返回的是true
    Integer i = 128; Integer j = 128; i == j 返回的是false

    在编译Integer i = 12的时候,被翻译成Integer i = Integer.valueOf(12),而valueOf()会对-128到127之间的数进行缓存。

    二、如果引用数据类型是直接new的话,不管值是否相同,这时两个对象都是不相同的,因为都会各自在堆内存中开辟一块空间
    举例:
    Integer i =new Integer(12);
    Integer j = new Integer(12);
    i == j 这时返回的是false


    三、从常量池取对象跟new出来的对象也是不同的
    举例:
    Integer i = 12;
    Integer j = new Integer(12)
    i == j 这时返回的是false,一个是常量池的,一个是堆中的。

  • 相关阅读:
    boost之实用工具
    boost之内存池
    boost之智能指针
    boost之日期date_time
    boost之时间timer
    boost之网络通信
    boost之定时器和io_service
    【Linux 线程】线程同步《一》
    【Linux 线程】常用线程函数复习《四》
    【Linux 线程】常用线程函数复习《三》
  • 原文地址:https://www.cnblogs.com/wangshen31/p/10476105.html
Copyright © 2011-2022 走看看