0
点赞
收藏
分享

微信扫一扫

手写一个uart协议——rs232(未完)

面试 Java 基础八股文十问十答第二十七期

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)什么是内部类,有什么用?

内部类是定义在其他类内部的类,可以访问外部类的成员变量和方法。内部类可以分为四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。它们各自有不同的使用场景和特点:

  • 成员内部类:定义在外部类的成员位置,可以直接访问外部类的成员,常用于实现某个功能的辅助类或者某个类的辅助类。
  • 局部内部类:定义在方法内部的类,作用域仅限于该方法内部,常用于解决一些局部性的问题。
  • 匿名内部类:没有类名的内部类,通常用于创建临时性的、一次性的类实例。
  • 静态内部类:被声明为静态的内部类,与普通的静态成员类似,不依赖于外部类的实例,可以直接使用外部类的静态成员,常用于将一组相关的类组织在一起。

内部类的主要作用是实现一些封装和组织上的需求,使得代码结构更加清晰,同时也可以增强类与类之间的联系。

2)JDK8 有哪些新特性?

Java 8 引入了许多新特性,其中一些最重要的包括:

  • Lambda 表达式:Lambda 表达式允许将函数作为方法参数传递,使得代码更加简洁、易读。
  • Stream API:Stream API 提供了一种处理集合的流式操作,可以更方便地进行数据处理和操作。
  • 新的日期和时间 APIjava.time 包提供了全新的日期和时间 API,解决了旧的 java.util.Datejava.util.Calendar 存在的一些问题。
  • 接口默认方法:接口可以包含默认方法的实现,使得接口的演化更加灵活,可以向已有的接口添加新的方法而不破坏实现这个接口的类。
  • 方法引用:方法引用允许在某些情况下使用现有方法的引用作为 Lambda 表达式的替代,可以简化代码。
  • 可重复注解:允许在同一个地方多次使用同一注解类型,提高了代码的可读性。

3)JDK 把 String 中 char 数组改成了 byte 数组,你知道为什么吗?

实际上,JDK 并没有将 String 中的字符数组改成字节数组。String 类在 Java 中仍然使用 char 数组来存储字符串的内容,因为 Java 中的字符是以 UTF-16 编码存储的,每个字符占用两个字节(16 位)。

可能你在某些情况下听说过字符串在底层可能使用字节数组来存储,这主要是因为字符串的编码问题。当将字符串转换为字节数组时,会根据指定的字符编码将字符转换为字节。在 Java 中,可以使用 String 类的 getBytes() 方法来将字符串转换为字节数组,默认情况下会使用平台的默认字符集,也可以指定使用特定的字符集。这种情况下,得到的字节数组是根据指定的字符编码进行编码的,而不是直接将字符数组转换为字节数组。

总的来说,String 类在内部仍然使用 char 数组来存储字符串的内容,而字节数组通常是用于在不同字符编码之间进行转换时产生的。

4)String,StringBuffer,StringBuilder的区别?

  • String:String 是不可变的字符序列,一旦创建就不能被修改。每次对字符串进行修改操作(如拼接、替换等),都会生成一个新的字符串对象,原始字符串对象不会改变。这样的设计保证了字符串的安全性和线程安全性,但会带来性能上的开销。
  • StringBuffer:StringBuffer 是可变的字符序列,适用于在多线程环境下进行字符串操作。它的方法都是同步的,因此是线程安全的。但是在单线程环境下,使用 StringBuffer 会带来额外的性能开销。
  • StringBuilder:StringBuilder 与 StringBuffer 类似,也是可变的字符序列,但不保证线程安全。它的方法不是同步的,因此在单线程环境下性能更好。如果确定不需要线程安全,建议使用 StringBuilder,而不是 StringBuffer。

5)StringBuilder是内部如何实现的?

StringBuilder 内部是通过一个可变的字符数组来存储字符串内容的,初始容量为 16 个字符。当需要追加字符时,如果当前容量不足,则会根据需要扩展容量,通常是以当前容量的 2 倍进行扩展,并将原有的字符拷贝到新的数组中。这种动态扩展的方式使得 StringBuilder 可以高效地处理不断增长的字符串。

6)包装类型和基本类型有什么区别?

  • 基本类型:基本类型是 Java 中的原始数据类型,包括 int、long、float、double、boolean、char 等。它们在内存中直接存储数值,没有额外的结构,因此具有较高的效率。基本类型通常用于存储简单的数值和布尔值。
  • 包装类型:包装类型是基本类型的对象包装器,在 Java 中有对应的类,如 Integer、Long、Float、Double、Boolean、Character 等。这些类提供了一些额外的功能,如方法和常量,同时也允许在对象上进行操作。包装类型通常用于集合类和泛型等需要对象的场景。

主要区别包括:

  1. 存储方式:基本类型直接存储数值,而包装类型存储在堆内存中,需要额外的内存空间来存储对象的结构。
  2. null 值:基本类型不能为 null,而包装类型可以为 null。
  3. 性能:基本类型具有较高的性能,因为不涉及对象的创建和销毁,而包装类型的性能通常比较低,因为涉及到对象的创建、垃圾回收等额外的开销。
  4. 类型转换:基本类型之间可以进行隐式类型转换,而包装类型之间需要通过方法进行显式转换。
  5. 泛型:在泛型中不能使用基本类型,而只能使用包装类型。

在实际开发中,可以根据需要选择使用基本类型还是包装类型,通常建议在集合类、泛型以及需要 null 值的场景中使用包装类型。

7)JDK 和 JRE 的区别?

  • JDK(Java Development Kit):Java 开发工具包,包含了开发 Java 程序所需的工具和库,如编译器(javac)、Java 运行时环境(JRE)、调试器(jdb)等。JDK 是面向开发人员的,提供了开发 Java 应用程序所需的全部功能。
  • JRE(Java Runtime Environment):Java 运行时环境,包含了运行 Java 程序所需的库和虚拟机(JVM)。JRE 是面向普通用户的,提供了运行 Java 应用程序所需的全部功能,但不包含开发 Java 程序的工具。

简而言之,JDK 包含了 JRE,同时还包含了用于开发 Java 程序的工具和库。

8)用过哪些 JDK 提供的工具?

JDK 提供了许多工具,其中一些常用的包括:

  • javac:Java 编译器,用于将 Java 源代码编译成字节码文件。
  • java:Java 解释器,用于运行 Java 字节码文件。
  • jar:Java 归档工具,用于创建和管理 JAR 文件,以及将 Java 应用程序打包成可执行的 JAR 文件。
  • javadoc:Java 文档生成工具,用于根据 Java 源代码生成 API 文档。
  • jdb:Java 调试器,用于调试 Java 程序。
  • jpsjstat:用于监视 Java 运行时环境的工具。
  • jstack:Java 堆栈跟踪工具,用于生成 Java 进程的线程转储。

这些工具可以帮助开发人员编写、调试和运行 Java 程序,以及生成 API 文档和监视应用程序的运行状态。

9)hashCode 和 equals

  • hashCode 方法hashCode() 方法是 Object 类中的一个方法,用于返回对象的哈希码值,它是一个整数。哈希码值是根据对象的内容计算出来的,具有一定的唯一性,但并不保证唯一。在使用哈希表等数据结构时,哈希码值常常用于确定对象的存储位置,以提高查找的效率。
  • equals 方法equals() 方法是 Object 类中的一个方法,用于比较两个对象是否相等。默认情况下,equals() 方法与 == 操作符的作用相同,即比较两个对象的引用是否相同。但是,通常需要根据对象的内容来确定是否相等,因此在自定义类中往往需要重写 equals() 方法。

在重写 equals() 方法时,通常需要满足以下条件:

  1. 自反性:对于任何非 null 的引用值 x,x.equals(x) 应该返回 true。
  2. 对称性:对于任何非 null 的引用值 x 和 y,如果 x.equals(y) 返回 true,则 y.equals(x) 也应该返回 true。
  3. 传递性:对于任何非 null 的引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 也返回 true,则 x.equals(z) 应该返回 true。
  4. 一致性:对于任何非 null 的引用值 x 和 y,如果对象中的信息没有被修改,则 x.equals(y) 应该在多次调用中始终返回 true 或始终返回 false。
  5. 对于任何非 null 的引用值 x,x.equals(null) 应该返回 false。

10)== 和 equals

  • == 操作符:在 Java 中,== 操作符用于比较两个对象的引用是否相等,即判断两个对象是否指向同一块内存地址。对于基本类型,== 操作符用于比较它们的值是否相等。
  • equals 方法equals() 方法用于比较两个对象的内容是否相等。默认情况下,equals() 方法与 == 操作符的作用相同,即比较两个对象的引用是否相同。但是,通常需要根据对象的内容来确定是否相等,因此在自定义类中通常需要重写 equals() 方法。

在重写 equals() 方法时,应该根据对象的内容来确定相等性,而不仅仅是比较引用地址。通常需要满足 equals() 方法的约定,以确保在集合类等需要根据内容比较对象时能够正确工作。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 1300+ Star,1.5W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐

举报

相关推荐

0 条评论