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
*/
}
}

最新文章

  1. HTTP笔记整理(1)
  2. C++函数指针
  3. 2013年最新流行的响应式 WordPress 主题【下篇】
  4. LAMP环境搭建教程(原创)
  5. 转--CSS选择器详解(一)常用选择器
  6. Windows 7 32位上硬盘安装linux[ubuntu13.04] 双系统
  7. 定位 - CoreLocation - INTULocationManager
  8. 你不知的IE的bug及其解决方案
  9. 原创-angularjs2不同组件间的通信
  10. cesium根据经纬度计算距离
  11. python爬虫之小说爬取
  12. Java阻塞队列的实现
  13. C#___.net经典题
  14. MySQL常用命令汇总(偏向运维管理)
  15. map、filter、reduce函数
  16. swift - 网络请求数据处理 - 协议处理
  17. 在 iOS 上编译 webkit 源码
  18. Hadoop HDFS HA启动出现两个StandBy NameNode
  19. linux3.4.2内核之块设备驱动
  20. C++中的自动存储、静态存储和动态存储

热门文章

  1. 【BZOJ 2749】 2749: [HAOI2012]外星人 (数论-线性筛?类积性函数)
  2. luoguP3978 [TJOI2015]概率论 卡特兰数
  3. hihoCoder #1695 公平分队II
  4. Laravel输出JSON时设定输出字段的几种情况总结
  5. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】
  6. 检测使用内存memory_get_usage,执行时间microtime
  7. PHP -- 函数基础入门
  8. bzoj 4001 [TJOI2015]概率论 数学
  9. PHP 日期的加减
  10. 移动应用安全开发指南(Android)--数据验证