关于String类型,==,equals的有关问题,
关于String类型,==,equals的问题,请教大家!
首先,我们知道,String不是基本数据类型,它是一个类(即引用类型)。String对象的初始化有两种方法:①向普通的类一样,先实例化一个对象,然后通过构造函数给对象赋参数,如:String s=new String("abc");②Java为String类的初始化提供了一个简化的特殊语法,格式如下:String s="abc"。我的理解就是,上述两种初始化方法的作用是一样的,即都是初始化一个String类对象,然后给对象赋值(不知道我的理解正不正确)。
另外,我们知道,“==”是用来比较两个对象的地址,equals比较的是对象的内容。
但是,我做了一个实验,代码如下:
String string1=new String("Hello");
String string2=new String("Hello");
System.out.println("string1==string2? ->"+(string1==string2));
System.out.println("string1.equals(string2)?->"+string1.equals(string2));
String string3="Hello";
String string4="Hello";
System.out.println("string3==string4? ->"+(string3==string4));
System.out.println("string3.equals(string4)?->"+string3.equals(string4));
输出如下:
string1==string2? ->false
string1.equals(string2)? ->true
string3==string4? ->true
string3.equals(string4)? ->true
这我就困惑了,因为如上所述,两种赋值方法是一样的,都是创建了两个String类的对象,怎么输出的结果不一样呢?希望大家帮忙解决,谢谢!
------解决思路----------------------
Java中有一个叫做常量池
直接双引号创建的对象在常量池
用new创建的对象在堆中
------解决思路----------------------
我们知道,“==”是用来比较两个对象的地址,equals比较的是对象的内容,前面两句是各自生成了一个对象分配了地址,地址不同,内容相同,所以“==”为false,equal为true,后面的并没有再次分配地址,而是指向hello的地址,因此比较地址和内容都是true
首先,我们知道,String不是基本数据类型,它是一个类(即引用类型)。String对象的初始化有两种方法:①向普通的类一样,先实例化一个对象,然后通过构造函数给对象赋参数,如:String s=new String("abc");②Java为String类的初始化提供了一个简化的特殊语法,格式如下:String s="abc"。我的理解就是,上述两种初始化方法的作用是一样的,即都是初始化一个String类对象,然后给对象赋值(不知道我的理解正不正确)。
另外,我们知道,“==”是用来比较两个对象的地址,equals比较的是对象的内容。
但是,我做了一个实验,代码如下:
String string1=new String("Hello");
String string2=new String("Hello");
System.out.println("string1==string2? ->"+(string1==string2));
System.out.println("string1.equals(string2)?->"+string1.equals(string2));
String string3="Hello";
String string4="Hello";
System.out.println("string3==string4? ->"+(string3==string4));
System.out.println("string3.equals(string4)?->"+string3.equals(string4));
输出如下:
string1==string2? ->false
string1.equals(string2)? ->true
string3==string4? ->true
string3.equals(string4)? ->true
这我就困惑了,因为如上所述,两种赋值方法是一样的,都是创建了两个String类的对象,怎么输出的结果不一样呢?希望大家帮忙解决,谢谢!
------解决思路----------------------
Java中有一个叫做常量池
直接双引号创建的对象在常量池
用new创建的对象在堆中
------解决思路----------------------
我们知道,“==”是用来比较两个对象的地址,equals比较的是对象的内容,前面两句是各自生成了一个对象分配了地址,地址不同,内容相同,所以“==”为false,equal为true,后面的并没有再次分配地址,而是指向hello的地址,因此比较地址和内容都是true