vector线程安全的集合
hashset底层为hashmap
文章目录
1 “==”和equals的区别是什么?
1.1 “==”解释
案例:
final String str2 = "ab";//在字符串常量池中创建“ab”,并将地址值赋值给str2
System.out.println(str2);
final String str3 = "cd";//在字符串常量池中创建“cd”,并将地址值赋值给str3
System.out.println(str3);
String str6 = new String("abcd");//在堆中开辟地址空间,并把得到的地址值赋值给str6
String str4 = str2+str3;//在字符串常量池中得到abcd的地址
System.out.println(str4);
String str5 = "abcd";//在字符串常量池中创建abcd时,发现已有,不用创建,就使用创建好的地址值
System.out.println("str4 = str5 : " + (str4==str5));//true
System.out.println("str6 = str5 : " + (str6==str5));//false
1.2 “equals”解释
案例:
final String str2 = "ab";//在字符串常量池中创建“ab”,并将地址值赋值给str2
System.out.println(str2);
final String str3 = "cd";//在字符串常量池中创建“cd”,并将地址值赋值给str3
System.out.println(str3);
String str6 = new String("abcd");//在堆中开辟地址空间,并把得到的地址值赋值给str6
String str4 = str2+str3;//在字符串常量池中得到abcd的地址
System.out.println(str4);
String str5 = "abcd";//在字符串常量池中创建abcd时,发现已有,不用创建,就使用创建好的地址值
System.out.println("str4 = str5 : " + (str4==str5));//true
System.out.println("str6 = str5 : " + (str6==str5));//false
System.out.println(str6.equals(str4)); //true :String底层重写了equals比较的是对象的内容
1.3 注意点:equals不能比较基本数据类型
1.4 Integter缓存数组
1.4.1 引入案例发现问题
1.4.2 解释缓存数组
1.5 字符串常量池
1.5.1 案例一
final String str2 = "ab";//在字符串常量池中创建“ab”,并将地址值赋值给str2
System.out.println(str2);
final String str3 = "cd";//在字符串常量池中创建“cd”,并将地址值赋值给str3
System.out.println(str3);
String str6 = new String("abcd");//在堆中开辟地址空间,并把得到的地址值赋值给str6
String str4 = str2+str3;//在字符串常量池中得到abcd的地址
System.out.println(str4);
String str5 = "abcd";//在字符串常量池中创建abcd时,发现已有,不用创建,就使用创建好的地址值
System.out.println("str4 = str5 : " + (str4==str5));//true
System.out.println("str6 = str5 : " + (str6==str5));//false
System.out.println(str6.equals(str4)); //true :String底层重写了equals比较的是对象的内容
1.5.2 案例二
String s1 = new String("abc");//堆中开辟新空间,得到新地址值
String s2 = new String("abc");//堆中开辟新空间,得到新地址值
System.out.println(s1 == s2);//false
System.out.println(s1.equals(s2)); // true:底层重写了equals方法
1.5.3 案例三
String s1 = "abc";//字符串常量池中创建abc,得到地址值
String s2 = new String("abc");//堆中开辟新空间,得到新地址值
s2.intern();//可以拿到s2的常量
System.out.println(s1 ==s2);//false
1.5.4 案例4
String str1 = "ab" + "cd";//先做计算得到abcd,字符串常量池中创建,并得到地址值
String str11 = "abcd";//字符串常量池发现已有,直接得到地址值
System.out.println("str1 = str11 : "+ (str1 == str11)); //TRUE
1.5.5 案例5
String str2 = "ab";//字符串常量池中创建,并得到地址值
String str3 = "cd";//字符串常量池中创建,并得到地址值
String str4 = str2+str3;//此处相当于str2+new String(str3)
String str5 = "abcd";//字符串常量池发现已有,直接得到地址值
System.out.println("str4 = str5 : " + (str4==str5));//false
1.5.6 案例6
final String str2 = "ab";//被final修饰的变量只能被赋值一次
final String str3 = "cd";//被final修饰的变量只能被赋值一次
String str4 = str2+str3;//“ab”+"cd"="abcd",并在字符串常量池中创建abcd,得到地址值
String str5 = "abcd";//字符串常量池发现已有,直接得到地址值
System.out.println("str4 = str5 : " + (str4==str5));//TRUE
1.5.7 案例7
String str6 = "b";//字符串常量池中创建b,得到其地址值
String str7 = "a" + str6;//此处相等于:“a”+new String(str6)
String str67 = "ab";//字符串常量池中创建ab,得到其地址
System.out.println("str7 = str67 : "+ (str7 == str67));//false
1.5.8 案例8
final String str8 = "b";//final修饰的变量,只能被赋值一次
String str9 = "a" + str8;//此处相等于:“a”+“b”先做计算得到值:ab,并在字符串常量池中创建ab,得到其地址值
String str89 = "ab";//在字符串常量池中,创建ab是发现已有,得到其地址值
System.out.println("str9 = str89 : "+ (str9 == str89)); //TRUE
1.5.9 案例9
String s1="Hello";//字符串常量池中创建并得到地址值
String s2="hello";//字符串常量池中创建并得到地址值
String s3=s1.toLowerCase();//将大写转为小写,但是地址值仍是先前的
String s4=s2.toLowerCase();//将大写转为小写,但是地址值仍是先前的
System.out.println(s3==s4);//false,==号在引用数据类型是比较的是地址值