一、==和equals区别
==:
在比较对象时比较的是引用地址是否相同;
在比较基本类型时比较的是其内容。
equals:
比较的是内容,而不比较其引用。
如果对象不同,而内容相同,”==”返回false,equals返回true
String s1 = new String("aaa");
String s2 = new String("aaa");
// s1与s2不是同一个对象
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //true
如果是同一引用,”==”返回true,equals返回true
String s1 = new String("aaa");
String s2 = s1;
//s1和s2是同一个地址的引用
System.out.println(s1==s2); //true
System.out.println(s1.equals(s2)); //true
String类似基本类型使用
Java中有8种基本数据类型(字母开头小写),即boolean、byte、short、char、int、float、long、double,基本数据类型不是对象,放在堆栈中,用完就销毁,访问速度快。而对象放在堆中。如果必须用到对象Java针对每种基本数据类型提供了包装类,即Boolean、Byte、Short、Character、Integer、Float、Long、Double(开头大写)等。
String s1 = "aaa";
String s2 = "aaa";
// s1与s2是类似类型
System.out.println(s1==s2); //true
System.out.println(s1.equals(s2)); //true
为啥产生如上结果?
直接等号赋值是放入内存池的,其它变量也可以引用;new初始化分配内存空间,不可引用。
String s=”a”和String s=new String(“a”)是有本质上的区别的。前者是在字符串池里写入一个字符’a’,然后用s指向它;后者是在堆上创建一个内容为”a”的字符串对象。
如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。
二、其他
String s;是没有初始化的引用,只是给s分配一个内存空间;
String s=null;为空引用,是分配的空间中存储的值为空值 ;
String s=”a”;是在字符串池里写入一个字符’a’,然后用s指向它。