java 根本数据类型 ==和equals()比较

java 基本数据类型 ==和equals()比较
1.基本类型的存储
  Java 8种基本类型都是存储在堆栈中,例:int i = 1;String str = "hello world";也是存储在堆栈中。
   new基本类型的包装器类型和new String()都是存储在堆内存中。例Integer i = new Integer(1);String str = new String("hello world");

2.==和equels()比较的含义
  1.==是比较对象的内存地址,基本类型就是比较值
  2.java对象的equals()方法都是继承Object.equals(Object o)方法的。比较的内容其实就是使用了“==”比较对象内存地址。
public boolean equals(Object obj) {
        return (this == obj);
    }

  java8种基本类型包装器类和String类都重写了equals()方法,先比较类型在比较值,例如Long.equals(Object obj)
 public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }


3.实例==和equels()比较
int int3 = 3;
Integer integer3 = new Integer(3);
Integer integer3_2 = new Integer(3);
Integer integer3_3 = 3;
Integer integer3_4 = 3;
Integer integer321 = 321;
Integer integer321_2 = 321;
int int321 = 321;
int int321_2 = 321;
Long long3 = 3l;
System.out.println(integer3==integer3_2);          //false #1
System.out.println(integer3_3==integer3_4);        //true  #2 
System.out.println(integer3==int3);               //true   #3
System.out.println(integer3_3.equals(integer3_4)); //true   #4
		
System.out.println(integer321==integer321_2);      //false #5
System.out.println(int321==int321_2);              //true  #6 
		
System.out.println(long3==int3);                  //true  #7
System.out.println(long3.equals(int3));           //false #8


#1  new两个Integer对象,分配内存在堆中,两个地址块不同
#2 Integer integer3_3 = 3;java编译后的代码为
Integer integer3_3 = Integer.valueOf(3);

查看java Integer.valueOf(int)源码
public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
原来-128<=int<=127的值java栈中有缓存都指向同一个地址,不在这个范围内的int值都是new一个新的Integer,所以#2为true,#5为false
#3 基础类型和包装类运算时,包装类会拆包,所以就是两个值运算
#4 btye,short,int,long运算时,都会向上转型到同一类型运算
#8 equals()比较是先比较类型在比较值,类型不一样所以为false