【Java基础】八股总结二:类与对象、IO流

116 阅读6分钟

类与对象

为什么重写 equals hashCode

【Java】自定义对象作为HashMap的键,同时重写hashCode和equals方法_自定义一个类作为hashmap的键类型,并测试效果。 1、定义一个雇员employee类,用它-CSDN博客

equals比较对象内容

hashCode是Object类方法,是哈希值,默认是对象地址,可以重写。

我的描述:

  1. 通常自定义对象作为 Map的key 的时候,如果我们向map中put了对象和value,如果想通过另一个与该对象内容相同的对象 取出这个value,那么需要都重写。
  2. 为什么都重写,重写一个不行吗,因为这跟hashmap的结构有关。
  3. 重写hashCode方法为了在散列表中同一位置(桶)查找,重写equals方法为了确认同一位置查找出来的两个对象内容是相等的(因为存在hash冲突)。

equals和hashCode区别

  1. 都是Object类方法,equals默认==,hashCode默认是native方法默认是hashCode值
  2. 自定义对象使用到如HashSet和HashMap集合时,通常需要重写这两个方法,重写目的.......

为什么重写equals一定要重写hashCode

或者说 equals、hashCode的应用场景

主要是为了保证对象在使用哈希集合(如HashSet、HashMap等)时的正确性和一致性

抽象类和接口的区别?

三点语法区别,一点语义区别

相同点:都不能实例化,都有抽象方法。

不同点:

  • 实现方式: 实现接口的关键字为implements,继承抽象类的关键字为extend一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承
  • 方法方式:
    • 接口只有定义,不能有方法的 实现, java 1.8中可以定义default方法体。
    • 抽象类可以有方法定义与 实现 ,方法可在抽象类中实现
  • 访问修饰符:
    • 接口成员变量默认为public static final静态常量,必须赋初值,不能被修改; 其所有的成员方法都是public、abstract的。
    • 抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;

语意的区别,什么时候用接口什么时候用抽象类

  • 接口 描述 事物的共有特征,如flyable会飞的等。
  • 抽象类 描述 一个具体抽象概念,如 动物,植物,食物。

抽象类及接口 作用

接口对类 的行为进行约束实现了某个接口就 有某个行为

抽象类 可以为子类提供一个模板,主要为了提高代码复用

举一些接口对类行为进行约束的例子

  • Serializable序列化接口(标记接口),cloneable克隆接口(标记接口
  • comparable接口,实现compareTo方法
  • comparator接口,实现compare方法

重载和重写的区别?(重要)

重载: 对于同一个类中(或者继承而来)的方法,同名方法有不同的参数列表(参数类型、参数个数)为重载。返回值类型可以相同也可以不同,但不能通过返回类型是否相同来判断重载

重写: 对父类方法重写(参数列表,返回值类型,访问修饰符,抛出异常)

  • 参数列表相同返回值类型相同或为子类
  • 访问修饰符的限制一定要大于等于被重写方法的访问修饰符(public>protected>default>private)
  • 重写方法的只能抛出比 被重写方法 更窄的检查异常,就是不能抛出新的检查异常。

面向对象三大特性,封装、继承、多态

封装: 封装是指将对象的属性 和 方法 结合在一起,对外隐藏对象的内部细节,仅通过对象提供的接口与外界交互。封装的目的是增强安全性和简化编程。

继承:继承是一种可以使得子类自动共享父类数据结构和方法的机制。优势,代码复用,方便对类进行拓展。

多态:在继承的基础上,子类重写父类的方法, 父类的引用指向子类对象 并 调用重写的方法。调用同一方法对于不同的子类对象有不同的行为。使程序更灵活 和 更好拓展。(如何更灵活,比如Spring中通过接口注入bean,在调用bean方法的时候可以更灵活,不需要改业务代码,只需要改bean具体的实现类

Java中为什么只能单继承父类,可以多实现接口吗? 百度

  1. 存在菱形继承问题。假设类B和类C都继承自类A,然后类D同时继承B和C,那么如果A、B、C都定义并实现了同一个方法,当D调用这个方法时,编译器就不知道应该调用B中的方法还是C中的方法
  2. 为什么可以多实现接口。因为接口中只有方法定义没有具体方法的实现

Object类有哪些方法?

  • equals
  • hashCode
  • toString
  • notify,notifyAll
  • wait
  • clone
  • finalize

finalize方法是什么、作用

  1. 对象被GC前会调用对象的finalize方法,默认是空方法。
  2. 子类可以通过重写清理对象的资源,或者在这个方法中将this对象重新引用将不会被GC

IO流

IO简单介绍

Java IO 设计模式总结

了解常用的节点流和处理流,以及处理流用到的装饰器模式(以组合的方式对原有对象进行包装,在不改变原有对象和 类 的情况下 进行拓展) 。相当于处理流包装在节点流之上。


常用的节点流 :(直接对数据进行读写)

  • 文件流: FileInputStream、FileOutputStrean、FileReader、FileWriter
  • 字节/字符数组流: ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter
    • 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。

常用处理流 :(套在 连接在 已经存在的节点流上)

  • 缓冲流:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
    • 作用:增加缓冲功能,避免频繁读写硬盘,进而提升读写效率。
  • 转换流:InputStreamReader、OutputStreamReader
    • 作用:实现字节流和字符流之间的转换。
  • 对象流:ObjectInputStream、ObjectOutputStream
    • 作用:提供直接读写Java对象功能,用于序列化和反序列化
  • 数据流:Data input/output Stream。读写java的基本数据类型

IO流为什么要分字节流字符流

字符流是 jvm 将字节转换得到的。

字符流专门处理文本文件,如果不知道编码类型,使用字节流容易乱码

文件流和缓冲流的区别?fileInputStream 和 bufferdInputStream的区别?

参考尚硅谷java基础课笔记 和 Java核心技术书籍

  1. 首先,文件流是节点流,缓冲流是处理流(套在节点流上)。
  2. 第二,缓冲流是文件流的包装类,套在文件流之上,文件流作为缓冲流的一个成员。采用了装饰器的设计模式。
  3. 第三,最主要的。缓冲流中一个默认8KB的缓冲区,在读写时,不会每次都访问设备,只有当缓冲区为空(读数据时)或者满(写数据时) ,才会访问设备一次性读取/写入整个缓冲区数据,可以减少IO次数。

在创建流对象时,内部会创建一个缓冲区数组(缺省使用8192个字节(8Kb)的缓冲区),通过缓冲区读写,减少系统IO次数,从而提高读写的效率。