Java基础知识

106 阅读2分钟

equal与==、hashCode的区别和使用场景

  • ==:用于比较变量所对应的内存中所存储的数值是否相同,可用来比较两个基本类型的数据或两个引用变量
  • equal:用于比较两个独立对象的内容是否相同
  • hashCode:重写equals()一般会比较的全面一点,效率也会比较低,而利用hashCode()进行比较,只要生成一个hash值就可以进行比较,效率很高。但是hashCode并不是完全可靠的,有时候会产生hash冲突,如果需要大量并且快速的对比一般可以先对比hashCode,如果不相等,那么两个对象肯定不相等,如果相等再用equals()去对比,两者都相同了,对象才相同。

String为什么要设计成不可变的

  1. 字符串常量池的需要,如果允许改变,会导致各种逻辑错误,改变一个对象会影响另一个独立的对象
  2. 允许String对象缓存hashCode,哈希码会被频繁的使用,可以保证hash码的唯一性,更放心地进行缓存
  3. 安全性,会被很多类用来当做参数,如网络url,文件路径path等,如果不固定会有安全隐患

谈一谈Java成员变量,局部变量和静态变量的创建和回收时机

  1. 成员变量:生命周期伴随着类对象,类对象回收时也跟着回收,存在堆里
  2. 静态变量:在方法区随着类的加载而加载,随着类的消失而消失,如果是类在长时间不使用,不利用,不关联的情况下才有可能会被回收机制回收,所以它的生命周期特别长
  3. 局部变量:方法调用时创建,方法结束时会被标记为可回收,存在栈里