首先看看下面的图,看清楚了图咱们要说的知识点也就说说清楚了一半





int a=10;

String b="ss";

String c=new String("kkk");

Person d=new Person("dlf");

String e=new String("kkk");

String f="ss";





jvm中有堆heap,栈stack,常量池constant。

我们的基本对象,包括int,double等都放在栈里,引用类型如String,Person(Person 就是一个pojo类而已)引用(如上面的c,d)放在栈里,真实的数据放在堆中。





== 比较的是两个对象在栈中存放的数据是否一样

b==f 比较的就是两个105的地址 (105就是指ss在常量池中的地址)

c==e 一个1063一个1095 自然就不相等了





equals 比较的事堆中的内容

c.equsls(e) 就是两个kkk在比较 答案不言自明





Objeck的equals方法如下

    public boolean equals(Object obj) {

        return (this == obj);

    }

换句话说object的类的==与equals就是一回事

有兴趣的可以看看String的equals方法





关于==与equals说完了,再说说字符串的构建

对字符串的构建 我们最常使用的有两种

String a1="bbb";

String a2=new String("ccc");

两种方式有不同

第一种方式,通过上面的图大家也看到了,bbb这个数据存放在常量池里;准确的说是用String a1="bbb"这种方式产生字符串,jvm首先会在常量池里查找是否有bbb这个数据,如果有就把bbb这个数据的地址给a1,否则就在常量池里新建一个数据单元里面存放bbb,然后把这个单元的地址给a1。(上图中的两个105 就是这个例子)

第二种方式在于 在编译的时候会有一个ccc在常量池,等到运行的时候,会在堆区在创建一个数据单元里面存放ccc,然后a2里面就存放堆里面那个数据单元的地址!另外即使堆中已经有了这个字符串,通过new的方式,还会再产生一个堆区的数据(如上图中的1063与1095)





所以

String a=new String("bbb");

产生了两个对象,一个在堆一个在常量池。





String a=new String("bbb");

String c=new String("ccc");

产生了四个对象,两个在堆两个在常量池。





String a1=new String("sss");

String a2=new String("sss");





对于这种情况,堆区肯定有两个对象,那常量池里面呢? 一个sss还是两个sss 我不敢肯定 但我估计应该是两个。

equal与== 个人笔记的更多相关文章

  1. 【算法笔记】A1060 Are They Equal

    1060 Are They Equal (25 分)   If a machine can save only 3 significant digits, the float numbers 1230 ...

  2. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  3. AKKA 笔记 - 有限状态机 -2

    AKKA 笔记 - 有限状态机 -2 原文地址: http://rerun.me/2016/05/22/akka-notes-finite-state-machines-2/ 在上一节的Akka FS ...

  4. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  5. CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  6. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  7. 《PHP Manual》阅读笔记2

    本次笔记截止到 语言参考 流程控制. 1.没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的.但另外一方面表达式 1 <= 1 == 1 是合 ...

  8. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  9. 加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Final

    Stat2.2x Probability(概率)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...

随机推荐

  1. dubbo安装

    dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,分享牛系列,分享牛专栏,分享牛.但管控台是否正常对 Dubbo 服务没有影响,管控台也不需要高可用,因此可以单节 ...

  2. 使用java操作HDFS

    新建Java Project; 1,右击项目,属性,Java Build Path,Libraries,Add External JARs(haddopp根目录下的所以jar): 2,做一下项目关联, ...

  3. PHP+MySQL 分页那点事

    分页技术随处可见,这可以算得上是最为基础的网站功能了.于是今天尝试着用PHP来实现一个分页的小例子. 准备工作 环境准备 Apache MySQL PHP 工作环境 数据库准备 建库 建表 预存数据 ...

  4. UIKit视图动画的微扩展

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 好久没写blog了,还不快快写来- ;] 我们知道在UIKit ...

  5. android获取短信并自动填充

    package com.velo.quanquan.util; import java.util.regex.Matcher; import java.util.regex.Pattern; impo ...

  6. 详解EBS接口开发之库存事务处理批次更新

    库存事务处理批次有时候出现导入错误需要更新可使用次程序更新,批次导入可参考博客 详解EBS接口开发之库存事务处理-物料批次导入 http://blog.csdn.net/cai_xingyun/art ...

  7. gradle2.0笔记——让项目升级到gradle2.0

    昨晚看到QQ群消息说gradle2.0发布了,今天去看了一下,确实是昨天发布的,为rc版本:Gradle 2.0-rc-2.于是决定试一下. gradle可以在官网上下载,地址如下:http://ww ...

  8. java加载外部文件数据到代码中:外部数据文件放到jar包中,调用方法getResourceAsStream

    任务要将数据文件geo.txt加载进行.因为是别人写的总体项目,不能乱动位置.只能将geo.txt打包到jar中某目录.比如,放到.class文件下怎么加载:http://riddickbryant. ...

  9. Android初级教程三个Dialog对话框小案例

    这里把三个对话框形式写在一个项目程序里面,用三个按钮控制显示什么样式的对话框. 先看布局文件代码: <LinearLayout xmlns:android="http://schema ...

  10. Docker教程:docker远程repository和自建本地registry

    http://blog.csdn.net/pipisorry/article/details/50814307 Docker有一个类似版本管理仓库(Repositry)的东西,有docker.io提供 ...