Java中“==”的使用,以及“==”和equal的比较
int i02=59 ,这是一个基本类型,存储在栈中。
Integer i03 =Integer.valueOf(59); 因为 IntegerCache 中已经存在此对象,所以,直接返回引用。
Integer i04 = new Integer(59) ;直接创建一个新的对象。
System. out .println(i01== i02); i01 是 Integer 对象, i02 是 int ,这里比较的不是地址,而是值。 Integer 会自动拆箱成 int ,然后进行值的比较。所以,为真。
System. out .println(i01== i03); 因为 i03 返回的是 i01 的引用,所以,为真。
System. out .println(i03==i04); 因为 i04 是重新创建的对象,所以 i03,i04 是指向不同的对象,因此比较结果为假。
System. out .println(i02== i04); 因为 i02 是基本类型,所以此时 i04 会自动拆箱,进行值比较,所以,结果为真。
另外的实例:
public class Test{
public static void main(){
String s1="monday";
String s2="monday";
if(s1==s2){system.out.printLn("s1=s2");}
else{system.out.printLn("s1!=s2");}
}
}
输出:s1=s2;//
public class Test{
public static void main(){
String s1="monday";
String s2= new String("monday");
if(s1==s2){system.out.printLn("s1=s2");}
else{system.out.printLn("s1!=s2");}
}
}
输出:s1!=s2;//
字符串缓冲池
原来,程序在运行的时候会创建一个字符串缓冲池当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1
将s2引用s1所引用的对象"Monday"
第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"Monday"Sting对象被创建在内存中。他们的值相同,但是位置不同,一个在池中游泳一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?
"=="和equal的比较
一、比较对象为基本数据类型(byte,short,char,int,long,float,double,boolean)
比较两个基本数据类型是否相等用==,因为只有类才会有equals方法。 备注:String不是基本数据类型 二、比较对象为引用数据类型 euqals和==本质上都是比较比较的是两个对象的引用(内存地址)是否相同。equals()是Object类的方法 ,object类是所有类的基类,所以每个类都会继承equals()方法。
但在String,Integer,Date在这些类当中重写了equals方法,而不再是比较对象在堆内存中的存放地址了,而是比较它们指向的实体(内容)是否相同。
最新文章
- C# 根据类型名称 生成实体 调用方法
- return和finally的执行和联系
- docker-compose启动的tomcat无法远程连接jmx
- 【圣诞特献】Web 前端开发精华文章推荐【系列二十一】
- JMeter压力测试以文件的形式
- 客户端(android,ios)与服务器通信
- jQueryEasyUI中DataGrid的height,width,fit,fitColumns属性
- Altium Designer中各层的含义
- CMake使用之一
- javascript转换.net DateTime方法 (比如转换\/Date(1426056463000)\/)
- Git&;GitHub-基础教程
- Linux 系统最大TCP连接数 调优
- linux每日命令(5):mkdir命令
- 火狐浏览器firebug
- day03_雷神_文件操作
- Educational Codeforces Round 13 D. Iterated Linear Function 水题
- document ready
- Caesars Cipher
- linux命令(6/9):watch命令
- Android · 广告走灯