java基础知识(二) 什么是java虚拟机?为什么java被称作是“平台无关的编译语言”? JDK和JRE的区别是什么? “static”关键字是什么意思?java中是否可以覆盖一个private或者是static的方法? 是否可以在static环境中访问非static变量? 同步方法和同步代码块的区别是什么? 在监视器内部,是如何做线程同步的?程序应该做那种级别的同步? 如何去报N个线程可以访问N个资源同时又不导致死锁? 为什么集合类没有实现Clonable和Serializable接口? 什么是迭代器(Iterator)? 快速失败和安全失败的区别是什么? Comparable和Comparator接口是干什么的?它们的区别? 什么是java优先级队列(Priority Queue)? Enumeration和Iterator接口的区别有哪些? System.gc()和Runtime.gc()会做什么事情? finalize()方法什么时候被调用?析构函数(finalization)的目的是

答:java虚拟机是一个可以执行java字节码的虚拟机进程。java源文件编译成能被java虚拟机执行的字节码文件。因为他知道底层硬件平台的指令长度和其他特性。

  • JDK和JRE的区别是什么?

答:java运行时环境(JRE)。它包含java虚拟机、java核心类库和支持文件。java开发工具包(JDK)是完整的java软件开发包,包含了JRE、编译器和其他工具。

  • “static”关键字是什么意思?java中是否可以覆盖一个private或者是static的方法?

答:“static”关键字表明一个成员变量或者成员方法可以在没有所属的类的实例变量的情况下被访问。java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的,static方法跟类的任何实例都不想关,所以不可以覆盖。java中不能覆盖private方法,因为private修饰的变量和方法只能被当前类中使用,如果是其他类继承当前类也是不能访问到被private所修饰的方法或者变量的。

  • 是否可以在static环境中访问非static变量?

答:static变量在java中是属于类的,它在所有的实例中的值是一样的。当类被java虚拟机载入的时候,会对static所修饰的变量进行初始化,如果代码尝试不用实例来访问非static的变量,编译器会报错,因为这个变量还没有被创建出来,还没有跟任何实例关联上。

  • 同步方法和同步代码块的区别是什么?

答:同步方法默认用this或者当前类class对象作为锁;同步代码块可以选择以什么作为锁,比同步方法要更细颗粒度,可以选择只同步会同步问题的部分代码而不是整个方法;关键字synchronized;

  • 在监视器内部,是如何做线程同步的?程序应该做那种级别的同步?

答:监视器和锁在java虚拟机中是同时使用的。监视器监视一块同步代码块,确保一次只有一个代码执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行代码块。

  • 如何去报N个线程可以访问N个资源同时又不导致死锁?

答:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都都以同样的顺序加锁和释放锁,就不会出现死锁的情况;

  • 为什么集合类没有实现Clonable和Serializable接口?

答:克隆(Clonable)或者序列化(Serializable)的语义和含义跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者序列化。

  • 什么是迭代器(Iterator)?

答:Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合都包含了返回一个迭代器实例的迭代方法。

  • 快速失败和安全失败的区别是什么?

答:Iterator的安全失败是基于对底层集合做拷贝。因此,它不受源集合上修改的影响。java.util包下面的所有集合类都是快速失败,java.util.concurrent包下面的所有类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。

  • Comparable和Comparator接口是干什么的?它们的区别?

答:Comparable和Comparator都是用来实现集合中元素的比较、排序的。只是Comparable是在集合内部定义的方法实现排序的。Comparator是在集合外部实现的排序。Comparable是一个对象本身就已经支持自比较所需要实现的接口。Comparator是一个专用比较器,当这个对象不能自比较或者自比较函数不能满足程序员的要求时,程序员可以自己写一个比较器来完成两个对象之间的比较。

  • 什么是java优先级队列(Priority Queue)?

答:优先级队列是一个基于优先级堆的*队列,它的元素是按照自然顺序排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。Priority Queue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,Priority Queue不是线程安全的,入队和出队的事件复杂度是O(log(n));

  • Enumeration和Iterator接口的区别有哪些?

答:Enumeration速度是Iterator的2倍,同时占用更少的内存。但是Iterator远远比Enumeration安全,因为其他线程不能够修改正在被Iterator遍历的集合里面的对象。同时,Iterator允许调用者删除低层级集合里面的元素,这对Enumeration来说是不可能的。

  • System.gc()和Runtime.gc()会做什么事情?

答:这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。

  • finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?

答:调用时机:当垃圾回收器要宣告一个对象死亡时,至少要经过两次标记过程,如果对象在进行可达性分析后发现没有和GC Roots相连接的引用链,就会被第一次标记,并且判断是否执行finalizer()方法,如果对象覆盖了finalizer()方法且未被虚拟机调用过,那么这个对象会被放置在F-Queue队列中,并在稍后由一个虚拟机自动建立的低优先级的Finalizer线程区执行触发finalizer()方法,但不承诺等待其运行结束。有一种JNI(Java Native Interface)调用non-java程序(C或C++),finalize()的工作其实回收这部分的内存。finalization目的:对象逃脱死亡的最后一次机会。(只要重新与引用链上的任何一个对象建立关联就可以复活)。但是不建议使用,运行代价高昂,不确定性大,且无法保证各个对象的调用顺序。可用try-finally。

  • 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

答:吞吐量收集器是使用并行版本的新生代垃圾回收器,它用于中等规模或者大型规模数据的应用程序。而串行收集器对大多数的小应用就已经足够了。

  • 异常处理完成以后,Exception对象会发生什么变化?

答:Exception对象会在下一个垃圾回收过程中被回收掉。

  • 什么是Applet?

答:java Applet是能够被包含在HTML页面中并且能被启用了java的客户端浏览器执行的程序。Applet主要用来创建动态交互的WEB应用程序。

  • applet类加载器是什么?它会做哪些工作?

答:当applet是从网络上加载的时候,它是有applet类加载器载入的。类加载器有自己的java名称空间等级结构。类加载器保证来自文件系统的类有唯一的名称空间,来自网络资源的类有唯一的名称空间。      当浏览器通过网络载入applet的时候,applet的类被放置于applet的源相关联的私有名称空间中。然后,那些被类加载加载进来的类都是通过了验证器验证的。验证器会检查类文件格式是否遵守java语言规范,确保不会出现堆或者栈溢出或者下溢,传递给字节码指令的参数是正确的。

  • applet安全管理器是什么?它会做哪些工作?

答:applet安全管理器是给applet施加限制条件的一种机制。浏览器可以只有一个安全管理器。安全管理器在启动的时候被创建,之后不能被替换覆盖或者是扩展。

  • 哪些Swing的方法是线程安全的?

答:只有3个线程安全的方法:repaint(),revalidate(),invalidate().

  • 三种支持重绘(painting)的组件?

答:Canvas,Frame,Panel,Applet支持重绘。

  • 事件监听器接口和事件适配器有什么关系?

答:事件监听器接口定义了对特定的事件,事件处理器必须要实现的方法。事件适配器给事件监听器接口提供了默认的实现。

  •  解释下驱动(Driver)在JDBC中的角色?

答:JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这些类的实现:Connection,Statement,PreparedStatement,CallableStatement,ResultSet,Drive。

  • 什么时候使用CallableStatement?用来准备CallabelStatement的方法是什么?

答:CallabelStatement用来执行存储过程。存储过程是由数据库存储和提供的。存储过程可以接受输入参数,也可以有返回结果。鼓励使用存储过程,因为它提供了安全化和模块化。准备一个CallableStatement的方法是:CallableStatement Connection.prepareCall()

  • 什么是RMI?

答:java远程方法调用(java RMI)是java 所特有的分布式计算技术,它允许运行在java虚拟机的对象调用运行在另一个java虚拟机上的对象的方法,从而使程序员可以方便的在网络环境中做分布式计算。面向对象设计要求每个任务由最适合该任务的对象执行,RMI将这个概念更深入了一步,使任务可以在最适合该任务的机器上完成。RMI定义了一组远程接口,用来生成远程对象,客户机可以象调用本地对象一样用相同的语法调用远程对象。RMI的开发步骤:1、定义一个远程接口(远程接口必须继承接口,每个方法必须排除远程异常,方法参数和方法返回值都必须是可序列化的)。2、实现远程接口。3、定义使用远程对象的客户程序。4、产生远程访问对象的桩和框。5、注册远程对象。6、运行服务器和客户程序。

  • RMI体系结构的基本原则是什么?

答:RMI体系结构是基于一个非常重要的行为定义和行为实现相分离的原则。RMI运行定义行为的代码和实现行为的代码相分离,并且运行在不同的JVM上。

  • RMI体系结构分那几层?

答:1、存根和骨架层:这一层对程序时透明的,它主要负责拦截客户端发出的方法调用请求,然后把请求重定向给远程的RMI服务。2、远程引用层:RMI体系结构的第二层来解析客户端对服务端远程对象的引用。链接是点对点的。3、传输层:这一层负责连接参与服务的两个JVM。这一层是建立在网络上机器间的TCP/IP连接之上的。它提供了基本的连接服务,还有一些防火墙穿透策略。

  • RMI中的远程接口扮演了什么样的角色?

答:远程接口用来标识哪些方法是可以被非本地虚拟机调用的接口。远程对象必须要直接或者间接来实现远程接口。实现了远程接口的类应该声明被实现的远程接口,给每一个远程对象定义构造函数,给所有远程接口的方法提供实习。

  • java.rmi.Naming类扮演了什么样的角色?

答:java.rmi.Naming类用来存储和获取在远程对象注册表里面的远程对象的引用。Naming类的每一个方法接受一个URL格式的String对象作为它的参数。

  • RMI的绑定(Binding)是什么意思?

答:绑定是为了查询找远程对象给远程对象关联或者是注册以后会用到的名称的过程。远程对象可以使用Naming类的bind()或者rebind()方法跟名称相关联。

  • 什么是分布式垃圾回收(DGC)?它是如何工作的?

答:DGC叫做分布式垃圾回收。RMI使用DGC来做自动垃圾回收。因为RMI包含了跨虚拟机的远程对象的引用,垃圾回收是很困难的。DGC使用引用计数算法来给远程对象对象提供自动内存管理。

  • 解释下Serialization和Deserialization?

答:java提供了一种叫做对象序列化的机制,他把对象表示成一连串的字节,里面包含了对象的数据,对象的类型信息,对象内部的数据的类型信息等等。因此,序列化可以看成是为了把对象存储在磁盘上或者从磁盘上读出来并重建对象而把对象扁平化的一种方式。反序列化是把对象从扁平状态转化成活动对象的相反的步骤。

  • 什么是Servlet?

答:Servlet是用来处理客户端请求并产生动态网页内容的java类。Servlet主要是用来处理或者存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。

  • 说一下Servlet的体系结构?

答:所有的Servlet都必须要实现的接口是javax.servlet.Servlet.每一个Servlet都必须要直接或者间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.serlvet.http.HTTPServlet。最后Servlet使用多线程可以并发的为多个请求服务。

  • Applet和Servlet有什么区别?

答:Applet是运行在客户端主机的浏览器上的客户端java程序。而Servlet是运行在web服务器上的服务器的组件。applet可以使用用户界面类,而Servlet没有用户界面,相反,Servlet是等待客户端的HTTP请求,然后为请求产生响应。

  • GenericServlet和HttpServlet有什么区别?

答:GenericServlet类实现了Servlet和ServletConfig接口。实现了除了service()之外的其他方法,在创建Servlet对象时,可以继承GenericServlet类来简化程序的代码,但需要实现service()方法。HttpServlet类继承了GeneriServlet类,为实际开发中大多数用Servlet处理HTTP请求的应用灵活的方法。

  • doGet()方法和doPost()方法有什么区别?

答:doGet:GET方法会把名值对追加到请求的URL后面。因为URL对字符数目有限制,进而限制了用在客户端请求的参数值的数目。并且请求中的参数值是可见的,因此,敏感信息不能用这种方法传递。doPost:POST方法通常把请求参数值放在请求体中来克服GET方法的限制,因此,可以发送的参数的数目是没有限制的。最后,通过POST请求传递的敏感信息对外部客户端是不可见的。

  • HTTP响应的结构是怎样的?

答:HTTP响应由三部分组成:状态码(Status Code):描述了响应的状态。可以用来检查是否成功的完成了请求。请求失败的情况下,状态码可用来找出失败的原因。如果Servlet没有返回状态码,默认返回成功的状态码HttpServletResponse.SC_OK。Http头部(HTTP Header):它们包含了更多关于响应的信息。比如:头部可以指定认为响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式。如何在Servlet中检索HTTP的头部看这里。主体(Body):它包含了响应的内容。它可以包含HTML代码,图片,等等。主体是由传输在HTTP响应中紧跟在头部后面的数据字节组成的。

  • 什么是cookie?session和cookie有什么区别?

答:cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。session和cookie区别:无论客户端浏览器做怎么样的设置,session都应该正常工作。客户端可以选择禁用cookie,但是,session仍然是能够工作的,因为客户端无法禁用服务端的session。

  • 什么是HTTP隧道?

答:HTTP隧道是一种利用HTTP或者是HTTPS把多种网络协议封装起来进行通信的技术。因此,HTTP协议扮演了一个打通用于通信的网络协议的管道的包装器的角色。把其他协议的请求掩盖成HTTP的请求就是HTTP隧道。

  • 什么是URL编码和URL解码?

答:URL编码是负责把URL里面的空格和其他的特殊字符替换成对应的十六进制表示,反之就是解码。

  • JSP请求时如何被处理的?

答:浏览器首先要请求一个以.jsp扩展名结尾的页面,发起JSP请求,然后,Web服务器读取这个请求,使用JSP编译器把JSP页面转换成一个Servlet类。需要注意的是,只有当第一次请求页面或者是JSP文件发生改变的时候JSP文件才会被编译,然后服务器调用Servlet类,处理浏览器请求。一旦请求执行结束,serlvet会把响应发送给客户端。

  • JSP有什么优点?

答:JSP页面是被动态编译成servlet的,因此,开发者可以很容易的更新展现代码;JSP页面可以被预编译;JSP页面可以很容易的和静态模板结合;

  • 什么是JSP指令(Dirctive)?JSP中有哪些不同类型的指令?

答:Directive是当JSP页面被编译成Servelt的时候,JSP引擎要处理的指令。Directive用来设置页面级别的指令,从外部文件插入数据,指定自定义的标签库。不同的类型有:包含指令(Include Directive):用来包含文件和合并文件内容到当前的页面。页面指令(Page Directive)用来定义JSP页面中特定的属性,比如错误页面和缓冲区。Taglib指令:用来声明页面中使用的自定义的标签库。

  • JSP中的隐含对象有哪些?

答:application,page,request,response,out,session,exception,config,pageContext