2023-05-18 题目

2023-05-18 题目

1、String 字符串

  • String 不是基本数据类型,且是不能被继承的,因为string类被final修饰
//源码
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    
    }

常见题目:

public static void main(String[] args) {
    
    
        // a 为一个引用
        String a = new String("ab");
        // b为另一个引用,对象的内容一样
        String b = new String("ab");
        // 放在常量池中
        String aa = "ab";
        // 从常量池中查找
        String bb = "ab";
        // true
        System.out.println(aa == bb);
        // false,非同一对象
        System.out.println(a == b);
        // true
        System.out.println(a.equals(b));
        // false
        System.out.println(a == aa);
    }
    public static void main(String[] args) {
    
    
        String s = "helloWord";
        String s1 = "hello"+"Word";
        String s2 = "hello";
        String s3 = "Word";
        String s4 = s2+s3;
        String s5 = new String("helloWord");
        //true s是常量池的,s1(编译期已经组合在一起了)也指向常量池的同一个对象
        System.out.println(s == s1);
        //false Java在进行字符串拼接时,会生成新的字符串对象,s4指向的不在常量池了
        System.out.println(s == s4);
        //false Java在进行字符串拼接时,会生成新的字符串对象,s4指向的不在常量池了
        System.out.println(s1 == s4);
        //false s是常量池的,s5是new的,地址不一样
        System.out.println(s == s5);
    }

2、String、StringBuilder和StringBuffer

string: 不可变的,一旦被创建是不能被修改的,每次拼接字符串都是new了一个新的对象

stringBuilder: 可变的,线程不安全,执行效率高,适用于单线程的情况下,对字符串进行修改;

StringBuffer: 可变的,线程安全,执行效率稍低,适用于多线程的情况下,对字符串进行修改;

3、==和equals的区别

==:对于基本数据类型来说比较的是值的大小,对于引用类型来说比较的是地址是都相同

equals:对于没有重写object中的equlas的方法来说,==和equals在引用类型比较的时候,作用是一样的,对于string来说,equals就是比较两个字符串的内容是否相等

object中的equals源码:

public boolean equals(Object obj) {
    
    
return (this == obj);
}

4、重写hashCode()与 equals()

  • hashcode()简介:

hashcode()获取哈希码,也称为散列码,返回的是一个int整数,是Object中的一个native的本地方法,是使用c或者c++来实现的,将内存地址转换成一个整数返回;

public native int hashCode();
  • hashcode码的作用

hashSet如何检查重复值:当你把对象加入到hashSet中时,会先计算对象的hashCode的值来判断对象加入的位置,且会和其他已经存在的值的hashCode进行比较,如果没有一样的,则没有重复的项,如果有重复项,则需要比较equals是否相同,相同则不要加入进去,这样的话则减少了equals的次数,提高了执行的速度;

  • 如果两个对象相等,则hashCode一定也是相同的,两个对象相等的话,对两个对象分别调用equals方法方法都返回true,两个对象有相同的hashCode值,不一定相等的,所以说要是重写equals,则hashCode也需要覆盖的

  • 两个对象不相等,也可能存在相同的hashCode值

因为 hashCode() 所使用的杂凑算法也许刚好会让多个对象传回相同的杂凑值。越糟糕的杂凑算法越 容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不同的对象得到相同的 hashCode 。

所以 hashCode值只能用来缩小范围,而不是可以直接代表的一个对象的

猜你喜欢

转载自blog.csdn.net/weixin_43987718/article/details/130754328