Java中常见问题总结(二)

一、Java iterator(迭代器)的使用

    iterator是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构,Java中iterator功能比较简单,并且只能单向移动:

    1、iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。

    2、使用next()获得序列中的下一个元素。

    3、使用hasNext()检查序列中是否还有元素。

    4、使用remove()将迭代器新返回的元素删除。

list l = new ArrayList();
 l.add("aa");
 l.add("bb");
 l.add("cc");
 for (Iterator iter = l.iterator(); iter.hasNext();) {
  String str = (String)iter.next();
  System.out.println(str);
 }
 /*迭代器用于while循环
 Iterator iter = l.iterator();
 while(iter.hasNext()){
  String str = (String) iter.next();
  System.out.println(str);
 }
 */

二、如何将数字转换为字符?

int i = 100
String str = "";
str = String.valueOf(i);//使用String的valueOf()方法
str = i + "";//直接加上一个空字符串自动转换成字符串

三、final的详解

   final类不能被继承,没有子类,final类中的方法默认是final的. 
   final方法不能被子类的方法覆盖,但可以被继承. 
   final成员变量表示常量,只能被赋值一次,赋值后值不再改变. 
   final不能用于修饰构造方法. 
   注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的. 
1、final类 
 final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类. 
2、final方法 
  如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法. 
使用final方法的原因有二: 
第一、把方法锁定,防止任何继承类修改它的意义和实现. 
第二、高效.编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率. 
3、final变量(常量) 
 用final修饰的成员变量表示常量,值一旦给定就无法改变! 
 final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量.

4、final参数 
当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值. 

四、存储过程在软件开发中有什么样的优势和劣势,有什么样的缺点. 
    存储过程的优点: 
    (1)允许模块化程序设计,以后可以重复调用;可以由专人来完成,并可独立于程序源代码而单独修改.这样一个项目在需求分析、界面设计以及数据库设计完了以后,就可以开始写存储过程了,同一时间数据访问层也可以开始写了.没有必要等详细设计说明完成了在编码的时候才开始写SQL语句. 
   (2)执行更快 ,存储过程都是预编译命令,执行起来比SQL语句更快. 
   (3)减少网络流量 
   (4)可作为安全机制,能够屏蔽数据库,用户并不知道数据库的真实结构. 
   存储过程的缺点: 
   最大的缺点就是更换数据库的时候,比如SQLServer数据库换成Oracle数据库时SQLServer数据库的存储过程在Oracle当中完全不能用,只能重新用Oracle的命令来写存储过程. 

五、在存储过程中如果前面的语句发生错误,后面的语句会不会执行,为什么? 
    存储过程是要进行预编译的,它先会检查语法、再检查语义,如果出现错误了,就会提示你,有错,让你进行改正. 
    当语法和语义都正确时,存储过程开始执行,但是在执行过程中可能出现一些错误,比如数据溢出啊,截断字符串啊,该存储过程会继续执行,并执行结束.正确的语句会被执行,而错误的语句是不会执行的,并不会回滚的,如果要回滚的话,要自己添加数据回滚的代码才行. 

六、如果两个不同的存储过程在一个方中被同是调用,当其中任一个发生异常时,要求同时回滚两个存储过程的操作,怎么样处理? 
   可以创建另个一个存储过程,在这个存储中,创建一个自组事务,在这个自组事务中分别去调用那两个存储过程.语法如下: 
    create procedure CallTwoProc 
    as 
    begin transaction 
          execute 第一个存储过程 
            execute 第二个存储过程 
    commit transaction 

七、请谈一谈视图的优点(创建视图的必要性).基于视图的增删改会带来什么样的问题,如何解决样的的问题? 
   视图的优点: 
  (1)、可以筛选表中的行. 
  (2)、可以将多个物理数据表抽象为一个逻辑表,有利于跨库操作. 
  (3)、防止未经许可的用户访问敏感数据. 
  (4)、降低数据库的复杂程度. 
  (5)、视图是一种抽象表,它不占用存储空间. 
  基于视图的增删改会带来两个的问题: 
  (1)、INSERT、UPDATE和DELETE语句都必须要满足视图的条件,即视图要能看得到的才能INSERT、UPDATE和DELETE.通过视图的删除数据,要慎用,如果视图看不到的,无法删除. 
解决办法:给视图加上with check option约束之后,基于视图的更改,凡是不符合视图约束(where……)的修改、插入、删除时会报错,用以限制对视图的修改. 
 (2)、当一个视图是基于多个基表建立的,在视图上修改数据时,只能INSERT或UPDATE基于一个基表的字段的值,无法同时修改两个或以上的基表的字段.DELETE不能运行,因为DELETE语句仅在视图的FROM子句中包含一个表时才可以引用更新视图. 
  解决办法:建立INSTEAD OF触发器,把对视图的INSERT、UPDATE、DELETE操作转换为分别对几个基表的INSERT、UPDATE、DELETE操作,分作几步进行.这样对视图的INSERT、UPDATE、DELETE操作就有效了. 

八、触发器会产生递归调用吗,请举例说明,像这种情况,我们应该怎么样避免呢? 
触发器会产生递归调用.有两种情况 
第一种:直接递归 即触发器被激发并执行一个操作,而该操作又使同一个触发器被激发. 
第二种:间接递归 即触发器被激发并执行一个操作,而该操作又使另一个触发器被激发.第二个触发器又使得第一个触发器的原始表得到更新,从而再一次引发第一个触发器. 
  避免的办法有: 
  (1)、在编写触发器里,人为的注意到这一点. 
  (2)、防止直接递归:alter database pubs set RECURSIVE_TRIGGERS OFF 


九、作用域public,protected、private以及不写时的区别

作用域比较
作用域当前类同一包子孙类其他包
public微笑微笑微笑微笑
protect微笑微笑微笑大哭
friendly微笑微笑大哭大哭
private微笑哭大哭大哭
不写·时候默认为friendly


十、 什么是JSP?JSP与Servlet的关系? 

    在一个JSP文件第一次被请求时,JSP引擎把该JSP文件转换成为一个servlet.而这个引擎本身也是一个servlet,在JSWDK或WEBLOGIC中,它就是JspServlet.JSP引擎先把该JSP文件转换成一个Java源文件,在转换时如果发现jsp文件有任何语法错误,转换过程将中断,并向服务端和客户端输出出错信息;如果转换成功,JSP引擎用javac把该Java源文件编译成相应的class文件.然后创建一个该SERVLET的实例,该SERVLET的jspInit()方法被执行,jspInit()方法在servlet的生命周期中只被执行一次.然后jspService()方法被调用来处理客户端的请求.对每一个请求,JSP引擎创建一个新的线程来处理该请求.如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程.每个客户端请求对应一个线程.以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间.但应该注意多线程的编程限制,由于该servlet始终驻于内存,所以响应是非常快的.如果.jsp文件被修改了,服务器将根据设置决定是否对该文件重新编译,如果需要重新编译,则将编译结果取代内存中的servlet,并继续上述处理过程.虽然JSP效率很高,但在第一次调用时由于需要转换和编译而有一些轻微的延迟.此外,如果在任何时候如果由于系统资源不足的原因,JSP引擎将以某种不确定的方式将servlet从内存中移去.当这种情况发生时jspDestroy()方法首先被调用, 然后servlet实例便被标记加入"垃圾收集"处理.jspInit()及jspDestory()格式如下:可在jspInit()中进行一些初始化工作,如建立与数据库的连接,或建立网络连接,从配置文件中取一些参数等,在jspDestory()中释放相应的资源 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值