java 中==运算符与equals方法的区别
目录
java 中==运算符与equals方法的区别
使用equals()比较:
比较内容,内容相同则返回true;
使用==比较:
比较的是他们所指向的地址
内存空间
栈----存放类的引用地址
常量池----存放常量
堆----存放new创建的对象
对于字符串:
对于包装类:
one == two 【false】 对象vs对象 判断【两个引用】(地址)是否一致 ,one和two都是100,但用了两个new就是申请了两个不同的地址。
three == 100;实际完成的是一个自动拆箱的操作,包装类对象three还原出来的100这个数值。
three == four;
valueof(()方法的[-128,127]缓存区:
Integer four = 100;装箱操作实际执行的是 Integer four = Integer.valueof(100);
1/valueof(),返回一个整数实例,该实例表示指定的整型值。如果不需要新的Integer实例,则通常应优先使用此方法,而不应使用构造函数Integer(int),使用构造方法回申请新的内存。
2.java为了提高执行效率,在valuof()方法执行的过程中,提供了一个类似常量数组的缓存区(对象池),当Integer four = 100,第二次使用valueof()执行的过程中,传入的参数在[-127,127]之间时,则直接使用缓存区中的值,不生成新的实例化对象,及three和four指向同一块内存,所以three == four;返回值为true,如果不在[-128,127]之间则会隐式的调用new来实例化一个Integer类型,所以five == six 返回值为false(开辟新的内存空间)
3.因为通过缓存频繁请求的值,此方法可能会显著提高空间和时间性能。此方法将始终缓存-128到127(包括)范围内的值,并且可能缓存此范围之外的其他值。
4. 简单总结就是[-128,127]之间的包装类对象使用 " =="比较返回值为true,范围外的一般都为false。
5. 除了float和double之外都可以使用常量池的概念,double 和 float 没有对象常量池。
例题:
上一篇: Java中==与equals方法的区别
下一篇: 字典树略解