Java中equals和==的解析
java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
(1)当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
(2)对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
3. 字符串缓冲池
(1) 原来,程序在运行的时候会创建一个字符串缓冲池当使用 param2_1 = "lowi" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,param2_1先被放到了池中,所以在param2_1被创建的时候,程序找到了具有相同值的 param1_1
将s2引用s1所引用的对象"Monday"
(2)使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"lowi"Sting对象被创建在内存中。他们的值相同,但是位置不同,一个在池中游泳一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?
4.java.lang.String的intern()方法
java.lang.String的intern()方法"lowi".intern()方法的返回值还是字符串"lowi",表面上看起来好像这个方法没什么用处。
实际上,做了一个程序处理:检查字符串池里是否存在"lowi"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"lowi"添加到字符串池中,然后再返回它的引用。
代码详细如下:
public class TestEquals {
public static void main(String[] args) {
//该种方式创建的对象params1_1与params2_1,因为值相同,所以只在内存中存放一处
String params1_1="lowi";
String params2_1="lowi";
//该种方式创建的对象params1_2与params2_2,
//通过new方式创建的对象,如Sting对象被创建在内存中,他们的值相同,但是位置不同
String params1_2=new String("lowi");
String params2_2=new String("lowi");
//比较使用“”
if(params1_1==params2_1){
System.out.println("params1_1==params2_1");
}else{
System.out.println("params1_1!=params2_1");
} if(params1_1.equals(params2_1)){
System.out.println("params1_1与params2_1,equals");
}else{
System.out.println("params1_1与params2_1,not equals");
}
/**
//结果一
params1_1==params2_1
params1_1与params2_1,equals
**/
//比较使用“”与new对象:一
if(params1_1==params1_2){
System.out.println("params1_1==params1_2");
}else{
System.out.println("params1_1!=params1_2");
}
if(params1_1.equals(params1_2)){
System.out.println("params1_1与params1_2,equals");
}else{
System.out.println("params1_1与params1_2,not equals");
}
/**
//结果二
params1_1!=params1_2
params1_1与params1_2,equals
*/
//比较使用new创建对象
if(params1_2==params2_2){
System.out.println("params1_2==params2_2");
}else{
System.out.println("params1_2!=params2_2");
}
if(params1_2.equals(params2_2)){
System.out.println("params1_2与params2_2,equals");
}else{
System.out.println("params1_2与params2_2,not equals");
}
/**
//结果三
params1_2!=params2_2
params1_2与params2_2,equals
*/
//比较使用new创建对象:二
//java.lang.String方法intern,用于检查字符串池里是否存在"lowi"这么一个字符串,如果存在,就返回池里的字符串;
//如果不存在,该方法会 把"lowi"添加到字符串池中,然后再返回它的引用。
params2_2 = params2_2.intern();
if(params2_1==params2_2){
System.out.println("params2_1==params2_2");
}else{
System.out.println("params2_1!=params2_2");
}
if(params2_1.equals(params2_2)){
System.out.println("params2_1与params2_2,equals");
}else{
System.out.println("params2_1与params2_2,not equals");
}
/**
//结果四
params2_1==params2_2
params2_1与params2_2,equals
*/
}
}
最新文章
- HTTP笔记整理(1)
- C++函数指针
- 2013年最新流行的响应式 WordPress 主题【下篇】
- LAMP环境搭建教程(原创)
- 转--CSS选择器详解(一)常用选择器
- Windows 7 32位上硬盘安装linux[ubuntu13.04] 双系统
- 定位 - CoreLocation - INTULocationManager
- 你不知的IE的bug及其解决方案
- 原创-angularjs2不同组件间的通信
- cesium根据经纬度计算距离
- python爬虫之小说爬取
- Java阻塞队列的实现
- C#___.net经典题
- MySQL常用命令汇总(偏向运维管理)
- map、filter、reduce函数
- swift - 网络请求数据处理 - 协议处理
- 在 iOS 上编译 webkit 源码
- Hadoop HDFS HA启动出现两个StandBy NameNode
- linux3.4.2内核之块设备驱动
- C++中的自动存储、静态存储和动态存储
热门文章
- 【BZOJ 2749】 2749: [HAOI2012]外星人 (数论-线性筛?类积性函数)
- luoguP3978 [TJOI2015]概率论 卡特兰数
- hihoCoder #1695 公平分队II
- Laravel输出JSON时设定输出字段的几种情况总结
- 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】
- 检测使用内存memory_get_usage,执行时间microtime
- PHP -- 函数基础入门
- bzoj 4001 [TJOI2015]概率论 数学
- PHP 日期的加减
- 移动应用安全开发指南(Android)--数据验证