Java高级部分[面试题][二]
上一篇文章[Java高级部分(面试题)]
文章目录
- 1.Statement中execute,executeUpdate,executeQuery这三者的区别
- 2.JDBC中怎么做批量处理的
- 3.json与XML的区别
- 4.XML和HTML的区别
- 5.XML文档定义有几种形式,他们之间有何本质区别
- 6.HashMap的底层实现
- 7.什么是Java内存泄漏,怎么预防
1.Statement中execute,executeUpdate,executeQuery这三者的区别
Statement接口提供了三种执行SQL语句的方法:executeQuery,executeUpdate,和execute.使用哪一个方法由SQL语句所产生的内容决定
方法executeQuery
- 用于产生单个结果集的语句,例如select语句,被使用最多的执行SQL语句的方法是executeQuery.这个方法被用来执行select语句,他几乎是使用最多的SQL语句
方法executeUpdate
- 用于执行insert,update或delete语句以及SQL DDL(数据定义语言)语句,例如create table 和 drop table ,insert ,update 或 delete 语句的效果是修改表中零行或多行中的一列或多列.executeUpdate的返回值是一个整数,指示受影响的行数(即更新计数).对于create table或 drop table等不操作行的语句,executeUpdate的返回值总为零
- 使用executeUpdate方法是因为在createTableCoffee中的SQL语句是DDL(数据定义语言)语句.创建表,改变表,删除表都是DDL语句的例子,要用executeUpdate方法来执行.你也可以从他的名字里看出,方法executeUpdate也被用于执行更新表SQL语句.实际上,相对于创建表来说,executeUpdate用于更新表的时间更多,因为表只需要创建一次,但经常被更新
方法execute
- 用于执行返回多个结果集,多个更新计数或二者组合的语句.因为多数程序员不会需要改高级功能
- execute方法应该仅在语句能返回多个ResultSet对象,多个更新计数或ReSultSet对象与更新计数的组合时使用.当执行某个已存储过程或动态执行未知SQL字符串(即应用程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见
- 因为方法execute处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪.例如,假定已知某个过程返回两个结果集,则在使用方法execute执行该过程后,必须调用方法
getResultSet
获得第一个结果集,然后调用适当的getxxx方法获取其中的值.要获得第二个结果集,需要先调用getMoreResults
方法,然后在调用getResultSet
方法,如果已知某个过程返回两个更新计数,则首先调用方法getUpdateCount
,然后调用getMoreResults
,并再次调用getUpdateCount- 对于不知道返回内容,则情况更为复杂.如果结果是ResultSet对象,则方法execute返回true;如果结果是Java int,则返回false.如果返回int,则意味着结果是更新计数或执行的语句是DDL命令.在调用方法execute之后要做的第一件事情是调用getResultSet或getUpdateCount.调用方法getResultSet可以获得两个或多个ResultSet对象中第一个对象;或调用方法getUPdateCount可以获得两个或多个更新计数中第一个更新计数的内容
- 当SQL语句的结果不是结果集时,则方法getResultSet将返回null.这可能意味着结果是一个更新计数或没有其它结果.在这种情况下,判断null真正的含义的唯一方法是调用方法getUpdateCount,它将返回一个整数.这个整数为调用语句所影响的行数;如果为-1则表示结果是结果集或没有结果.如果方法getResultSet已返回null(表示结果不是ResultSet对象),则返回值-1表示没有其它结果.也就是说,当下列条件为真时表示没有结果(或没有其它结果):
((stmt.getResultSet()==null))&&((stmt.getUpdateCount()==-1))
- 如果已经调用方法getResultSet并处理了它返回的ResultSet对象,则有必要调用方getMoreResults以确定是否有其它结果集或更新计数.如果getMoreResults返回true,则需要再次调用getResultSet来检索下一个结果集.如上所述,如果getResultSet返回null,则需要调用getUPdateCount来检查null是表示结果为更新计数还是表示没有其它结果
- 当getMoreResults返回false时,它表示该SQL语句返回一个更新计数或没有其它结果.因此需要调用方法getUPdateCount来检查它是哪一种情况.在这种情况下,当下列条件为真时表示没有其它结果:
(stmt.getMoreResults()==false)&&(stmt.getUPdateCount()==-1)
下面的代码演示了一种方法用来确认已访问调用的方法execute所产生的全部结果集和更新计数:
try {
con=DBUtil.getConnection();
ps=con.prepareStatement(sql);
ps.execute();
while (true){
int updateCount = ps.getUpdateCount();
if(updateCount>0){ //它是更新计数
System.out.println("changed"+updateCount);
ps.getMoreResults();
continue;
}
if(updateCount==0){ //DDL命令或0个更新
System.out.println("No Rows changed or statement was DDL command");
ps.getMoreResults();
continue;
}
//执行到这里,证明有一个结果集
//或没有其他结果
ResultSet resultSet = ps.getResultSet();
if(resultSet!=null){
while (resultSet.next()){
ps.getMoreResults();
continue;
}
break;
}
}
} catch (SQLException e) {
e.printStackTrace();
}
2.JDBC中怎么做批量处理的
1.使用Statement批量处理
public static void batchStatement(){
Statement sta=null;
try {
con=DBUtil.getConnection();
sta=con.createStatement();
for (int i = 0; i <= 1000; i++) {
String sql="insert into cuser(cusername,cnickname,cpassword,cSalt,cage,csex,ctel,cvisible) values('admin"+i+"','欧文',123232"+i+",'',23,'男',1113232"+i+",0)";
//把SQL语句加入批处理
sta.addBatch(sql);
}
//统一执行批处理的SQL语句
int[] rows=sta.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.close(con,null,rs);
try {
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.使用PreparedStatement批量处理
public static void batchPreparedStatement(){
PreparedStatement ps=null;
String sql="insert into cuser(cusername,cnickname,cpassword,cSalt,cage,csex,ctel,cvisible) values(?,?,?,'',?,?,?,0)";
try {
con=DBUtil.getConnection();
ps=con.prepareStatement(sql);
for (int i = 0; i <=10000; i++) {
ps.setString(1,"admin"+i);
ps.setString(2,"哈登"+i);
ps.setString(3,"23432"+i);
ps.setString(4,"23"+i);
ps.setString(5,"男");
ps.setString(6,"2342333"+i);
//加入批处理
ps.addBatch();
}
//统一执行批处理的SQL语句
int[] rows=ps.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.close(con,ps,rs);
}
}
3.json与XML的区别
1.可读性方面
- Json和XML的数据可读性基本相同,Json和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些
2.可扩展姓方面
- XML天生有很好的扩展性,Json当然也有,没有什么是XML能扩展,Json不能的
3.编码难度方面
- XML有丰富的编码工具,比如Dom4j,JDom等,Json也有Json.org提供的工具,但是Json的编码明显比XML容易许多,即使不借助工具也能写出Json的代码,可是要写好XML就不太容易
4.解码难度方面
- XML的解析得考虑子节点父节点,让人头晕眼花,而Json的解析难度几乎为0,这一点XML输的真是没话说
5.流行度方面
- XML已经被业界广泛的使用,而Json才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位Json.到时Ajax应该变成Ajaj(Asynchronous JavaScript and JSOn)
6.解析手段方面
- Json和XML同样拥有丰富的解析手段
7.数据体积方面
- Json相对于XML来说,数据的体积小,传递的速度更快些
8.数据交互方面
- Json于JavaScript的交互更加方便,更容易解析处理,更好的数据交互
9.数据描述方面
- Json对数据的描述性比XML较差
10.传输速度方面
- Json的速度要远远快于XML
4.XML和HTML的区别
1.设计上的区别:XML用来存储数据,重点在于数据本身,HTML用来定义数据,重点在于数据的限时模式
2.XML可扩展性强,因为它本身就是可扩展性标记语言,可创建个性化的标记语言,提供更多数据操作
3.XML语法比HTML严格
4.起始标签和结束标签要匹配
5.嵌套标签不能相互嵌套
6.区分大小写
7.XML属性必须放在引号中,HTML可有可无
8.XML必须有相应值,但HTML可以有不带属性的属性名
5.XML文档定义有几种形式,他们之间有何本质区别
1.两种形式
dtd schema
2.本质区别:schema
本身是XML的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的)
6.HashMap的底层实现
1.HashMap实际上是一个”链表散列”的数据结构,即数组和链表的结合体
2.HashMap底层就是一个数组结构,数组中的每一项又是一个链表.当新建一个HashMap的时候,就会初始化一个数组
3.HashMap在底层将key-value当成一个整体进行处理,这个整体就是一个Entry对象.
4.HashMap底层采用一个Entry[]数组来保存所有的key-value键值对,当需要存储一个Entry对象时,会根据hash算法决定其在数组中的位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中获取出该Entry
7.什么是Java内存泄漏,怎么预防
- 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄漏
- 长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被收回,这就是Java内存泄漏的发生场景.具体主要有如下几大类:
- 1.静态集合类引起内存泄漏
- 2.当集合里面的对象属性被修改后,再调用remove()方法时不起作用
- 3.各种连接未关闭,比如IO流
[扩展阅读][简言]
不安于现状,不甘于平庸,就可能在勇于进取的奋斗中奏响人生壮美的乐章。
还没有评论,来说两句吧...