==和equeals区别以及使用场景
定义
- ==:基本数据类型比较的是值或地址,引用数据类型比较的是地址。
- equals:在不重写的情况下,和==没有任何区别,重写,可以自定义比较规则,一般重写之后都让其比较值。
Object类中的equals方法
String引用数据类型中重写的equals方法
使用
基本数据类型:
(byte,short,char,int,float,double,long,boolean),不是常量时存放于栈内存,是常量时存放于方法区的常量池中,不管怎样都可用==进行值得比较。
特殊的引用数据类型String
String str="";这样由""创建,存放于常量池中;若new String("")创建则存放于堆内存中,所以存放于常量池中则可以用双等号进行比较,若存放于堆内存中,要比较值相等则必须用equals进行比较。
其他的引用数据类型
要比较值时,必须重写equals方法。
注意:常量池里面的数据是以HashSet策略存储起来的(不可重复),当执行String s1 = “hello”;这条语句时,会在堆中的字符常量池里找”hello”这个字符串,若没有找到,则将”hello”这个字符串放入字符串常量池中,而在栈中开辟一块名为s1的空间存放”hello”,这块空间的引用。当执行String s2 = “hello”;这条语句时,会在堆中的字符串常量池里找”hello”这个字符串,很显然,可以找到,于是便把字符常量池里”hello”这个字符串的引用地址赋给s2,因此s1与s2存放的都是堆中字符常量池中的同一个”hello”的引用。
XFS