1. finally什么时候执行?html
1.try和catch语句
●将要处理的代码放入try块中,而后建立相应的catch块的列表。若是生成都异常与catch中提到的相匹配,那么catch条件中的块语句就被执行。try块后可能有许多catch块,每一个都处理不一样的异常。每一个catch中的参数都是Exception的子类。
2.finally语句
●finally语句定义一个老是执行的代码,而不考虑异常是否被捕获。
3.throw引发一个异常 java
2. java中有两种传递方式。值传递和引用传递, 基本类型和以String str="aa"这种方式建立的字符串都是值传递,对象,数组等是引用传递。c++
3. java中子类的初始化程序员
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为链接(Linking)。如图所示。
加载、验证、准备、初始化和卸载这5个阶段的顺序是肯定的,类的加载过程必须按照这种顺序循序渐进地开始,而解析阶段则不必定:它在某些状况下能够在初始化阶段以后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。如下陈述的内容都已HotSpot为基准。web
在加载阶段(能够参考java.lang.ClassLoader的loadClass()方法),虚拟机须要完成如下3件事情:数据库
加载阶段和链接阶段(Linking)的部份内容(如一部分字节码文件格式验证动做)是交叉进行的,加载阶段还没有完成,链接阶段可能已经开始,但这些夹在加载阶段之中进行的动做,仍然属于链接阶段的内容,这两个阶段的开始时间仍然保持着固定的前后顺序。设计模式
验证是链接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,而且不会危害虚拟机自身的安全。
验证阶段大体会完成4个阶段的检验动做:数组
验证阶段是很是重要的,但不是必须的,它对程序运行期没有影响,若是所引用的类通过反复验证,那么能够考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。安全
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一块儿分配在堆中。其次,这里所说的初始值“一般状况”下是数据类型的零值,假设一个类变量的定义为:服务器
1
|
publicstaticintvalue=123;
|
那变量value在准备阶段事后的初始值为0而不是123.由于这时候还没有开始执行任何java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器()方法之中,因此把value赋值为123的动做将在初始化阶段才会执行。
至于“特殊状况”是指:public static final int value=123,即当类字段的字段属性是ConstantValue时,会在准备阶段初始化为指定的值,因此标注为final以后,value的值在准备阶段初始化为123而非0.
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动做主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。
类初始化阶段是类加载过程的最后一步,到了初始化阶段,才真正开始执行类中定义的java程序代码。在准备极端,变量已经付过一次系统要求的初始值,而在初始化阶段,则根据程序猿经过程序制定的主管计划去初始化类变量和其余资源,或者说:初始化阶段是执行类构造器<clinit>()方法的过程.
4. equal和==的区别
答:
equals只是进行值判断不对类是否是同一个引用不进行判断,而==判断包括值和类引用.经过String a = "1234"这种产生的字面字符串,若是内存中存在字符串“1234”则会直接引用,若是没有则分配内存,所以a==b的结果为true。而String c = new String("1234"),则会分配内存控件存储字符串,不考虑以前是否存在。所以a==c的结果false.因为a和c的值都是"1234"所以a.equals(c)的结果为true.同时Integer中也是相似的原理,所以使用Integer a = 12;时会在某种状况下提升程序的性能。
5. java中类型转换:
6. 关于TLS(线程局部存储)
概念:线程局部存储(Thread Local Storage,TLS)用来将数据与一个正在执行的指定线程关联起来。
进程中的全局变量与函数内定义的静态(static)变量,是各个线程均可以访问的共享变量。在一个线程修改的内存内容,对全部线程都生效。这是一个优势也是一个缺点。说它是优势,线程的数据交换变得很是快捷。说它是缺点,一个线程死掉了,其它线程也性命不保; 多个线程访问共享数据,须要昂贵的同步开销,也容易形成同步相关的BUG。
若是须要在一个线程内部的各个函数调用都能访问、但其它线程不能访问的变量(被称为static memory local to a thread 线程局部静态变量),就须要新的机制来实现。这就是TLS。
线程局部存储在不一样的平台有不一样的实现,可移植性不太好。幸亏要实现线程局部存储并不难,最简单的办法就是创建一个全局表,经过当前线程ID去查询相应的数据,由于各个线程的ID不一样,查到的数据天然也不一样了。大多数平台都提供了线程局部存储的方法,无须要咱们本身去实现:
功能:它主要是为了不多个线程同时访存同一全局变量或者静态变量时所致使的冲突,尤为是多个线程同时须要修改这一变量时。为了解决这个问题,咱们能够经过TLS机制,为每个使用该全局变量的线程都提供一个变量值的副本,每个线程都可以独立地改变本身的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每个线程都彻底拥有该变量。而从全局变量的角度上来看,就好像一个全局变量被克隆成了多份副本,而每一份副本均可以被一个线程独立地改变。
分类:动态TLS和静态TLS。
用途:动态TLS和静态TLS这两项技术在建立DLL的时候更加有用,这是由于DLL一般并不知道它们被连接到的应用程序的结构是什么样的。
1. 若是应用程序高度依赖全局变量或静态变量,那么TLS能够成为咱们的救生符。于是最好在开发中最大限度地减小对此类变量的使用,更多的依赖于自动变量(栈上的变量)和经过函数参数传入的数据,由于栈上的变量始终都是与某个特定的线程相关联的。若是不使用此类变量,那么就能够避免使用TLS。
2. 可是在编写应用程序时,咱们通常都知道本身要建立多少线程,本身会如何使用这些线程,而后咱们就能够设计一些替代方案来为每一个线程关联数据,或者设计得好一点的话,可使用基于栈的方法(局部变量)来为每一个线程关联数据。
因此:关于TLS,说法正确的是(ABD)
A 解决多线程中的对同一变量的访问冲突的一种技术
B TLS会为每个线程维护一个和该线程绑定的变量的副本
C 每个线程都拥有本身的变量副本,从而也就没有必要对该变量进行同步了
D Java平台的java.lang.ThreadLocal是TLS技术的一种实现
对于C : 若是是静态变量是共享的话,那必须同步,不然尽管有副本,仍是会出错,故C错
7.
若是一个类声明为protected,它的子类是能够访问它的,若是它和子类不在一个包中,子类仍然能够访问该类
集合中线程安全的类有:vector,stack,hashtable,enumeration,除此以外均是非线程安全的类与接口
13. Servlet的生命周期能够分为初始化阶段,运行阶段和销毁阶段三个阶段:
Servlet的生命周期通常能够用三个方法来表示:
初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,建立ServletConfig对象,将ServletConfig做为参数来调用init()方法。
Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,通常状况下,人们将Servlet理解为后者。 Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet能够响应任何类型的请求,但绝大多数状况下Servlet只用来扩展基于HTTP协议的Web服务器。 这个过程为: 1) 客户端发送请求至服务器端; 2) 服务器将请求信息发送至 Servlet; 3) Servlet 生成响应内容并将其传给服务器。响应内容动态生成,一般取决于客户端的请求; 4) 服务器将响应返回给客户端。
14. 关键字
15. 关于C++中的虚类和Java接口
答:
16. 虚类和接口的区别
17. 在运行时,由java解释器自动引入,而不用import语句引入的包是:java.lang
答:
//HashMap的源码 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable ----------------------------------- //Hashtable的源码 public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable
public V put(K key, V value) //HashMap的put方法,没有同步 public synchronized V put(K key, V value) //Hashtable的put方法 //固然,Hashtable的其余方法,如get,size,remove等方法, //都加了synchronized关键词同步操做
HashMap容许将null做为一个entry的key或者value,而Hashtable不容许。
//Hashtable的put方法有如下语句块,大伙看了都知道 // Make sure the value is not null if (value == null) { throw new NullPointerException(); } //那么,咱们再来看下HashMap的put方法中,有以下语句 //调用某个方法直接把key为null,值为value的键值对插入进去。 if (key == null) return putForNullKey(value);
//如下是Hashtable的方法 public synchronized boolean contains(Object value) public synchronized boolean containsKey(Object key) public boolean containsValue(Object value) //如下是HashMap中的方法,注意,没有contains方法,因此,D错误 public boolean containsKey(Object key) public boolean containsValue(Object value)
由全部HashMap类的“collection 视图方法”所返回的迭代器都是快速失败的:在迭代器建立以后,若是从结构上对映射进行修改,除非经过迭代器自己的 remove 方法,其余任什么时候间任何方式的修改,迭代器都将抛出ConcurrentModificationException。Hashtable和HashMap的区别主要是前者是同步的,后者是快速失败机制保证
19. 关于java实例变量,局部变量,类变量和final变量
20. 关于java threadlocal
21. 有关JVM内存
22. 建立线程对象两种方式:
23. 方法的重写(override)两同两小一大原则:
24. J2EE中经常使用名词解释
1.web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接和容器中的环境变量接接口互,没必要关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵照J2EE规范中的WEB APPLICATION 标准。咱们把遵照以上标准的WEB服务器就叫作J2EE中的WEB容器。
2.Web container:实现J2EE体系结构中Web组件协议的容器。这个协议规定了一个Web组件运行时的环境,包括安全,一致性,生命周期管理,事务,配置和其它的服务。一个提供和JSP和J2EE平台APIs界面相同服务的容器。一个Web container 由Web服务器或者J2EE服务器提供。
3.EJB容器:Enterprise java bean 容器。更具备行业领域特点。他提供给运行在其中的组件EJB各类管理功能。只要知足J2EE规范的EJB放入该容器,立刻就会被容器进行高效率的管理。而且能够经过现成的接口来得到系统级别的服务。例如邮件服务、事务管理。一个实现了J2EE体系结构中EJB组件规范的容器。 这个规范指定了一个Enterprise bean的运行时环境,包括安全,一致性,生命周期,事务, 配置,和其余的服务。
4.JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下本身的索引,从而知足快速查找和定位分布式应用程序的功能。
5.JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通信。包括点对点和广播。
6.JTA:(Java Transaction API)JAVA事务服务。提供各类分布式事务服务。应用程序只需调用其提供的接口便可。
7.JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者经过各类部署和自定义实现本身的个性安全控制策略。
8.RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于经过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,咱们能够在本地计算机上实现对其直接调用。固然这是要经过必定的规范才能在异构的系统之间进行通讯。RMI是JAVA特有的。RMI-IIOP出现之前,只有RMI和CORBA两种选择来进行分布式程序设计。RMI-IIOP综合了RMI和CORBA的优势,克服了他们的缺点,使得程序员能更方便的编写分布式程序设计,实现分布式计算。首先,RMI-IIOP综合了RMI的简单性和CORBA的多语言性(兼容性),其次RMI-IIOP克服了RMI只能用于Java的缺点和CORBA的复杂性(能够不用掌握IDL)。
25. final,finally和finalize:
final
finally
26. JSP内置对象和属性列举以下:
1.request对象
客户端的请求信息被封装在request对象中,经过它才能了解到客户的需求,而后作出响应。它是HttpServletRequest类的实例。
2.response对象
response对象包含了响应客户请求的有关信息,但在JSP中不多直接用到它。它是HttpServletResponse类的实例。
3.session对象
session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开链接为止。它是HttpSession类的实例.
4.out对象
out对象是JspWriter类的实例,是向客户端输出内容经常使用的对象
5.page对象
page对象就是指向当前JSP页面自己,有点象类中的this指针,它是java.lang.Object类的实例
6.application对象
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的先后链接或不一样用户之间的链接中,能够对此对象的同一属性进行操做;在任何地方对此对象属性的操做,都将影响到其余用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
7.exception对象
exception对象是一个例外对象,当一个页面在运行过程当中发生了例外,就产生这个对象。若是一个JSP页面要应用此对象,就必须把isErrorPage设为true,不然没法编译。他其实是java.lang.Throwable的对象
8.pageContext对象
pageContext对象提供了对JSP页面内全部的对象及名字空间的访问,也就是说他能够访问到本页所在的SESSION,也能够取本页面所在的application的某一属性值,他至关于页面中全部功能的集大成者,它的本 类名也叫pageContext。
9.config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(经过属性名和属性值构成)以及服务器的有关信息(经过传递一个ServletContext对象)
27. 关于super和this
28. 内部类声明
public class Enclosingone { //非静态内部类 public class InsideOne {} //静态内部类 public static class InsideTwo{} } class Mytest02{ public static void main(String args []){ Enclosingone.InsideOne obj1 = new Enclosingone().new InsideOne();//非静态内部类对象 Enclosingone.InsideTwo obj2 = new Enclosingone.InsideTwo();//静态内部类对象 } }
29. 接口 默认修饰符
接口中的变量默认是public static final 的,方法默认是public abstract 的
30.