java中的==和equals区别

package main;

public class Test1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
       int a=9;
       int b=9;
       /**
        * 在java中==永远比较的都是地址的值 所有a==b比较的是9这个在常量池中的地址
        * 所以相等 同理 str1==str2也是比较的"123"在常量池中的地址 所有相等
        * 但是res和res1都是一个新建的对象 储存在堆中 新建的对象有一个自己新的地址
        * 所以 str1==res和res==res1是不相等的
        */
       System.out.println(a==b);//true
       String str1="123";
       String str2="123";
       System.out.println(str1==str2);//true
       String res=new String("123");
       System.out.println(str1==res);//false
       String res1=new String("123");
       System.out.println(res1==res);//false 
	}

}

JVM虚拟机栈
在String类中 有一个叫equals方法:在String Api 中主要是用于比较两个字符串的内容是否相同。
因为 字符串 引用数据类型 字符串可以做常量
在这里插入图片描述

局部变量存储在栈空间中,这种说法是一种比较粗略的说法,我们通常所说的栈空间,其实指的是虚拟机栈 ,虚拟机栈又包含方法执行的栈帧

我们正常在代码的执行过程中,都需要方法的调用,每一个方法的调用都是一个栈帧,而栈帧又包含 局部变量表、操作数栈、方法出口、动态链接
在这里插入图片描述

13.1 局部变量表
局部变量表中存储的内容:

  1. 八大基本数据类型
  2. 对象的引用
    (reference类型,它不等同于对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与对象相关的位置)
    3 方法的返回值 return address
    在这里插入图片描述

在局部变量表中是一个32位的空间 针对于long类型double类型 都是64位 为了存储这两个类型 开辟2个slot的空间进行存储

局部变量表存储的内容 都是有一定生命期限,灵活性比较差 但是运行速度是比堆空间要快
堆空间 存储的内容 是没有生命期限的 灵活性比较好,因为JVM管理的是一个整个比较大的空间,所以运行速度相对较慢,那么堆空间所存储的内容,回收机制是由GC 垃圾回收器来完成的

在Java中 垃圾回收器不由我们程序员来操控 由JVM来操控,当虚拟机关闭,也不是马上就对 堆空间存储的内容进行清理,而是等待整个CPU及线程空闲的情况下进行自动清理

使用 == 号在比较引用数据类型的时候(new String()) 比较的是变量存储空间的地址,为什么建议大家使用equals 来比较两个字符串是否相同(内容的相同)
再来看下= = 与equals的示例代码:

package inter;

public class Person {
  private String name;
  private int age;
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
public Person(String name, int age) {
	super();
	this.name = name;
	this.age = age;
}
//构造无参构造函数
public Person() {
	super();
	// TODO Auto-generated constructor stub
}  
  public String toString(){
	  return "姓名: "+name+"年龄: "+age; 
  }
  public  boolean   equals(Object obj){//Object obj=new Person(20,"老王");父类引用指向子类对象
	   //1,判断是否为null
	  if(obj==null){
		   return false;
	   }
	  //2,obj是否是否属于Person类型
	   if(obj instanceof Person){
		   Person other=(Person)obj;
		   return this.age==other.age && this.name.equals(other.name);
	   }
	   return false;
  }
}
package inter;

public class ObjectTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
     Person p1=new Person("老昂昂",12);
     Person p2=new Person("老李",353);
     System.out.println(p1.toString());
     System.out.println(p1==p2);//false 比较的是地址
     System.out.println(p1.equals(p2));//false 因为没有重写父类的equals方法  
	}
}
发布了52 篇原创文章 · 获赞 0 · 访问量 1188

猜你喜欢

转载自blog.csdn.net/qq_37244548/article/details/104782687