Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中不同的新字符串和新整数?_Java - Fatal编程技术网

java中不同的新字符串和新整数?

java中不同的新字符串和新整数?,java,Java,a和a2是指针,内存相同,b和b2是对象不相同的内存,a=b、 还有b=b2,为什么?c=d和d=d2,新字符串是object,新整数不是object 新字符串是对象,新整数不是对象 因为您立即将整数s指定给基本类型,而不是对象类型。如果你写过 String a="ABC"; String a2="ABC"; //-------------------------------------- String b=new String("ABC"); String b2=new Strin

a和a2是指针,内存相同,b和b2是对象不相同的内存,a=b、 还有b=b2,为什么?c=d和d=d2,新字符串是object,新整数不是object

新字符串是对象,新整数不是对象

因为您立即将
整数
s指定给基本类型,而不是对象类型。如果你写过

String a="ABC";
String a2="ABC";

//--------------------------------------

String b=new String("ABC");    
String b2=new String("ABC");

//-----------------------------------------

int c=5;
int c2=5;

//-------------------------------------
int d=new Integer(5);    
int d2=new Integer(5);

//----------------------------------------

然后
d!=d2
正如预期的那样,尤其是因为对
new
的任何两个不同调用的结果都将是
=相互关联。

案例1

Integer d=new Integer(5);

Integer d2=new Integer(5);
此字符串将添加到字符串池中

因此,在字符串池中创建新字符串时,jvm是否检查字符串池中是否存在相同的字符串?如果存在,则新字符串将引用相同的字符串池字符串

所以a和a2指向相同的内存

案例2

String a="ABC";
String a2="ABC";
在此场景中,将添加新的字符串对象。如果您想为上述语句指定相同的内存,则必须使用

String b=new String("ABC");    
String b2=new String("ABC");
所以b和b2不是同一个对象

案例3

String b=new String("ABC").intern();    
String b2=new String("ABC").intern();
它们是原语

案例4

    int c=5;
    int c2=5;
案例3和案例4您将原语值与整数对象引用值进行比较,因此它不匹配

所以你的案子也归假


引用

嗯,您将新的整数
存储在一个
int
中,因此它立即被解除了绑定。如果将它们存储在
Integer
变量中,则情况会有所不同;整数b=1;如果(a==b)嗯。就我自己而言,我更希望发生编译错误。@laune:一旦你用
=
比较了两个对象与有用的
.equals
实现,你就做错了。现在我明白你的第一句话了。但测试对象身份仍然是必要的。如果==会导致编译错误,则需要另一个运算符。关心引用相等的对象应该在其
.equals
方法中继承它,因此您可以在任何地方使用
.equals
。非常罕见的情况下,这是必要的,所以我可以接受它是一个可抑制的警告。你对案例4的解释有问题。如果使用
new
关键字创建实例,则不会使用缓存。所以
newinteger(5)==newinteger(5)
false
   int d=new Integer(5);    
   int d2=new Integer(5);