Java基础知识回顾,还记得吗?( 三 )

  • 为什么重写equals方法一定要重写hashcode方法?
  • 在普通环境下(不涉及hash表) , equals方法和hashcode方法一毛钱关系没有的 , 此时重写equals但不重写hashcode是没有关系的 。 但当使用map、set这些散列表时 , 它们会根据对象的hashcode来计算对象在散列表中的位置的 。 试想下,如果2个对象的值相等,但是由于它们是2个对象,hashcode却不相等 。那么即使放入map,set(map)仍会存在重复数据 。
    深拷贝和浅拷贝
    • 深拷贝:拷贝所有的内容 , 除了基本数据类型变量复制一份 , 连引用类型变量也复制一份 。
    • 浅拷贝:复制基本数据类型变量 , 对于引用类型的变量 , 直接返回这个引用本身 。
    IO流分类
    • 按照流的流向 , 分为:输入流和输出流 。
    • 按照操作单元 , 分为:字节流和字符流 。
    使用字节流还是字符流?考虑通用性 , 应该使用字节流 。 如果只是文本文件的操作 , 可以使用字符流 。
    BigDecimalBigDecimal时Java中表示大浮点数的类型 。
    在Java中 , 如果遇到浮点数的判断 , 可以使用BigDecimal来做计算 , 因为如果使用普通数据类型很可能会发生精度丢失的情况 , 这个时候的结果可能会出乎意料之外 。
    Java异常体系结构在Java中,异常分为 Exception和Error,这2个类都继承自Throwable 。
    • Exception: Exception异常是程序本身可以处理的 。 Exception 分为运行时异常(RuntimeException)和 非运行时异常(CheckedException) 。
    • RuntimeException: RuntimeException(运行时异常)是在程序运行时可能会发生的异常,如NullPointException, 这类异常往往是不可预料的,编译器也不会要求你手动try catch或throws 。
    • CheckedException: CheckedException(非运行时异常)是RuntimeException以外的异常,如IOException ,这类异常要求必须显示的try catch或throws,如果不处理,那么编译就不会通过 。
    • Error: Error错误是程序无法处理的,表示程序或JVM出现了很严重的 , 无法解决的问题 。
    Comparable和Comparator
    • Comparable: 自然排序接口 。 实现了它的类意味着就支持排序 。
    • Comparator: 外部比较器 。 无需让需要排序的对象实现排序逻辑 , 而是根据Comparator定义的逻辑来排序 。Comparator相较于Comparable更加的灵活 。
    为什么要慎用 Arrays.asList()?因为Arrays.asList这个方法返回的根本就不是我们期盼的ArrayList, 而是Arrays类内部实现的ArrayList,这个内部类只支持访问和set操作, 并不支持remove,add,clear等修改操作 。
    Java中引用的类型Java中引用类型总共有四种: 强引用 , 软引用 , 弱引用 , 虚引用 。
    • 强引用(Strong Reference): Java程序中绝大部分都是强引用 , 一般使用new关键字创建的对象就是强引用 。只要强引用存在 , 强引用的对象就不会被回收 , 除非不可达(参考jvm部分)
    • 软引用(Soft Reference): 软引用一般不会被回收 , 但是当堆内存不够的时候 ,比如几乎快要发生OOM的时候 , 就会回收掉软引用对象 。
    • 弱引用(Weak Reference): 只要垃圾回收开始 , 就会回收掉弱引用的对象 。
    • 虚引用(Phantom Reference,又称幽灵引用): 和其他几种引用不同 , 虚引用不决定对象的生命周期 ,它在任何时候都可能被回收掉 。