equal与== 个人笔记
首先看看下面的图,看清楚了图咱们要说的知识点也就说说清楚了一半
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与== 个人笔记的更多相关文章
- 【算法笔记】A1060 Are They Equal
1060 Are They Equal (25 分) If a machine can save only 3 significant digits, the float numbers 1230 ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- AKKA 笔记 - 有限状态机 -2
AKKA 笔记 - 有限状态机 -2 原文地址: http://rerun.me/2016/05/22/akka-notes-finite-state-machines-2/ 在上一节的Akka FS ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案
一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...
- Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
---------------------------------------------------------------------------------------------------- ...
- 《PHP Manual》阅读笔记2
本次笔记截止到 语言参考 流程控制. 1.没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的.但另外一方面表达式 1 <= 1 == 1 是合 ...
- python学习笔记整理——字典
python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...
- 加州大学伯克利分校Stat2.2x Probability 概率初步学习笔记: Final
Stat2.2x Probability(概率)课程由加州大学伯克利分校(University of California, Berkeley)于2014年在edX平台讲授. PDF笔记下载(Acad ...
随机推荐
- JAVA面向对象-----成员内部类的访问方式
成员内部类的访问方式 1.内部类可以直接访问外部类的成员属性.(孙悟空相当于内部类飞到牛魔王的肚子里面去). 2.外部类需要访问内部类的成员属性时需要创建内部类的对象. 1.在外部类的成员函数中创建内 ...
- Android开发学习之路--Drawable mutations
时间过得很快,明天终于可以拿到房子了,交完这次房租,也可以成为房东了,看看博客也好久没有更新了,最近一直在整机器人,也没有太多时间整理博客. 今天下午和同事一起遇到了一个问题,就是明明没有改变 ...
- javascript之DOM对象
document方法 document.createElement(Tag) :创建一个html标签对象 document.getElementById(ID) :获得指定ID值的对象 documen ...
- 用了一天的时间,linux下expect实现ssh自动登录服务器记,鄙视下网上各种抄来抄去残段子
因为要对客户方的快30个项目进行特别有顺序的重启,所以不得不想办法写个脚本,网上看了不少段子.真是残缺的可以.没有一段是可以正常运行的.我来按顺序记录一下 脚本的本身 使用expect实现自动登录的脚 ...
- 使用Spring+Junit4.4进行测试
http://nottiansyf.iteye.com/blog/345819 使用Junit4.4测试 在类上的配置Annotation @RunWith(SpringJUnit4ClassRunn ...
- C语言省略extern的缺陷
在一个文件中(比如a.c)定义一个全局变量int a = 10; 然后在另一个代码文件(比如main.c)中需要使用变量a,可以写 int a; 单独看main.c文件时就会出现二义性,一个含义是当其 ...
- UNIX网络编程——客户/服务器程序设计示范(三)
TCP预先派生子进程服务器程序,accept无上锁保护 我们的第一个"增强"型服务器程序使用称为预先派生子进程的技术.使用该技术的服务器不像传统意义的并发服务器那样为每个客户现场派 ...
- JAVA之旅(二十九)——文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习
JAVA之旅(二十九)--文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习 我们继续学习File 一.文件递归 我们可以来实现 ...
- Java-IO之RandomAccessFile
RandomAccessFile是随机访问(读写)的类,支持对文件随机访问的读取和写入,也可以从指定的位置读取和写入文件数据.RandomAccessFile虽然属于java.io包,但它不是Inpu ...
- HTML中锚点的使用
说到锚点,我们也许会需要稍微的思考一下,什么是锚点? 官方的答案是这样的: 那么你可能就会有下面的疑问,锚点能做什么啊? 回答就是,锚点可以理解为一个标记,一个用于而且便于寻找的标记.常用于网页制作的 ...