如果使用==来判断两个变量是否相等时,
如果两个变量都是基本类型(byte, short , int , long , float , double , char , boolean ), 且都是数值类型, 则只要两个变量的值相等,就会返回true, 如果变量是引用类型,只有它们指向同一个对象时== 才会返回true。 == 不可用于比较类型上没有父子关系的对象。
String str3 = "hello";
String str4 = "hello";
String info = "hell"+"o";
System.out.println(str3==info);
System.out.println(str3==str4);
结果为true ,true 这就要引入常量池的概念, 常量池(constant pool )指的是在编译期就被确定,并保存在以编译的.class文件中的一些数据, 它包括了关于类, 方法, 接口等中的常量, 也包括字符常量。首先需要明确的是java会确保一个字符串常量只有一个拷贝,
因为str3 与str4 的hello都是字符串常量,它们在编译器就被确定了,str2 与str3
指向同一个对象,当一个字符串由多个字符串常量连接成常量时同样也在编译期被解析为一个字符串常量,所以其也是常量池“hello”的一个引用。
在看如下例子:
String str3 = "hello";
String str2 = new String ("hello");
System.out.println(str2==str3);
结果为false,
因为对于new String ()创建的字符串不是常量, 不能在编译期就确定,所以new String()创建的字符串不会放入常量池,它们拥有自己的空间,因此它们指向的空间不同,所以则会返回false。
但是如果改成如下方式则会出现不同的结果:
String str2 = new String ("hello").intern();
这时在比较则会发现结果为true:
这是因为intern()的作用,该方法被调用后会查找常量池中是否有相同的字符串常量, 如果有则返回其引用,如果没有则会增加一个字符串常量并返回其引用。这就解释了为何会返回true的原因。
equals ()方法是object类提供的一个方法,因此所有的引用变量都可以调用该方法判断是否与其他引用变量相等,但是使用这个方法判断两个对象相等的标准与使用==运算符没有区别,同样要求两个引用变量指向同一个对象才会返回true。但是对于、string已经重写了Object的equals ()方法,String的equals ()判断两个字符串相等的标准是只要两个字符串包含的字符序列相等,通过equals会返回相等, 否则则返回false
、