最近刷题总会遇到这种:
String a = “str”;
String b = "ing";
String c = a+b;
String d = "str"+"ing";
String e = new String("string");
System.out.println(c==d);
System.out.println(c==e);//地址不同,内容相同
System.out.println(d==e);
运行后的结果是:
false
false
false
首先,“==”和没有被覆盖的equals()方法:基本类型比较的是值,其他类型比较的是地址
覆盖的equals()方法:比较的都是值,不管基本类型还是其他类型
**被equals()覆盖的方法需要补充
注意:“’= =”一边是包装类型一边是基本类型,先将包装类转为基本类型,这时比较的是值。
栈中(数据共享)
1、前提条件:以下基本类型是局部变量int, short, long, byte, float, double, boolean, char基本类型的地址和内容
2、对象的引用地址,属于成员变量的基本类型地址名
堆中
1、数组
2、对象实例new出来的
3、属于成员变量的基本类型的值
常量池(数据共享)
1、String a=”a”字符串
2、final常量值
3、特殊地String a=”str”;String b=”ing”;String c=”str”+”ing”;这个c位于常量池中
4、特殊地String a=”str”;String b=”ing”;string c=a+b;这个c内容就位于常量池(还是在堆???后面接着补)中,但c的地址在栈中
特殊情况
String str=new String("abc");
常量池里有一个"abc"
堆里有一个"abc"
还有一个引用str栈中
String str1=new String();
只有一个对象堆中
一个引用str1栈中
引用类型赋值操作时:
float f1[]=new float[2];
float[] f2=f1;
这时f1的引用地址会在栈中,真正的值在堆中;通过赋值操作,f2和f1的引用地址相同,这时修改f2的值,f1的值也会变,所以f1==f2。
2020.4.11初稿
2020.4.15修一