21. 说一说hashCode()和equals()的关系(⭐⭐)
- hashCode()用于获取哈希码,默认情况下会讲内存地址转换成int,当作哈希码。
- auqls()用于比较两个对象是否相等
如果只重写hashCode:可能当哈希冲突时,虽然两个对象相等,还是equals还是返回False,导致hashset具有两个相同对象。
如果只重写equals:可能两个对象相等,但是不会发生哈希冲突,导致hashset具有两个相同对象。
22. 为什么要重写hashCode和equals(⭐⭐)
Object类提供的equals()方法默认是用==来进行比较的,也就是说只有两个对象是同一个对象时,才能返回相等的结果。
而实际的业务中,我们通常的需求是,**若两个不同的对象它们的内容是相同的,就认为它们相等。**所以应该重写equals方法。
同时,如果重写equals就一定要重写hashCode方法。如果不重写可能会出现两个对象相等,但是不会发生哈希冲突,导致hashset具有两个相同对象的情况。
23. ==和equals()有什么区别(⭐⭐⭐)
- ==运算符:
- 作用于基本数据类型时,是比较两个数值是否相等;
- 作用于引用数据类型时,是比较两个对象的内存地址是否相同
- equals()方法:
- 没有重写时,Object默认以 == 来实现,即比较两个对象的内存地址是否相同;
- 进行重写后,一般会按照对象的内容来进行比较,若两个对象内容相同则认为对象相等
24. String类有哪些方法?(⭐)
- • char charAt(int index):返回指定索引处的字符;
- • String trim():删除字符串前导和后置的空格;
- • int indexOf(String str):返回子串在此字符串首次出现的索引;
- • int lastIndexOf(String str):返回子串在此字符串最后出现的索引;
25. String可以被继承吗?(⭐⭐)-
String类由final修饰,所以不能被继承。
之所以要把String类设计为不可变类,主要是出于安全和性能的考虑,可归纳为如下4点。