淘先锋技术网

首页 1 2 3 4 5 6 7

首先数据类型分为基本类型和引用类型。
基本类型(float、double、byte、short、int、long、char、boolean):变量直接存储的是值;
引用类型:存储的是内存地址。

对于数值,equals和 == 的比较
1、equals和==都是比较两个对象的引用是否相等,即是否指向同一个对象。
在这里插入图片描述

2、equals方法不能作用于基本类型的比较,也即 基本类型的比较只能使用==

特殊情况:
(1)Integer、int

  • 对于Integer a = 127,编译器会把Integer a = 127转换为 Integer.valueOf(127),查看源码可以知道这个转换在内部是做了缓存,当数值在【-128,127】之间时才有缓存,否则还是生成的一个新对象。所以:
Integer i = 25;
Integer j = 25;
i==j;//true;

Integer m = 129;
Integer n = 129;
m==n;//false;
m.intValue()==n;//true;因为intValue将m作为int类型
  • 怎么改变Integer缓存在【-128,1000】?设置JVM参数:-XX:AutoBoxCacheMax=1000
  • 使用== 对一个127直接赋值的Integer和new Integer(127)判断
Integer i = 127;
Integer j = new Integer(127);
i==j;// false

原因:new出来的对象是始终不走缓存的对象,比较两个新对象,结果肯定是不一样的。

  • 使用 == 对一个直接赋值128的Integer对象和另一个值为128的int基本类型判等
Integer i = 128;
int j = 128;
i==j;//true

原因:Integer i = 128;是拆箱后再比较,拆箱后就是int,int类型是基本类型(比较的是值)

总结:比较Integer的值使用equals或者Integer.intValue(),比较int只能使用==

(2)String的equals
首先equals本来比较的就是两个对象是不是相等(内存地址),但是在String中有重写equals方法,它首先判断的是两个对象的引用是否指向同一内存地址,是的话就返回true ,否则继续往下走,往下走时,判断是否为String类的对象,然后比较两个字符串的长度和内存,当都相等的时候就返回true ,否则返回false。

String a = “sss”;//String作为基本类型来使用,如果值不同,对象就不相同。这里涉及到String池
String是不可变的,new String(“sss”),首先会在String池中创建一个对象“abc”,由于有new,所以会分配地址空间,复制String池的内容,当出现的String对象在String池中不存在时才会在String池中创建该对象。
所以

String a = "sss";
String b = "sss";
a==b;//true.都是String池里的对象