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,一个是常量池的,一个是堆中的。

  • 相关阅读:
    STL unique使用问题
    自定义使用动态内存的类模板
    自定义类模板 重载<<遇到的问题
    [HDU 1882]--Strange Billboard(位运算+枚举)
    动态规划---最长上升子序列问题(O(nlogn),O(n^2))
    由结构体成员地址计算结构体地址——list_entry()原理详解
    不同意义的new和delete
    new[] 到底做了什么?
    lambda表达式与bind函数
    C++之可调用对象
  • 原文地址:https://www.cnblogs.com/wangshen31/p/10476105.html
Copyright © 2011-2022 走看看