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值只能用来缩小范围,而不是可以直接代表的一个对象的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值