记录一下上周六面试遇到的题以及被面试官问到的问题

一、xml解析方式

总共有四种方式,1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。

1.DOM解析。文档对象模型。DOM分析器会把整个xml文档转化成DOM树放在内存中,如果xml文档很大的话,对内存的需求就很高了,而且对于结构复杂的树的遍历也是非常消耗时间的,所以DOM解析对机器性能要求高,效率低。鉴于随机访问比较方便,所以DOM解析还是有它的优点的。


优点:

      1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。

      2、解析过程中,树结构保存在内存中,方便修改。

    缺点:

      1、由于文件是一次性读取,所以对内存的耗费比较大。

      2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。

2.SAX解析。xml简单应用程序接口。提供一个顺序模式,快速读写xml数据。SAX分析器对xml文档解析时,触发一系列时间,激活相应的事件处理函数,应用程序通过事件处理访问xml文档。

优点:

      1、采用事件驱动模式,对内存耗费比较小。

      2、适用于只处理XML文件中的数据时。

    缺点:

      1、编码比较麻烦。

      2、很难同时访问XML文件中的多处不同数据。

3.JDOM解析。

特征:

      1、仅使用具体类,而不使用接口。

      2、API大量使用了Collections类。

4.DOM4J解析。


  特征:

      1、JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。

      2、它使用接口和抽象基本类方法。

      3、具有性能优异、灵活性好、功能强大和极端易用的特点。

      4、是一个开放源码的文件。


Final:比较总结

  DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
      JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
      SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。



二、json对象创建及使用

JSONObject jsonObject = new JSONObject();

然后使用对象点,方法就出来了,想用什么方法,就看源码内容或者百度。 

三、jdbc连接数据库


package com.winter.springbootmybatisdemo.test;
import java.sql.*;
/**
 * Created by czb on 2018/4/2.
 */
public class Test {
    public static void main(String[] args){
        String url = "jdbc:mysql://localhost:3306/testdb";
        String user = "root";
        String password = "root";
        Connection con = null;
        Statement statement = null;
        ResultSet rs = null;
        try {
            //1.加载驱动,反射机制通过类的全路径名生成该类的对象,这一步会报找不到类异常
            Class.forName("com.mysql.jdbc.Driver");
            //2.连接数据库,会报数据库连接异常
            con = DriverManager.getConnection(url,user,password);
            //3.创建Statement的对象来执行SQL语句
            statement = con.createStatement();
            String sql = "select * from test";
            //执行查询,ResultSet对象存放查询的结果集
            rs = statement.executeQuery(sql);
            while (rs.next()){
                //做一些业务逻辑处理
                String id = rs.getString("id");
                String name = rs.getString("name");
                System.out.println(id+"---"+name);
            }
        } catch (ClassNotFoundException e) {
            //这地方可以用log打印日志
            System.out.print("加载驱动失败");
            e.printStackTrace();
        } catch (SQLException e){
            System.out.print("数据库连接失败");
            e.printStackTrace();
        } finally {//不管程序抛不抛异常,finally里面总会执行
            //先开的资源最后关闭
            if (rs != null) {   // 关闭记录集   
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {   // 关闭声明   
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (con != null) {  // 关闭连接对象   
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

四、数据库连接池有哪些

DBCP、C3P0、tomcat内置数据源(DBCP)



这里记录一下记不住的东西:

jdk提供的java.util工具类中,有关于数组排序,打印等方法。

int[] a = {15,2,12,1,2,5,...}

Arrays.sort(a);//将数组从小到大排序

Arrays.toString(a);//打印数组


五、类名.class

一个类在被加载的时候虚拟机就会自动的生成一个这个类的一个Class类型的“类对象”,每个类都对应着一个这样的类对象,通过这个Class类型的类对象,我们就能够使用“内省与反射”机制,访问一个类的信息,比如:对应类中的方法有哪些,成员域有哪些等等;获取一个类的“类对象”的方法之一就是通过使用   类名.class  这个方式返回一个Class类型的对象,其他的获取这个Class对象的方法如下:

1). 利用对象调用getClass()方法获取该对象的Class实例

2). 使用Class的静态方法forName(),用类的名字获取一个Class实例

3). 运用.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例。