面试 Java 基础八股文十问十答第十五期
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)BIO, NIO, AIO 有什么区别?
- BIO(Blocking I/O):BIO 是传统的 Java I/O 模型,它是阻塞的,意味着当一个线程执行 I/O 操作时,它会一直等待直到数据被读取或写入完成。这种模型下,每个连接都需要一个独立的线程来处理,当连接数较大时会导致资源消耗严重,性能较差。
- NIO(Non-blocking I/O):NIO 是 Java 中引入的一种更灵活的 I/O 模型。它提供了通道(Channel)和缓冲区(Buffer)的概念,使得可以使用单个线程管理多个连接。NIO 提供了非阻塞的 I/O 操作,通过选择器(Selector)可以轮询多个通道的状态,当某个通道就绪时,可以进行相应的读写操作。相比于 BIO,NIO 可以更高效地处理大量连接。
- AIO(Asynchronous I/O):AIO 是 Java 7 中引入的一种异步 I/O 模型。它在 NIO 的基础上进一步提供了异步 I/O 操作的支持,即在进行 I/O 操作时可以指定一个回调函数,在操作完成时自动调用该函数,不需要线程等待。AIO 通常用于处理较大的数据流,例如文件的异步读写操作。
2)Files 的常用方法都有哪些?
Java 中的 Files
类提供了一组用于操作文件和目录的静态方法,常用的方法包括但不限于:
Files.exists(Path path)
:检查指定路径是否存在。Files.createFile(Path path)
:创建一个新文件。Files.createDirectory(Path dir)
:创建一个新目录。Files.copy(Path source, Path target, CopyOption... options)
:复制文件或目录。Files.move(Path source, Path target, CopyOption... options)
:移动文件或目录。Files.delete(Path path)
:删除文件或目录。Files.readAllBytes(Path path)
:读取文件的所有字节。Files.lines(Path path)
:逐行读取文件内容。Files.write(Path path, byte[] bytes, OpenOption... options)
:将字节数组写入文件。Files.write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options)
:将字符串集合逐行写入文件。
3)什么是反射机制?
反射(Reflection)是指在运行时动态地获取类的信息以及操作类的属性和方法的能力。在 Java 中,反射机制允许程序在运行时检查类的属性和方法,获取类的构造函数信息,创建类的实例,以及调用类的方法等。Java 的反射 API 主要包括 java.lang.Class
类以及其相关方法,例如 getField()
、getMethod()
、getConstructor()
等。
反射机制的主要应用场景包括但不限于:
- 在运行时动态加载类和创建对象,例如通过类名字符串来加载类并创建对象。
- 在运行时动态调用类的方法,例如通过方法名字符串来调用方法。
- 分析类的属性和方法,例如获取类的字段、方法、构造函数等信息。
- 实现通用的框架和工具,例如 Java 的 ORM(对象关系映射)框架和序列化框架。
尽管反射提供了一种强大的机制来操作类的属性和方法,但由于其涉及到动态类型检查和动态调用,通常会导致性能较低,并且在编写代码时易于出错。因此,应该在必要时使用反射,避免滥用。
4)反射机制优缺点
优点:
- 动态性: 反射机制允许在运行时动态地加载类、创建对象、调用方法,从而使得程序的行为可以更加灵活和动态。
- 扩展性: 反射机制提供了一种强大的扩展机制,允许程序在不修改源代码的情况下对现有类进行扩展和定制。
- 灵活性: 反射机制使得程序可以更加灵活地处理各种类型的对象,而不需要提前确定对象的类型。
缺点:
- 性能开销: 反射涉及到动态类型检查和方法调用,通常比直接调用方法要慢,因此可能会带来一定的性能开销。
- 安全性问题: 反射机制可以访问和修改类的私有属性和方法,因此可能会破坏封装性,引起安全漏洞。
- 可读性和维护性差: 反射使得程序的结构更加复杂,降低了代码的可读性和维护性,使得程序更难以理解和调试。
5)反射机制的应用场景有哪些?
反射机制在许多场景下都有广泛的应用,包括但不限于:
- 框架开发: 框架通常需要处理各种类型的对象,并且提供通用的接口供用户使用,反射机制可以使框架更加灵活和通用。
- 工具开发: 许多工具在运行时需要加载和操作用户提供的类,反射机制可以使工具更加灵活和可扩展。
- ORM(对象关系映射)框架: ORM 框架通常需要在运行时根据类的属性和数据库表的字段进行映射,反射机制可以帮助 ORM 框架实现自动映射。
- 序列化和反序列化: 反射机制可以帮助序列化和反序列化框架在运行时动态地获取类的属性信息,从而实现对象的序列化和反序列化。
6)Java 获取反射的三种方法
在 Java 中获取反射的三种主要方法包括:
-
通过对象的 getClass() 方法: 每个对象都有一个
getClass()
方法,可以返回表示对象所属类的Class
对象。例如:MyClass obj = new MyClass(); Class<?> clazz = obj.getClass();
-
通过类的 .class 属性: 每个类都有一个
.class
属性,可以直接获取表示该类的Class
对象。例如:Class<?> clazz = MyClass.class;
-
通过 Class 类的 forName() 方法:
Class
类提供了一个forName(String className)
方法,可以根据类的全限定名(包名加类名)来获取Class
对象。例如:Class<?> clazz = Class.forName("com.example.MyClass");
这三种方法都可以用来获取 Class
对象,然后通过 Class
对象可以获取类的属性、方法、构造函数等信息,实现反射的功能。
7)字符型常量和字符串常量的区别
- 字符型常量: 字符型常量是指用单引号括起来的单个字符,例如
'A'
、'B'
、'1'
等。 - 字符串常量: 字符串常量是指用双引号括起来的一个或多个字符组成的序列,例如
"Hello"
、"World"
、"123"
等。
区别在于字符型常量是单个字符,而字符串常量可以包含多个字符组成字符串。
8)什么是字符串常量池?
字符串常量池是 Java 中的一种特殊的存储区域,用于存储字符串常量对象。在 Java 中,如果两个字符串常量的值相同(即字符序列相同),则它们实际上指向字符串常量池中的同一个对象,而不是创建两个独立的对象。这样可以节省内存空间,并提高字符串的比较效率。
9)String 是最基本的数据类型吗
不是的。在 Java 中,String
是引用数据类型,而不是基本数据类型。基本数据类型包括 byte
、short
、int
、long
、float
、double
、char
和 boolean
,而 String
是由 char
类型组成的对象。
10)String有哪些特性
String
类具有以下特性:
- 不可变性(Immutable):
String
对象一旦被创建,其值就不能被修改。任何对String
对象的操作都会返回一个新的String
对象。 - 线程安全性: 由于不可变性,
String
对象是线程安全的,可以在多线程环境下安全地使用。 - 字符串常量池: Java 中的字符串常量池可以提高字符串的重用率和比较效率。
- 重载
+
运算符:String
类重载了+
运算符,可以用于字符串的连接操作。 - 实现了
Serializable
接口:String
类实现了Serializable
接口,可以被序列化和反序列化。 - 实现了
Comparable
接口:String
类实现了Comparable
接口,可以进行字符串的比较操作。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 700+ Star,1W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐