1. Java 中有哪些不同类型的线程优先级?JVM 分配的线程默认优先级是多少?
线程优先级是这样的概念:每个线程都有一个优先级,用外行人的语言来说,可以说每个对象都有优先级,用 1 到 10 之间的数字表示。Java 中有不同类型的线程属性:
- 最低优先级
- 最大优先级
- 正常优先级
默认情况下,该线程被分配有NORM_PRIORITY。
2. 为什么 Java 中需要垃圾收集?
对于 Java,垃圾收集是必要的,以避免内存泄漏,内存泄漏会导致程序崩溃和变得不稳定。Java 中没有办法避免垃圾收集。与 C++ 不同,Java 中的垃圾收集可帮助程序员专注于应用程序的开发,而不是管理内存资源和担心内存泄漏。Java 虚拟机 (JVM) 通过运行垃圾收集器定期自动管理内存,从而释放应用程序中未使用的内存。垃圾收集使 Java 内存更加高效,因为它会从堆内存中删除未引用的对象。
3.垃圾收集的缺点是什么?
除了许多优点之外,垃圾收集器还具有以下某些缺点:
- 垃圾收集的主要缺点是它会导致应用程序执行暂停,因为它会清除内存,从而降低应用程序的性能。
- 垃圾收集过程是不确定的,因此很难预测垃圾收集何时发生,从而导致应用程序出现不可预测的行为。例如,如果我们编写任何程序,那么程序员很难确定问题是由垃圾收集引起的还是由程序中的任何其他因素引起的。
- 如果程序创建并丢弃大量短暂生存的对象,垃圾收集也会增加内存使用量。
4. 解释次要垃圾收集、主要垃圾收集和完整垃圾收集之间的区别。
Java 虚拟机 (JVM) 使用垃圾收集器删除不再使用的对象,垃圾收集器会定期检查并删除这些对象。JVM 中有不同类型的垃圾收集,每种垃圾收集都有不同的特点和性能影响。主要的垃圾收集类型包括:
- 小型垃圾收集:也称为年轻代垃圾收集,这种类型的垃圾收集用于收集和回收由短暂生存的对象(快速创建和丢弃的对象)使用的内存。
- 主垃圾收集:也称为老生代垃圾收集,这种类型的垃圾收集用于收集和回收长寿命对象(在多次小垃圾收集中幸存下来并被提升到老生代的对象)使用的内存。
- 全面垃圾回收:在全面垃圾回收期间,所有代的内存都会被收集和回收,包括年轻代和年老代的内存。全面垃圾回收通常比小型垃圾回收或大型垃圾回收需要更长的时间才能完成,后者会导致应用暂时暂停。
5. 如何识别 Java 中的主要垃圾收集和次要垃圾收集?
主垃圾收集在幸存者空间上工作,次要垃圾收集在伊甸园空间上工作,以执行标记和清除例程。我们可以根据输出来识别它们,其中次要收集打印“GC”,而主收集打印“Full GC”,这是在使用“-XX:PrintGCDetails”或“verbose:gc”启用垃圾收集日志记录的情况下。
6. 什么是内存泄漏,它如何影响垃圾收集?
在 Java 中,内存泄漏可能由多种因素引起,例如未正确关闭资源、持有对象引用的时间超过必要时间或不必要地创建过多对象。在某些情况下,垃圾收集器不会收集对象,因为存在对这些对象的引用。在这些情况下,应用程序创建了大量对象但并未使用它们,并且每个对象都有一些有效引用,Java 中的垃圾收集器无法销毁这些对象。这些对程序没有任何价值的无用对象称为内存泄漏。内存泄漏会阻止垃圾收集器回收未使用的内存,从而对垃圾收集产生负面影响。此行为会导致性能下降或有时导致系统故障。在程序中,通过正确管理资源和对象引用来避免内存泄漏非常重要。
例子:
// Java Program to demonstrate memory leaks
import java.io.*;
import java.util.Vector;
class GFG {
public static void main(String[] args)
{
Vector a = new Vector(21312312);
Vector b = new Vector(2147412344);
Vector c = new Vector(219944);
System.out.println("Memory Leak in Java");
}
}
输出:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.base/java.util.Vector.<init>(Vector.java:142) at java.base/java.util.Vector.<init>(Vector.java:155) at GFG.main(GFG.java:9)
7. 说出 java.util.regex 包中的一些类。
Java 中的正则表达式或 Regex 是用于在 Java 中搜索和操作字符串的 API。它创建字符串模式,可以从字符串中提取所需的数据或概括出一个模式。
java.util.regex 中有下面提到的 3 个类:
- 图案类:可以定义图案
- Matcher 类:可以使用模式对文本执行匹配操作
- PatternSyntaxException 类:可以指示正则表达式模式中的语法错误。
此外,除了这 3 个类之外,包还包含一个单一接口 MatchResult 接口,可用于表示匹配操作的结果。
8. 编写一个正则表达式来验证密码。密码必须以字母开头,后跟字母数字字符;其长度必须在 8 到 20 之间。
regex = “^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&-+=()])(?=\\S+$).{8, 20}$”
解释:
- ^ 用于字符串的起始字符。
- 用于数字的 (?=.*[0-9]) 必须至少出现一次。
- 用于小写字母的 (?=.*[az]) 必须至少出现一次。
- (?=.*[AZ]) 表示大写字母,其在子字符串中必须至少出现一次。
- (?=.*[@#$%^&-+=()] 表示必须至少出现一次的特殊字符。
- (?=\\S+$) 整个字符串中不允许出现空格。
- .{8, 20} 至少使用 8 个字符,最多使用 20 个字符。
- $ 用于字符串的结尾。
9.什么是JDBC?
JDBC标准 API 用于链接 Java 应用程序和关系数据库。它提供了一组类和接口,让程序员可以使用 Java 编程语言与数据库进行通信。JDBC 的类和接口允许应用程序将用户发出的请求发送到指定的数据库。JDBC 通常有四个组件用于与数据库交互:
- JDBC 接口
- JDBC 驱动管理器
- JDBC 测试套件
- JDBC-ODBC 桥驱动程序
10.什么是JDBC驱动程序?
JDBC 驱动程序是一个软件组件,用于使 Java 应用程序能够与数据库交互。JDBC 为特定的数据库管理系统提供了 JDBC API 的实现,使其能够连接数据库、执行 SQL 语句并检索数据。JDBC 驱动程序有四种类型:
- JDBC-ODBC 桥驱动程序
- 本机API驱动程序
- 网络协议驱动程序
- 薄型驱动器
11.Java中连接数据库的步骤有哪些?
连接数据库和 Java 程序的具体步骤如下:
- 导入驱动包
- 使用 forName() 方法加载驱动程序
- 使用 DriverManager 注册驱动程序
- 使用 Connection 类对象建立连接
- 创建一个statement
- 执行查询
- 关闭连接
12. JDBC API 组件有哪些?
JDBC API 组件提供了各种方法和接口,以便于与数据库进行轻松通信,同时还提供了 java Se 和 java EE 等软件包,提供了一次编写即可在任何地方运行 (WORA) 的功能。
句法:
java.sql.*;
13.什么是 JDBC Connection 接口?
Java 数据库连接接口 (JDBC) 是一个允许 Java 应用程序与数据库交互的软件组件。为了增强连接,JDBC 需要每个数据库的驱动程序。
14.JDBC ResultSet 接口是什么?
JDBC ResultSet 接口用于存储数据库中的数据并在 Java 程序中使用它。我们还可以使用 ResultSet 通过 updateXXX() 方法更新数据。ResultSet 对象将光标指向结果数据的第一行之前。使用 next() 方法,我们可以遍历 ResultSet。
15. 什么是 JDBC 行集?
JDBC RowSet 提供了一种以表格形式存储数据的方法。RowSet 是 Java 中的一个接口,可以在 java.sql 包中使用。RowSet 对象与数据源之间的连接在其整个生命周期内都得到维护。RowSet 根据以下实现分为五类:
- JdbcRowSet
- CachedRowSet
- WebRowSet
- FilteredRowSet
- JoinRowSet
16.JDBC DriverManager类的作用是什么?
JDBC DriverManager 类充当用户和驱动程序的接口。它有多种用途,如下所述:
- 它用于创建 Java 应用程序和数据库之间的连接。
- 帮助跟踪可用的驱动程序。
- 它有助于建立数据库和适当的驱动程序之间的连接。
- 它包含所有可以注册和注销数据库驱动程序类的方法。
- DriverManager.registerDriver()方法可以维护已经注册自身的Driver类列表。