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