java 字符串String比较 equals ==

来源:互联网 发布:过年淘宝打折吗 编辑:程序博客网 时间:2024/06/06 08:27

一、==和equals区别

==:
在比较对象时比较的是引用地址是否相同;
在比较基本类型时比较的是其内容。
equals:
比较的是内容,而不比较其引用。

如果对象不同,而内容相同,”==”返回false,equals返回true

String s1 = new String("aaa");String s2 = new String("aaa");// s1与s2不是同一个对象System.out.println(s1==s2);            //falseSystem.out.println(s1.equals(s2));    //true

如果是同一引用,”==”返回true,equals返回true

String s1 = new String("aaa");String s2 = s1;//s1和s2是同一个地址的引用System.out.println(s1==s2);            //trueSystem.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);            //trueSystem.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指向它。

原创粉丝点击