Java基础面试-JDBC详细连接过程,String ,StringBuffer,StringBuilder的区别?(面试三 20210608)

30.integer缓存问题?

案例解析:主要还是是否大于127,若是大于127的话,则会重新new 一个对象出来,这样比较出来的结果是flase,要是小于127的话,则不需要重写new一个对象,则两个对象的引用地址相同。

参考链接:https://blog.csdn.net/LiuChengYu520/article/details/79314659

31.String ,StringBuffer,StringBuilder的区别?

String内部使用final,无法更改值和开辟的地址,因此每次使用String类对象,都会new 一个新的对象出现,极大地浪费地址空间。而StringBuffer和StringBuilder可以被多次修改,并且不会产生新的未使用的对象。由于StringBuilder的速度远远大于StringBuffer,多数情况下面不建议使用StringBuilder类。然而在线程安全的情况下面就必须使用StringBuffer类。

参考链接:https://blog.csdn.net/u011702479/article/details/82262823

32.jdbc的详细连接过程?

首先我们知道先加载驱动,数据库不同,加载的驱动也就不同,使用class.forName来加载所需要的驱动,第二步我们需要创建一个Connection连接,使用方法getconnect()方法获取连接。第三步设置事务手动提交。第四步创建createStatement对象,调用executeQuery()执行相应的SQL语句,返回SQL执行结果。遍历结果集,这里使用了next()方法。

public class MyConntction {
    
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet res  =null;
        String sql =null;
        String url = null;
        String username = null;
        String password = null;
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //连接mysql的url 3306为mysql端口号 test 为数据库名称 后面的是设置字符集编码
            url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
            //用户名
            username = "root";
            //密码
            password="root";
            //与mysql建立连接
            conn=DriverManager.getConnection(url,username,password);
            sql = "select * from user";
            //设置事物提交为手动
            conn.setAutoCommit(false);
            stmt =conn.createStatement();
            //执行语句
            res=stmt.executeQuery(sql);
            //循环遍历结果集
            while(res.next()){
                System.out.println(res.getString("username"));
            }
            //事物提交
            conn.commit();
            
            
        } catch (Exception e) {
            try {
                //事物回滚
                conn.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            e.printStackTrace();
        }
        finally{
            if(stmt!=null){
                try {
                    //关闭资源
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn!=null){
                try {
                    //关闭资源 释放连接
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
 
}

33.Statement和Prestatement的区别,以及Callable Statement接口

Statement每次执行sql语句都需要数据库编译,最好是执行一次的查询语句,效率较高。Prestatement执行相应的sql语句都是预编译过的,执行多次sql语句的时候效率较高,由于是预编译的,安全性也好,可以有效的防止sql注入等问题。代码的可读性和维护性也很好。

CallableStatement接口扩展 PreparedStatement,它提供了对输出和输入/输出参数的支持。CallableStatement 接口还具有对 PreparedStatement 接口提供的输入参数的支持。

34.ResultSet结果集接口?

ResultSet结果集是数据查询结果返回的一个对象,可以说结果集是一个存储查询结果的对象,但是该结果集不仅仅具有存储功能,也有操作数据的功能,可能完成对数据的更新操作。

参考链接:https://blog.csdn.net/a3060858469/article/details/78096584

35.Optional类?

Optional 类主要解决的问题是空指针异常(NullPointerException)

参考链接:https://www.cnblogs.com/tianphone/p/11024696.html

36.String为什么设置成不可变的类?

因为不可变类可以提高String Pool的效率和安全性,对于多线程来说不可变类是线程安全的

我们可以看到该String的源码中String 的本质是一个Char[]数组,是对于字符串的封装,并且是final修饰的,创建之后不可以更改。

public final class String implements Serializable, Comparable<String>, CharSequence {
 /** The value is used for character storage. */
private final char[] value;
​
/** Cache the hash code for the string */
private int hash;// Default to 0

参考链接:https://www.cnblogs.com/wkfvawl/p/11693260.html

37.Map的put过程,可以为空吗?

可以为空,以我们最熟悉的HashMap为例,当我们同时使用多个值来put时都为空的时候,这个时候会给我们返回一个空指针异常。对于HashTable来讲就不行了

参考链接:https://www.cnblogs.com/jpfss/p/9957077.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值