String类的hashCode()方法源码分析

2023-12-16 04:59:33

Object类中的hashCode()方法:?

  • 同一个对象,hashCode必须相同;如果两个对象的equals相等,那么hashCode也必须要相等!
  • hashCode()方法是native本地方法,是C++代码,hashCode的值,不一定是指向对象的内存地址,具体是什么值,底层依赖于JVM的具体实现,但是,同一个对象的hashCode()必须要唯一,所以hashCode就是唯一标识一个对象的。
  • 在每个覆盖了equals()方法的类中,也必须覆盖hashCode()方法,因为如果不这样做的话,就会违反Object.hashCode()的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable

String类中的hashCode()方法:

  • String字符串重写了equals()方法,就必须要同时重写hashCode()方法,目的是确保:equals相等,hashCode也必须要相等。
  • String字符串的equals()和hashCode()方法都是基于字符串内容去计算的,由于字符串内容相同,所以equals()就相同,hashCode()也相同。
  • String类的equals()方法就是将String字符串转为char[]数组,然后while循环遍历比较两个char[]数组的字符是否相等,如果相等返回true,如果有一个不相等,则直接返回false。

String类中的hashCode()方法源码:

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

JDK 8及其之前String底层由char[]数组构成的(就是对字符数组的封装),JDK 9之后,String底层采用的byte[]数组。

String有没有长度限制??

  • 有长度限制。?

编译期间

根据虚拟机规范:

编译期间,字符串的最大长度不能超越65535个字节,即编译期间的String字符串的最大长度为65534个字节,不然就会编译报错。

运行期间

运行期间,String的最大长度就要看Integer.MAX_VALUE的值了,即:2^31 - 1个字节。
不管怎样,String的最大长度就不能超过虚拟机当前最大内存设置。?

数组有没有length()方法?String呢??

  • 数组没有length()方法,但是有length属性,String有length()方法。?
package com.gch.demo;

/**
 * @author GAO
 * @date 2023-12-15
 */
public class LengthDemo {
    public static void main(String[] args) {
        String str = "Java";
        String[] languages = {"Java","Python","PHP"};
        System.out.println(str.length()); // 字符串有length()方法
        System.out.println(languages.length); // 数组有length属性
    }
}

注意:从JDK 7开始,switch是可以用在字符串String上的。

String类是可变的吗?为什么?

Java中的String类设计是不可变的,String类是final类型的,不能被继承,器对应的char字符类型的value[]数组被定义成private final的,说明不能通过外界修改,即不可变~!

文章来源:https://blog.csdn.net/weixin_53622554/article/details/135016847
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。