就只说 3 个 Java 面试题 —— 03

97 阅读4分钟

7、想象这样一个场景:计算机上有两个驱动器,每个驱动器都有多个嵌套文件夹,其中一些文件夹包含一些文件。你能写一个 Java 程序来找出这个文件是否存在吗?如何最大限度地减少任何文件的搜索时间?

我们可以利用多线程的概念来搜索文件。这是实现相同功能的java代码:

import java.io.File;  
class FileSearchThread extends Thread {  
  
    private final String fileName;  
    private final File directory;  
   
    public FileSearchThread(String fileName, File directory) {  
        this.fileName = fileName;  
        this.directory = directory;  
    }  

    @Override  
    public void run() {  
        boolean result = searchFile(fileName, directory);  
        if(result) {  
            System.out.println(“File Found. Location — “ + directory.toString());  
        }  
    }  
    
    private boolean searchFile(String fileName, File directory) {  
       
        File[] files = directory.listFiles();  
        if (files != null) {  
            for (File file : files) {  
                if (file.isDirectory()) {  
                    searchFile(fileName, file);  
                } else if (file.getName().equalsIgnoreCase(fileName)) {  
                    System.out.println(“File found at: “ + file.getAbsolutePath());  
                    return true;  
                }  
            }  
        }  
        return false;  
    }      
}  


public class FileSearch {  
    public static void main(String[] args) {  
        String fileNameToSearch = “xyz.txt”;  
       
        for (char drive = ‘C’; drive <= ‘D’; drive++) {  
            String rootPath = drive + “:\\”;  
            File[] directories = new File(rootPath).listFiles(File::isDirectory);  
            if (directories != null) {  
                for (File directory : directories) {  
                new FileSearchThread(fileNameToSearch, directory).start();  
                }  
            }  
        }  
    }  
}

在此程序中,我们首先定义一个“FileSearchThread”类,该类扩展 Thread 并在其构造函数中采用文件名和目录参数。在run方法中,我们调用searchFile方法来递归搜索给定目录及其嵌套目录中的文件。如果找到该文件,我们将打印其绝对路径并从该方法返回。

在“FileSearch”类中,我们通过迭代驱动器 C 和 D 的目录,为每个驱动器和文件夹创建一个单独的线程。我们将 fileNameToSearch 和当前目录传递给 FileSearchThread 构造函数并启动线程。

通过为每个驱动器和文件夹创建单独的线程,我们可以并行搜索文件并最大限度地减少搜索时间。

8、您能解释一下“Type 1”和“Type 4”JDBC 驱动程序之间的区别吗?哪一个是首选?

JDBC(Java 数据库连接)驱动程序用于将 Java 应用程序连接到数据库。 JDBC 驱动程序有多种类型,但最常用的两种类型是类型 1 和类型 4 驱动程序。这是两者之间的区别:

Type 1 驱动程序:

它也称为 JDBC-ODBC 桥驱动程序,Type 1 驱动程序是 JDBC API 和 ODBC(开放数据库连接)API 之间的桥梁。 Type 1 驱动程序使用 ODBC 驱动程序连接到数据库,并要求在客户端计算机上安装 ODBC 驱动程序。

Type 1 驱动程序易于使用,可与任何具有可用 ODBC 驱动程序的数据库一起使用。然而,它存在性能问题,因为它在 Java 应用程序和数据库之间添加了额外的通信层。

Type 4 驱动程序:

它也称为纯 Java 驱动程序,Type 4 驱动程序是完全基于 Java 的驱动程序,使用本机协议直接与数据库通信。 Type 4 驱动程序不需要任何外部库或驱动程序,是 Java 应用程序中最常用的驱动程序类型。

Type 4 驱动程序比 Type 1 驱动程序提供更好的性能,因为它没有在 Java 应用程序和数据库之间添加任何额外的通信层。它还提供更好的安全性和平台独立性,因为它不依赖于任何外部库。

对于 Java 应用程序来说,Type 4 驱动程序比 Type 1 驱动程序更受青睐,因为它提供了更好的性能、安全性和平台独立性。

9、JDBC中如何实现乐观锁?

乐观锁定是一种用于防止多用户环境中数据冲突的技术。在 JDBC 中,乐观锁可以通过以下步骤实现:

  • 当用户开始编辑记录时,从数据库中检索记录的当前版本号并将其存储在变量中。
  • 当用户完成编辑记录时,使用新值更新数据库中的记录并增加版本号。
  • 如果更新成功,则提交事务。如果没有,则回滚事务。
  • 在更新数据库中的记录之前,将当前版本号与存储在变量中的版本号进行比较。如果两个值匹配,则更新记录。如果没有,则意味着自第一个用户检索该记录以来,另一个用户已更新该记录。在这种情况下,您可以中止事务并提示用户检索记录的最新版本,或者合并两个用户所做的更改。

下面是一个示例代码片段,它使用“PreparedStatement”在 JDBC 中实现乐观锁定:

try {  
    PreparedStatement selectStmt = conn.prepareStatement(“SELECT version FROM table WHERE id = ?”);  
    selectStmt.setInt(1, id);  
    ResultSet rs = selectStmt.executeQuery();  
    int currentVersion = 0;  
    if (rs.next()) {  
        currentVersion = rs.getInt(1);  
    } 
    PreparedStatement updateStmt = conn.prepareStatement(“UPDATE table SET column1 = ?, column2 = ?, version = ? WHERE id = ? AND version = ?”);  
    updateStmt.setString(1, newValue1);  
    updateStmt.setString(2, newValue2);  
    updateStmt.setInt(3, currentVersion + 1);  
    updateStmt.setInt(4, id);  
    updateStmt.setInt(5, currentVersion);  
    int rowsUpdated = updateStmt.executeUpdate();  
    
    if (rowsUpdated == 1) {  
        conn.commit();  
    } else {  
        conn.rollback();  
    }  
} catch (SQLException e) {  
    conn.rollback();  
    e.printStackTrace();  
}

在此示例中,我们首先使用 SELECT 语句检索记录的当前版本号。然后,我们使用PreparedStatement更新记录,该语句在WHERE子句中包含当前版本号,以确保我们仅在记录未被其他用户修改时才更新记录。最后,我们检查 UPDATE 语句更新的行数并相应地提交或回滚事务。