0
点赞
收藏
分享

微信扫一扫

【语音之家】AI产业沙龙 —— 三星语言智能团队ICASSP2023论文分享会

拾光的Shelly 2023-04-23 阅读 69

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,==号在引用数据类型是比较的是地址值

2 两个对象的hashcode值相同,则equals是否也相同?

2.1 不对,两者间没有太大的关系

2.2 重写的hashCode方法调用

2.3 Arrays的hashCode方法

3 重写equals的时候需不需要重写hashcode呢?

举报

相关推荐

0 条评论