面试题

来源:互联网 发布:python rpc java 编辑:程序博客网 时间:2024/06/05 07:09

1、一个用户表中有一个积分字段,假如数据库中有 100 多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决?   

altertable drop column score; 

altertable add colunmscore int; 可能会很快,但是需要试验,试验不能拿真实的环境来操刀,并且要注意,这样的操作时无法回滚的,在我的印象中,只有inertupdatedelete等DML语句才能回滚,对于create table,droptable ,altertable等DDL语句是不能回滚。        

 解决方案一,update usersetscore=0; 解决方案二,假设上面的代码要执行好长时间,超出我们的容忍范围,那我就altertableuser drop columnscore;altertableuseradd column score int。

下面代码实现每年的那个凌晨时刻进行清零。    Runnable runnable =    newRunnable(){    publicvoidrun(){    clearDb();    schedule(this,newDate(newDate().getYear()+1,0,0));    }   };       schedule(runnable,    newDate(newDate().getYear()+1,0,1)); 

1. hibernate中离线查询去除重复项怎么加条件?
   dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
2. http协议及端口,smtp协议及端口 
   http:超文本传输协议 端口 80
   smtp:简单邮件传输协议 端口25


3.文件复制功能:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;


public class Test {
public void copyFile(String oldPath, String newPath) {
try {
int bytesum = 0;
int byteread = 0;


File oldFile = new File(oldPath);
if (oldFile.exists()) {
InputStream inStream = new FileInputStream(oldFile);// 读入原文件
FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[1444];
int length;
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread;// 字节数, 文件大小
fs.write(buffer, 0, byteread);
}
inStream.close();
}
} catch (Exception e) {
System.out.println("复制出错");
e.printStackTrace();
}
}
}


4. Servlet创建过程及生命周期Servlet 在容器中运行时,其实例的创建及销毁等是由容器进行控制。   Servlet 的创建有两种方法。 
    1. 客户端请求对应的 Servlet 时,创建 Servlet 实例;大部分Servlet 都是这种 Servlet 。  
    2. 通过在web.xml 中设置load-on-startup来创建servlet实例,这种实例在Web 应用启动时,立即创建Servlet 实例       Servlet 的运行都遵循如下生命周期: 
    1. 创建 Servlet 实例。     
    2. Web 容器调用 Servlet 的 init() 方法,对Servlet 进行初始化。
    3. Servlet 初始化后,将一直存在于容器中,用于响应客户端请求。根据客户端的请求方式通过Servlet中service()方法去相应的doXXX()方法;      
    4. Web 容器销毁Servlet 时,调用 Servlet 的 destroy() 方法,通常在关闭Web容器之时销毁 Servlet。
5.arraylist和vector的区别?
    1.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的 
    2.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 


6.ArrayList,Vector, LinkedList的存储性能和特性? 
    1. ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是 插入删除时非常麻烦  LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始  
    2. ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加 和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢. 
    3. Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些. 
    4. LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是 插入数据时只需要记录前后项即可,所以插入的速度快.


7.Cookie和Session的作用,区别和各自的应用范围:
     Session工作原理  Session用于保存每个用户的专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一的 会话ID(Session ID) . 它的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.当 Session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存还是一个不错的选择。
     Cookie 用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期.Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,因此不要用来保存数据集及其他大量数据.由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性。
     session工作原理  
     (1)当有Session启动时,服务器生成一个唯一值,称为Session ID(好像是通过取进程ID的方式取得的)。 
     (2)然后,服务器开辟一块内存,对应于该Session ID。 
     (3)服务器再将该Session ID写入浏览器的cookie。 
     (4)服务器内有一进程,监视所有Session的活动状况,如果有Session超时或是主动关闭,服务器就释放改内存块。
     (5)当浏览器连入IIS时并请求的ASP内用到Session时,IIS就读浏览器Cookie中的Session ID。
     (6)然后,服务检查该Session ID所对应的内存是否有效。 
     (7)如果有效,就读出内存中的值。 
     (8)如果无效,就建立新的Session。


8.简述spring 的事务传播行为和 隔离级别     
     spring 的事务传播行为: 
     Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:   
     PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。    
     PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。  
     PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。 
     PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。    
     PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。   
     PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。  
     PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 
     Spring 的隔离级别 
     1、Serializable:最严格的级别,事务串行执行,资源消耗最大;   
     2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
     3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。
     4、Read Uncommitted:保证了读取过程中不会读取到非法数据。 


9.写出删除表中重复记录的语句 oracle:
    delete from people   where peopleId in (select   peopleId from people group by   peopleId   having count(peopleId) > 1)  and rowid not in (select min(rowid) from   people group by  
10. java 类实现序列化的方法(二种)?如在collection框架中,要实现什么样的接口  
     java.io.Serializable接口   
     Collection框架中实现比较要实现Comparable 接口和 Comparator 接口 
11. 集合类有哪些?有哪些方法? 
    集合类 ArrayList  LinkedList  HashSet  HashMap 
    方法:add(),remove(),put(),addAll(),removeAll()
12. extends和implement的不同: 
    extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可 以实现多个接口,用逗号分开就行了  比如 class A extends B implements C,D,E
13. 开发中都用到了那些设计模式?用在什么场合? 
    每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。
   (1) MVC模式,在J2EE项目开发中主要用在表示层框架中,很好解决视图和流程控制。在项目中采用的Struts、WebWork等框架。     (2) DAO模式,在项目开发中主要用在数据层,封装数据的访问操作,为业务层提供数据服务。 
   (3) IoC模式,在项目开发中业务层有大量对象,他们之间存在依赖关系,可以使用IoC模式减少他们之间的代码耦合,提高系统的可扩展性。实际项目中使用的Spring框架来实现业务组件的装配。  
   (4) Observer模式,在Servlet的监听器中应用到了观察者模式。 
   (5) singleton单例模式和Factory工厂模式结合使用在项目中无需使用者了解过多的细节就可获取有关的对象实例。比如Hibernate项目中通过SessionFactory来获取Session。 
   (6) bridge模式,在项目中使用JDBC驱动访问数据库。
14.Hibernate中离线查询与在线查询的区别 
   Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样, Criteria 是在线的,所以它是由  Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需 Session,DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 实例的创建。
15.常用的包,类,接口,各举5个。
   类String Integer Long File Date
   包 java.lang.*;java.io.*;java.util.*;java.swt.*;java.math.*;
   接口: Comparable ,Connection,Map,List,Runable, 
16. new ArrayList(10)含义   
    在内存中连续分配了用来存在Object对象的数组;
17. 用什么方法使服务器关闭之后,session所保存的信息不会丢失?
   使用cookie 
18. servlet中的init方法什么时候被调用?  
   容器首次创建实例的时候
19. OSI七层模型tcp四层模型是什么样的 
    OSI七层参考模型 :物理层 、数据链路层 、网络层 、传输层、应用层、会话层、表示层 


20. 一学生表!有班及id,学号!成绩!一求平均成绩!二求比平均成绩高的学生的所有信息 
    select id,avg(成绩)  from table group by  id
    select * from table where 成绩 > (select 成绩 from (select id,avg(成绩) 成绩 from table group by  id)as a )   21.jdk的新特性 
“JDK1.5”的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。


22. ajax的工作原理?
    Ajax 基本上就是把 JavaScript 技术和 XMLHttpRequest 对象放在 Web 表单和服务器之间。当用户填写表单时,数据发送给一些 JavaScript 代码而不是 直接发送给服务器。相反,JavaScript 代码捕获表单数据并向服务器发送请求。同时用户屏幕上的表单也不会闪烁、消失或延迟。换句话说,JavaScript 代码在幕后发送请求,用户甚至不知道请求的发出。更好的是,请求是异步发送的,就是说 JavaScript 代码(和用户)不用等待服务器的响应。因此用户可以继续输入数据、滚动屏幕和使用应用程序。   然后,服务器将数据返回 JavaScript 代码(仍然在 Web 表单中),后者决定如何处理这些数据。它可以迅速更新表单数据,让人感觉应用程序是立即完成的,表单没有提交或刷新而用户得到了新数据。JavaScript 代码甚至可以对收到的数据执行某种计算,再发送另一个请求,完全不需要用户干预!这就是 XMLHttpRequest 的强大之处。它可以根据需要自行与服务器进行交互,用户甚至可以完全不知道幕后发生的一切。结果就是类似于桌面应用程序的动态、快速响应、高交互性的体验,但是背后又拥有互联网的全部强大力量。    


23. .Xml特点? 
     XML是一种可扩展标记语言 (XML) 是 Web 上的数据通用语言。它使开发人员能够将结构化数据,从许多不同的应用程序传递到桌面,进行本地计算和演示。XML 允许为特定应用程序创建唯一的数据格式。它还是在服务器之间传输结构化数据的理想格式。       XML主要具有以下几个特点: 
     ① 简洁有效  XML是一个精简的SGML,它将SGML的丰富功能与HTML的易用性结合到Web应用种,它保留了SGML的可扩展功能,这使得XML从根本上有区别于HTML。并且XML种还包括可扩展格式语言XSL(Extensible Style Language)和可扩展链接语言XLL(Extensible Linking Language)使得XML的显示和解析更加方便快捷。
     ② 易学易用  XML对SGML进行了精简,它抛弃了SGML中不常用的部分,方便用户编写Web页面同时也给设计人员实现XML浏览器降低了困难。
     ③ 开放的国际化标准  XML是W3C正式批准的,它完全可用于Web和工具的开发。XML具有标准的名域说明方法,支持文档对象模型标准、可扩展类型语言标准、可扩展链接语言标准和XML指针语言标准。使用XML可以在不同的计算机系统间交换信息,而且还可以跨越国界和超越不同文化疆界交换信息。 
     ④ 高效可扩充  XML支持复用文档片断,使用者可以发明和使用自己的标签,也可以与他人共享,可延伸性大。在XML中,可定义一组无限量的标准,可以有效地进行XML文件的扩充。   
24. oracle中除了数据库备份,还有什么方法备份?  Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP)、热备份和冷备份。导出备份是一种逻辑备份,冷备份和热备份是物理备份。 
 
25.SOCKET中有几中连接方式,区别? 
     Sockets有两种主要的操作方式:面向连接的和无连接的。
    无连接的操作使用数据报协议,无连接的操作是快速的和高效的,但是数据安全性不佳. 
    面向连接的操作使用TCP协议.面向连接的操作比无连接的操作效率更低,但是数据的安全性更高   
26. Socket如何获取本地ip地址?  
    public InetAddress getLocalAddress() 
27. JVM加载class文件原理? 
    所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的class对象的过程.        在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析      
    装载:查找和导入类或接口的二进制数据; 
    链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;                                                    校验:检查导入类或接口的二进制数据的正确性;     
    准备:给类的静态变量分配并初始化存储空间;      
    解析:将符号引用转成直接引用;      
    初始化:激活类的静态变量的初始化Java代码和静态Java代码块  
    JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类  
    一个Java应用程序使用两种类型的类装载器:根装载器(bootstrap)和用户定义的装载器(user-defined)。 根装载器以某种默认的方式将类装入,包括那些Java API的类。在运行期间一个Java程序能安装用户自己定义的类装载器。根装载器是虚拟机固有的一部分,而用户定义的类装载器则不是,它是用Java语言写的,被编译成class文件之后然后再被装入到虚拟机,并像其它的任何对象一样可以被实例化。
28. j2EE系统访问速度慢.从哪些方面可以优化
    J2EE性能的优化包括很多方面的,要达到一个性能优良的系统,除了关注代码之外,还应该根据系统实际的运行情况,从服务器软硬件环境、集群技术、系统构架设计、系统部署环境、数据结构、算法设计等方面综合考虑
29.浏览器页面与T0MCat的交互过程? 
   当一个JSP页面第一次被访问的时候,JSP引擎将执行以下步骤:  
  (1)将JSP页面翻译成一个Servlet,这个Servlet是一个java文件,同时也是一个完整的java程序 
  (2)JSP引擎调用java编译器对这个Servlet进行编译,得到可执行文件class  
  (3)JSP引擎调用java虚拟机来解释执行class文件,生成向客户端发送的应答,然后发送给客户端  以上三个步骤仅仅在JSP页面第一次被访问时才会执行,以后的访问速度会因为class文件已经生成而大大提高。当JSP引擎街道一个客户端的访问请求时,首先判断请求的JSP页面是否比对应的Servlet新,如果新,对应的JSP需要重新编译。
//测试:int max2 = a(new int[] { 2, 5, 18, 3, 38, 10, 2 },0); System.out.println(max2);
public class Test {
public static int a(int[] i, int j) {
if (i.length - 1 > j) {
if (i[j] > i[j + 1]) {
i[j + 1] = i[j];
}
return a(i, j + 1);
} else {
return i[i.length - 1];
}
}
}
30.创建一个序列号,从1000开始,每次增加1,最大到999999 
     create sequence newstudno increment by 1  start with 10001 maxvalue 99999 
31.写几个java.lang.Object类中的方法名称 :
    equals(); toString();   getClass();  hashCode();  clone()    finalize()   notify()    wait()   notify()