1、==
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址。
2、equals()
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
注意:基本数据类型是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于字符串也是相同的方式,在常量池中,一个常量只会对应一个地址,这样定义的数据都只会存储一个地址,所有的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过“==’来比较。
String对象的问题
String对equals方法进行了重写。
它首先判断的是两个对象的引用是否指向同一内存地址,是的话就返回true ,否则继续往下走,去判断是否为String类的对象,然后比较两个字符串的长度和内存,当都相等的时候就返回true ,否则返回false。
1.String作为一个对象来使用:
例子一:对象不同,内容相同,"=="返回false,equals返回true
String s1 = new String("eclipse");
String s2 = new String("eclipse");
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //true
例子二:同一对象,"=="和equals结果相同
String s1 = new String("eclipse");
String s2 = s1;
System.out.println(s1==s2); //true
System.out.println(s1.equals(s2)); //true
2.String作为一个基本类型来使用
如果值不相同,对象就不相同,所以"==" 和equals结果一样
String s1 = "java";
String s2 = "java";
System.out.println(s1==s2); //true
System.out.println(s1.equals(s2)); //true
String池:
String是final修改的类型,不可改变的,Java存在字符串池的概念,例如new String(“xyz”);首先在String池中创建一个对象“xyz”,由于使用 NEW 来创建对象,会分配新的地址空间,将String池的内容复制过去。如果创建的String对象在String池中不存在,会在String池中创建该对象。
简单的说法:
1.如果使用new创建字符串对象,就是创建的新对象。
2.如果直接指定或者是字符串串联(str1=str2这种)来创建string对象,则会检查string池中是否存在,池中存在就是相同的对象,池中没有就在池中创建一个新对象。