直接上代码,此处省略1000字,疑问全在注释中。
- import java.util.HashSet;
- class Demo {
-
- public static void main(String[] args) {
-
- //===================这是我能理解=========================
-
- String str1 = "100"; // str1指向了常量区的100
- String str2 = "100"; // str2指向了常量区的100
- String str3 = new String("100"); // str3指向了堆区的对象
- String str4 = new String("100"); // str4指向了堆区的对象
- StringBuilder str5 = new StringBuilder("100"); // str5指向了堆区的对象
- StringBuilder str6 = new StringBuilder("100"); // str6指向了堆区的对象
- System.out.println(str1 == str2); // true, 地址值相同
- System.out.println(str3 == str4); // false, 地址值不同
- System.out.println(str5 == str6); // false, 地址值不同
-
- //=====================下面的这些不能理解=============================
-
- HashSet<String> hs1 = new HashSet<String>();
- hs1.add(str1);
- hs1.add(str2);
- System.out.println(hs1); // 这里打印出[100],str1和str2指向同一个对象只能添加一个,这个很好理解
-
- HashSet<String> hs2 = new HashSet<String>();
- hs2.add(str3);
- hs2.add(str4);
- System.out.println(hs2); // 这里打印出[100]就很奇怪了,str3和str4明明是不同的地址,却只成功添加一个?
-
- HashSet<StringBuilder> hs3 = new HashSet<StringBuilder>();
- hs3.add(str5);
- hs3.add(str6);
- System.out.println(hs3); // [100, 100], 这里能够理解,因为我觉得地址值不同的2个对象都可以被添加进HashSet。
-
- // 问题:为什么堆区的2个String对象只成功添加了1个,而StringBuffer和StringBuilder都可以添加2个?
- }
- }
-
复制代码 求解释。
|
|