终极探究"=="与equals方法区别
来源:互联网 发布:真空收纳袋好用吗 知乎 编辑:程序博客网 时间:2024/05/16 12:16
先解释一下名词:
堆:首先堆是动态分配的,JVM并不会自动释放这部分内存。只用等待系统的gc来进行内存回收。
栈:是在类加载中有系统静态分配的,而且分配时按照内存的高低地址分配。这部分内存系统会自动进行释放。
a)基本数据类型
对于基本数据类型是没有equals方法的,所以这里讨论==
java中的基本数据类型是8种:int,short,long,byte,float,double,boolean,char(此处注意string不是基本数据类型)
下面看在基本数据类型中==是如何比较的
public class equals2 { public static void main(String args[]){ int i=10; int j=10; if(i==j){ System.out.println("值相等"); }else{ System.out.println("不相等"); } }}
当然也可以说成比较内存地址.对于基本数据类型,在存储的时候是放在栈中的,但是对于引用类型变量间的比较就不是这样了.
b)引用类型的变量之间的比较
引用类型的变量就是String 数组等,如果他指向对象类型的话,就涉及了两块内存,变量存储在栈内存中,对象本身存储在堆内存中,先看一个例子:
class A {int a = 1;}public class Test {public static void main(String args[]) {A obj1 = new A();A obj2 = new A();String s1, s2, s3 = "abc", s4 = "abc";s1 = new String("abc");s2 = new String("abc");System.out.println("s1.equals(s2)是" + (s1.equals(s2)));// trueSystem.out.println("s1==s3是" + (s1 == s3));// 比较的是内存值,肯定falseSystem.out.println("s1.equals(s3)是" + (s1.equals(s3)));// trueSystem.out.println("s3==s4是" + (s3 == s4)); // 这里是true,比较特殊因为创建s3和s4的时候指向同一对象了,静态赋值,java会先查看常量池,已经存在"abc”System.out.println("s2.equals(s3)是" + (s2.equals(s3)));//trueSystem.out.println("s1==s2是" + (s1 == s2));//falseSystem.out.println("obj1==obj2是" + (obj1 == obj2));//falseSystem.out.println("obj1.equals(obj2)是" + (obj1.equals(obj2))); //比较特殊,比较A的两个对象,没有重写equals}}
obj1和obj2是两个引用变量,他们分别指向堆内存中的两个new出来的对象,所以说obj1和obj2就是两个指向堆内存中的地址,没错就是地址~~
string s3="abc"的实现和new 不同,他是利用常量池实现的
对于 obj1==obj2和第一图类似,但是obj1.equals(obj2)因为没有在该类中重写equals()方法,所以功能上和==的作用是相同的,但是这个和s1.equals(s2)是不一样的,这个比较的是A的两个对象.在这行代码中的equals()继承了Object类的equals()方法,boolean equals(Object o){
return this o;
}
重写过程我没有写,自己写去啦~~~~`
总结 :
==判断指向对象的地址是否相同
equals比较两个独立对象的内容是否相同,如果一个类中没有重写equals()方法,他的作用就和==是一样一样滴~~~
好了 ,就到这里了,最近刚刚开学太忙了,没有时间.苦逼大二生.以后关于java的数据结构实现,设计模式,框架都会写到的~~~~
- 终极探究"=="与equals方法区别
- 2017 Java 中== 与 equals 区别 终极见解
- equals()方法与==的区别
- ==与equals()方法的区别?
- ==与equals方法的区别
- equals()方法与==的区别
- “==”与 equals 方法的区别
- ==与equals方法的区别
- ==与equals方法的区别
- ==与equals方法区别
- == 和equals方法 比较终极篇
- Java中==与equals的区别(可以试下重写hashcode与equals方法)
- “==”运算符与equals方法的区别
- “==”运算符与equals()方法的区别
- C#中==与Equals方法的区别
- equals方法与"=="号的区别
- 字符串==与equals方法的区别
- Java中"=="与equals()方法的区别
- Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC
- wine qq
- iOS 监听音量调节 事件
- Loadrunner 函数用法
- 细说HTML元素的ID和Name属性的区别
- 终极探究"=="与equals方法区别
- Aspose发布基于VS和Eclipse的插件
- 配置uwsgi flask nginx flask-sqlalchemy
- jquery获取input表单值的代码
- Oracle新建用户、角色,授权,建表空间
- Table 组件使用指南:修改默认排序规则
- Cocos2d-x的多分辨率解决方案
- playframework play deps超时
- YUV2格式转换成RGB24格式解析