浅谈equals和==的区别
一.根本数据类型
对于byte,short,int,long,float,double,char,boolean这八种根本数据,是指寄存在栈中的简略数据段,数据大小确定,内存空间大小能够调配,它们是间接按值寄存的,所以能够间接按值拜访。他们之间的比拟间接抉择==,这里间接比拟的是他们的值
二.援用数据类型
- ==比拟两个对象在内存里是不是同一个对象,就是说在内存里的存储地位统一。 两个String对象存储的值是一样的,但有可能在内存里存储在不同的中央.
- ==比拟的是援用而equals办法比拟的是内容。
public boolean equals(Object obj)这个办法是由Object对象提供的,能够由子类进行重写。默认的实现只有当对象和本身进行比拟时才会返回true,这个时候和==是等价的。String, BitSet, Date,和File都对equals办法进行了重写,对两个String对象而言,值相等意味着它们蕴含同样的字符序列。对于根本类型的包装类说,值相等意味着对应的根本类型的值一样。
三.字符串缓冲池
String s1 = "hello";String s2 = "hello";System.out.println(s1 == s2);//trueSystem.out.println(s1.equals(s2));//true
String s1 = "hello";String s2 = new String("hello");System.out.println(s1==s2);//falseSystem.out.println(s1.equals(s2));//true
原来,程序在运行的时候会创立一个字符串缓冲池当应用 s2 = "hello" 这样的表白是创立字符串的时候,程序首先会在这个String缓冲池中寻找雷同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创立的时候,程序找到了具备雷同值的 s1 将s2援用s1所援用的对象"hello";然而 第二段程序中,应用了 new 操作符,他明确的通知程序:"我要一个新的!不要旧的!"于是一个新的"hello"Sting对象被创立在内存中。他们的值雷同,然而地位不同,由此他们的地址值产生了扭转!