对于你这个问题,是这么理解的:
在内存中,创建一个对象的时候,首先会在栈内存中创建一个引用变量,通过new关键之在堆内存中创建一个对象,然后把这个对象的引用(也就是你说的内存地址)赋给引用变量,举个栗子:String str1=new String(“abc”);String Str2 =new String(“abc”);String str3 =str1 ,在以上三个字符中,str1 !=str2,str3==str1.原理很简单,str1,str2创建的时候都是用new关键之来进行,所以不管值是不是一样,都会重新创建一个对象,所以str1和str2不是一个对象。在创建str3的时候,通过String str3来定义的时候,只是在栈内存中新建了一个str3的变量,但是没有通过new在对内存中创建对象,只是把str1所引用的那个对象的引用(也就是所谓的地址)复制给了str3,所以str1==str3;
另外一个点就是,如果定了String str4 =“abc”;str5 ="abc"。则str4==str5,他们引用的是同一个地址,也就是一个对象。但是,str4!=str3,其原因在于,使用字符串直接赋值给String对象的时候,这个字符串是可以在编译时确定下来的,编译器在创建变量的时候,会从常量池中查找是否存在这个字符串,如果存在,则直接引用,如果不存在,则在常量池中新建一个字符串,建立引用。常量池是为了更高效率的存取这些不可变对象,常量池中不存在两个相同的元素。 |