Java平台有3个版本:适合于小型设备和智能卡的JavaME(Java Platform Micro Edition,Java微型版)、适用于桌面系统的JavaSE(Java Platform Standar Edition,Java标准版)和适用于企业级应用的JavaEE(Java Platform Enterprise Edition,Java企业版)
JavaEE(Java Enterprise Edition)是Sun一个开发分布式企业级应用的规范和标准
它包含JavaBean,JNDI,JDBC,XML,EJB,JSP,Servlet,JCA,JSF,JACC,JAXP,JAXR,JAF,JMS,JMX,JTA,JAX-WS等技术。
这三个类都可以储存和操作字符串,即包含多个字符的字符数据。对于String类,一个字符串对象一旦被配置,它的内容是固定不变。而这个StringBuffer类提供的字符串可进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer和StringBuilder。StringBuilder是JavaSE5.0中新增的类,它被设计为与StringBuffer具有相同的操作接口,在单机非多线程的情况下使用StringBuilder会有较好的效率,因为StringBuilder没有处理同步问题,StringBuffer则会处理同步问题,如果stringBuilder会在多线程下被操作,则要改用StringBuffer,让对象自行管理同步问题。
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快,它适合插入和删除元素。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都实现了Map接口,HashMap效率上高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronized的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
Collection是接口,是集合框架的根,它有两个子接口:Set和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
Java中有基本数据类型和引用数据类型。基本数据类型包括byte、int、char、long、float、double、boolean和short。
异常是表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
Java提供两种不同的类型:引用类型和原始类型(或内置类型)。int是java的原始数据类型,Integer是java为int提供的封装类。int的缺省值为0,Integer的缺省值为null。
封装、继承、多态和抽象
boolean Boolean 、 char Character、 byte Byte、 short Short、 int Integer 、 long Long 、 float Float 、double Double。
Java中的线程有以下几种状态:运行、就绪、挂起、结束。
用Arrays类中的equals()方法。
1)等待输入输出完成;2)调用sleep()方法;3)尝试获得对象锁定;4)调用wait()方法。
条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型(位运算);逻辑操作不会产生短路。
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可被继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloading的方法是可以改变返回值的类型。
error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出,不可能指望程序能处理这样的情况。 exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
相同点:都是引用数据类型,都不能被实例化,但都可以声明该类型的引用;抽象类的引用指向实现了抽象方法的子类对象,接口的引用指向实现了该接口的类的对象。
不同点:抽象类里可以有实现方法,也可以有抽象方法,也可以没有抽象方法,抽象方法不可以用private修饰,而接口里的所有方法都是抽象方法而且是public;接口只可以定义static final成员变量。抽象类供子类继承,并提供自已实现了的方法以及子类要实现的方法,如果子类还是没有实现抽象类的抽象方法,则该类还是要声明为抽象类,而接口提供类要实现的方法,实现接口的类必须要把接口中的方法全部实现;此外,接口可以继承接口,甚至还支持多继承。
GC是垃圾收集的意思(Garbage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显式操作方法。
2个
Java中实现线程有两种方式:第一种是继承Thread,第二种是实现Runnable接口。启动线程用start()方法。
接口可以继承接口,也可以继承多个接口。抽象类可以实现(implements)接口,抽象类可继承实体类。
数组没有length()这个方法, String有length()这个方法
不可以,它是final类
switch(expr1)中,expr1是一个整数表达式。因此传递给switch和case语句的参数应该是int、 short、 char或者byte。Long,String都不能作用于swtich。
会执行,在return前执行。
是值传递。Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
能够存储成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
用最有效率的方法算出2乘以8等于几?两
2 << 3
对。可有相同的hashcode,也可以有不同的hashcode。
List,Set继承Collection,而Map不继承Colleciton。
ArithmeticException, classCastException, , IllegalArgumentException, IndexOutOfBoundsException,NullPointerException,SystemException等。
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
short s1 = 1; s1 += 1;(可以正确编译)
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
Math.round(11.5)==12
Math.round(-11.5)==-11
round方法返回与参数最接近的长整数,参数加1/2后求其floor.
J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
都不能
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种形式:
第一种形式:
public class Singleton {
private Singleton(){ }
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
if (instance==null)
instance=new Singleton();
return instance; }
}
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
不可以,如果其中包含对象的method();不能保证对象初始化.
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
Java也存在内存泄露问题,其原因主要是一些对象虽然不再被使用,但它们仍然被引用。
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
Clone有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。
List以特定次序来持有元素,可有重复元素。Set无法拥有重复元素,内部排序。Map保存key-value值,key不可重复,value可重复。
常用的类:StringBuffer Scanner String Integer ArrayList
常用的包:java.lang java.text java.io java.util java.sql
常用的接口:Set List Map Collection Iterator
public class StringQueue {
private LinkedList
public StringQueue() {
linkedList = new LinkedList
}
public void put(String name) {
linkedList.addFirst(name);
}
public String get() {
return linkedList.removeLast();
}
public boolean isEmpty() {
return linkedList.isEmpty();
}
}
public class StringStack {
private LinkedList
public StringStack() {
linkedList = new LinkedList
}
public void push(String name) {
// 将元素加入链表前端
linkedList.addFirst(name);
}
public String top() {
// 取得链表第一个元素
return linkedList.getFirst();
}
public String pop() {
// 移出第一个元素
return linkedList.removeFirst();
}
public boolean isEmpty() {
// 链表是否为空
return linkedList.isEmpty();
}
}
可以。必须只有一个类名与文件名相同。
字节流和字符流。字节流继承于InputStream(输入)或OutputStream(输出),字符流继承于Reader(输入) 或Writer(输出)。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。
用try来指定一块预防所有异常的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。
throw语句用来明确地抛出一个异常对象。
throws用来标明一个成员函数可能抛出的各种异常类。
finally为确保一段代码不管发生什么异常都被执行一段代码。
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,异常的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种异常的try语句。
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)。
快速排序的伪代码。
/ /使用快速排序方法对a[ 0 :n- 1 ]排序
从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点
把余下的元素分割为两段left和r i g h t,使得l e f t中的元素都小于等于支点,而right中的元素都大于等于支点
递归地使用快速排序方法对left进行排序
递归地使用快速排序方法对right进行排序
所得结果为l e f t + m i d d l e + r i g h t
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
用break+lable、continue+lable或return。
用synchronized关键字修饰同步方法;transient为变量修饰符。标记为transient的变量,在对象存储时,这些变量状态不会被持久化。当对象序列化时保存在存储器上时,不希望有些字段数据被保存,为了保证安全性,可以把这些字段声明为transient。
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
内部类可以引用它包含类的成员。 如果内部类是在方法中定义的,只能访问方法中的final类型的局部变量,因为用final定义的局部变量相当于是一常量,它的生命周期超出方法运行的生命周期。
简单性、面向对象、分布式、健壮性、结构中立、安全性、与平台无关、解释执行、高性能、多线程以及动态性。
Statement: 主要用来执行一条单独的sql语句,他主要有三个方法executeUpate(),executeQuery()和exceute()。
PreparedStatement: 它继承Statement,主要用在多次执行一个sql语句,执行效率较高,还可以防止sql注入攻击漏洞。
CallableStatement:它继承PreparedStatement,主要用于执行存储过程。主要有registerOutParamenter()等方法。
public String convertString(String str){
String result=null;
if(result==null)
return null;
else{
try {
result=new String(str.getBytes(“ISO-8859-1”),”GBK”);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
public:表明该成员变量和方法是公共的,能在任何情况下被访问。
protected:必须在同一包中才能被访问,还可被其子类访问
private: 只能在本类中访问。
缺省:只能在同一个包中被访问
JDK(Java Development kits) ,JRE(Java Runtime Enviroment) ,JVM(Java Virtual Machine)
至少15%以上。
结果为10。
//Firstapplet.java
import java.awt.*;
import java.applet.*;
public class Firstapplet extends Applet {
String s;
public void init() {
s= “hello”;
}
public void paint(Graphics g){
g.drawString(s, 70, 80);
}
}
//test.html
public int calSum(int n){
int result=1;
for (int i = 2; i <= n; i++) {
result+=(i%2==0:1:-1)*i;
}
return result;
}
cd
JDBC-ODBC桥驱动,本地API部分调用驱动、JDBC-Net纯Java驱动以及本地协议纯Java驱动。
public int fibnacci(int n){
if(n==1 ||n==2)
return 1 ;
else
return fibnacci(n-1)+ fibnacci(n-2) ;
}
public class ReverseString {
public static void main(String[] args) {
ReverseString rs=new ReverseString ();
System.out.println(“result of reverse:”+rs.inverseStr(rs.input()));
}
public String reverseStr(String str){
StringBuffer buf=new StringBuffer(str);
return buf.reverse().toString();
}
public String input(){
Scanner scanner=new Scanner(System.in);
System.out.print(“please input a String:”);
return scanner.next();
}
}
Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。
public void readTextFile(String path) {
try {
BufferedReader br = new BufferedReader(new FileReader(path));
String str = “”;
while (br.read() != -1) {
str += (br.readLine()+”\r\n”);
}
System.out.println(“文本中的内容是:” + str);
} catch (FileNotFoundException e) { e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public int[] bubbleSort(int []arr) {
long begin = 0, end = 0;
int temp = 0;
begin = new Date().getTime();
for (int i = 0; i
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] < arr[j+1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
end = new Date().getTime();
System.out.println(“循环时间:” + (end-begin)+”毫秒”);
return arr;
}
public String convertDateFormat(String d){
java.text.SimpleDateFormat df=new SimpleDateFormat(“dd-MM-yyyy”);
try {
Date date=df.parse(d);
df.applyPattern(“dd/MM/yyyy”);
return df.format(date);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
Web应用程序打包成后缀为war的文件,EJB组件、适配器组件以及其它客户端应用组件打包成后缀为.jar的文件,一个完整的j2ee应用程序打成后缀为ear的文件包,它包含jar、war、rar组件档案文件以及描述这些组件的xml描述器。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。
该方法生成一个Class对象,它可以实现类的动态加载。
重构是指“保持外部状态和功能不变,而优化内部处理编码”的方法。
Eclipse是一个非常优秀的集成开发环境。它的特点是:1)免费、开源、免安装;2)开放的可扩展的IDE;3)成功的底层图形界面API;4)强大的插件加载功能;5)实现版本管理的便易性;6)充分的帮助文件。Eclipse的核心是动态发现插件的体系结构。
Annotation是JavaSE 5.0中新增的特性,它对程序运行没有影响,它的目的在于对编译器或分析工具说明程序的某些信息,您可以在包、类、方法、域成员等加上Annotation。每一个Annotation对应于一个实际的Annotation类型。常用的Annotation有java.lang.Override,java.lang.Deprecated,java.lang.SuppressWarnings。
Java中的流分为字节流和字符流。字节流继承于InputStream(输入) 或OutputStream(输出),字符流继承于Reader(输入) 或Writer(输出)。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
所谓meta-annotation就是Annotation类型的数据,也就是Annotation类型的Annotation。
常见的meta-annotation有:java.lang.annotation.Retention,java.lang.annotation.RetentionPloicy,java.lang.annotation.ElementType, java.lang.annotation.Documented, java.lang.annotation.Inherited。
JDK5.0增加了格式化输出、泛型、装箱和拆箱、枚举、注解等新特性.
JDK6.0新特性:Desktop类和SystemTray类;使用JAXB2来实现对象与XML之间的映射;StAX;使用Compiler API;轻量级Http Server ;插入式注解处理API;用Console开发控制台程序;Common Annotations等。
不正确,会出现精度丢失错误。
(以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题)
public class ThreadTest1 {
private int j;
public static void main(String args[]) {
ThreadTest1 tt = new ThreadTest1();
Inc inc = tt.new Inc();
Dec dec = tt.new Dec();
for (int i = 0; i < 2; i++) {
Thread t = new Thread(inc);
t.start();
t = new Thread(dec);
t.start();
}
}
private synchronized void inc() {
j++;
System.out.println(Thread.currentThread().getName() + “-inc:” + j);
}
private synchronized void dec() {
j--;
System.out.println(Thread.currentThread().getName() + “-dec:” + j);
}
class Inc implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
inc();
}
}
}
class Dec implements Runnable {
public void run() {
for (int i = 0; i < 100; i++) {
dec();
}
}
}
}
true
用StringBuffer或StringBuilder类中的append()。
结果是12aa66
Junit是一个免费开源的单元测试框架。最初由Erich Camma与Kent Beck编写,用来编写与执行重复性的测试。它包括以下特性:1)对预期结果作出判断;2)提供测试装备的生成与销毁;3)易于组织与执行测试;4)图形与文字接口的测试器。
import org.junit.*;
public class TestAdd {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testAdd() { //complete method of test}
}
Assert接口里有assertEquals(),assertTrue(),assertFalse(),assertSame(),
assertNotSame(),assertNull(),assertNotNull()断言方法。
BEA WebLogic Server,IBM WebSphere Application Server,Oracle的Application Server,jBoss,Tomcat,glassfish等。
Struts 、JSF 、WebWork 、 TapeStry 、 Spring 、 Hibernate 、junit 、DWR
Struts 、JSF 、WebWork 、 TapeStry是实现MVC模式的Web层框架,Spring是全方位的应用程序框架,Hibernate是实现ORM的轻量级的持久层框架,junit是针对Java的单元测试框架,DWR是针对Java的Ajax框架。
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的通用解决方案。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式(用来开发JSP/Servlet或者J2EE的相关应用)、简单工厂模式、单例模式等。
unicode
Java Database Connectivity (JDBC)是一个标准的Java API,它由一组类和接口组成,Java应用程序开发人员使用它来访问数据库和执行SQL语句。
JNDI(Java Name Directory Interface),允许java程序访问外部的对象。它是给当前应用服务器所管理的资源一个唯一的标识,包括EJB,连接池等等。JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个纪录,同时返回数据库连接建立所必须的信息。
会,不能把int转为byte。
不会。b的值为-128。
i的值为1。
这两个接口都继承Colleciton。List接口与其实现类是容量可变的列表,可按索引访问集合中的元素,是有序的集合,它的元素可以重复。Set接口是一种不包含重复元素的Collection ,也就是说在Set中最多只能有一个null元素。
栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。栈的优势是,存取速度比堆要快;栈有一个很重要的特殊性,就是存在栈中的数据可以共享;栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
JVM启动时会形成3个类加载器组成的初始化加载器层次结构。即Bootstrap Classloader, Extension Classloader和System Classloade。Java ClassLoader是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
abstract class Name {
private String name;
public abstract boolean isStupidName(String name) { }
}
答案: 错。abstract method必须以分号结尾,且不带花括号。
public class Something {
void doSomething () {
private String s = “”;
int l = s.length();
}
}
答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。
abstract class Something {
private abstract String doSomething ();
}
答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,同理,abstract method前不能加final。
public class Something {
public int addOne(final int x) {
return ++x;
}
}
答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。
public class Something {
public static void main(String[] args) {
Other o = new Other();
new Something().addOne(o);
}
public void addOne(final Other o) {
o.i++;
}
}
class Other {
public int i;
}
答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference(比如: o = new Other(),那么如同上例这题也是错的。但这里修改的是o的member vairable(成员变量),而o的reference并没有改变。
class Something {
int i;
public void doSomething() {
System.out.println(“i = “ + i);
}
}
答案: 正确。输出的是”i = 0”。int i属于instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。
class Something {
final int i;
public void doSomething() {
System.out.println(“i = “ + i);
}
}
答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为”final int i = 0;”。
public class Something {
public static void main(String[] args) {
Something s = new Something();
System.out.println(“s.doSomething() returns “ + doSomething());
}
public String doSomething() {
return “Do something ...”;
}
}
答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成”System.out.println(“s.doSomething() returns “ + s.doSomething());”。同理,static method不能访问non-static instant variable。
此处,Something类的文件名叫OtherThing.java
class Something {
private static void main(String[] something_to_do) {
System.out.println(“Do something ...”;
)
}
答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。
interface A{
int x = 0;
}
class B{
int x =1;
}
class C extends B implements A {
public void pX(){
System.out.println(x);
}
public static void main(String[] args) {
new C().pX();
}
}
答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为public static final.所以可以通过A..x来明确。
interface Playable {
void play();
}
interface Bounceable {
void play();
}
interface Rollable extends Playable, Bounceable {
Ball ball = new Ball(“PingPang”;
)
class Ball implements Rollable {
private String name;
public String getName() {
return name;
}
public Ball(String name) {
this.name = name;
}
public void play() {
ball = new Ball(“Football”;
System.out.println(ball.getName());
)
}
答案: 错。”interface Rollable extends Playable, Bounceable”没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的”Ball ball = new Ball(“PingPang”;”。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说”Ball ball = new Ball(“PingPang”;”实际上是”public static final Ball ball = new Ball(“PingPang”;”。在Ball类的Play()方法中,”ball = new Ball(“Football”;”改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在”ball = new Ball(“Football”;”这里显示有错。
编程式事务和声明式事务
OOP是从静态角度描述程序结构,而AOP从动态角度描述程序的动行过程,AOP是OOP的延续,是OOP的补充。
IOC是Inversion Of Control是缩写 ,DI是Dependency Injection的缩写,IOC即DI,是Spring框架的核心思想,它主要解决编写应用程序时不用关心组件的实现。不管是IOC还是DI都说明Spring采用动态、灵活的方式来管理各种对象,它们的主要作用是分离组件的使用和实现。依赖注入是指在程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部注入。
AOP(Aspect Orient Programming),也就是面向切面编程,作为面向对象编程的一种补充。它从动态角度考虑程序运行过程。它主要将程序中的公共问题集中解决。AOP将“方面”分离出来,写代码时只需关注当前业务逻辑;AOP的一个典型应用是在声明式事务。Spring采用在方法调用前、后或抛出异常时“织入”方面代码来实现AOP。
id属性确定该Bean的唯一标识符,这个id属性必须遵循XML文档的ID属性规则,因此有一些特殊要求,例如不能以”/”等特殊符号作为属性值。但在某些特殊时候,Bean的标识必须包含这些特殊符号,此时可以采用name属性,它用于指定Bean的别名,通过访问Bean别名也可访问Bean实例。
1) 在struts-config.xml配置插件
... ...
className=”org.springframework.web.struts.ContextLoaderPlugIn”> value=”classpath:applicationContext.xml” />
2) 修改Action Bean配置
scope=”request” type=”org.springframework.web.struts.DelegatingActionProxy”> 。。。。。。
3) 在Spring配置文件中配置Action Bean,将Biz注入
ROPAGATION_REQUIRED—支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择;
PROPAGATION_SUPPORTS—支持当前事务,如果当前没有事务,就以非事务方式执行;
PROPAGATION_MANDATORY—支持当前事务,如果当前没有事务,就抛出异常;
PROPAGATION_REQUIRES_NEW—新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED—以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER—以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED—如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
通知是在特定的连接点,AOP框架执行的动作。各种类型的通知包括前置通知、后置通知、环绕通知以及异常通知。前置通知要实现MethodBeforeAdvice,后置通知要实现AfterReturningAdvice,环绕通知要实现MethodInterceptor,异常通知要实现ThrowsAdvice。
低侵入式设计,代码的污染极低;独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run AnyWhere;Spring框架的DI机制降低了业务对象替换的复杂性;Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。
Spring 2.0中声明式事务配置是非侵入式的,且更简洁易懂。
transaction-manager=”myHibTransactionManager”>
expression=”execution(* com.apt.jb.biz.*.*(..))” /> Spring框架由Spring Core、Spring AOP、Spring ORM、Spring DAO、Spring Web、Spring Context以及Spring MVC组成。 ApplicationContext context=new ClassPathXmlApplicationContext(“applicationContext.xml”); 或ApplicationContext context=new FileSystemXmlApplicationContext(“applicationContext.xml”); 或其它方法。 用处不同:传统JavaBean更多作为值对象传递参数,Spring的Bean用处几乎无所不包,任何应用组件都被称为Bean。 写法不同:传统JavaBean作为值对象,要求每个属性都提供getter和setter方法;但Spring的Bean只需为接受设值注入的属性提供setter方法。 生命周期不同,传统JavaBean作为值对象传递,不接受任何容器管理其生命周期;Spring中的Bean由Spring管理其生命周期行为。 在配置文件中父Bean用abstract属性,子Bean用parent属性。 Spring中的子Bean和父Bean可以是不同类型,但在Java中的继承,则保证子类是一种特殊的父类;Spring中Bean继承是实例之间的关系,因此主要表现为参数值的延续;而Java中的继承是类之间的关系,主要表现为方法和属性的延续;Spring中的子Bean不可作为父Bean使用,不具备多态性;Java中的子类实例完全可当父类实例使用。 singleton、prototype、request、session、global session。 ApplicationConext在加载ApplicationContext实例时,会自动实例化容器的全部Bean;而BeanFactory等到程序需要Bean实例时才创建Bean.。 利用Struts的PlugIn来启动Spring容器;利用DelegatingRequestProcessor;使用ActionSupport代替Action。 Spring的后处理器包括容器后处理器和bean后处理器。 容器后处理器:对IOC容器进行特定的后处理。它必须实现BeanFactoryPostProcessor接口。 Bean后处理器:它是一种特殊的Bean,它并不对外提供服务,它对容器中特定的Bean进行定制。如功能的增强。该处理器必须实现BeanPostProcessor接口。 可以,如果有多个,可以传入一个字符串数组 有属性注入,构造注入 HibernateDaoSupport、HibernateTemplate以及HibernateCallBack 一种是直接在web.xml文件中配置创建Spring容器(采用ServletContextListener实现或者采用load-on-startup Servlet实现);另一种是利用第三方MVC框架的扩展点,创建Spring容器。 采用new关键字调用构造器、调用某个类的静态工厂方法以及调用实例工厂方式。 Web2.0,简单地说是相对Web1.0(2003年以前的互联网模式)的新的一类互联网应用的统称,是一次从核心内容到外部应用的革命。Web2.0比Web1.0在表现形式上丰富,强调用户的参与。 Web2.0的特点:内容聚合;RSS;用户贡献内容;社会化网络;更丰富的“用户体验”,新的交互方式;无刷新。 Web2.0主要包括Blog,Mblog,Ajax,Podcasting/Podcast,社会化Tag,wiki,p2p,rss,webservice,sns等技术。 Ajax的前称是Asychronous JavaScript And XML(异步JavaScript和XML);它不是一项新技术,而是很多成熟技术的集合;2005年2月,Adaptive Path公司的Jesse James Garret最早提出这个概念;Ajax技术是web2.0的核心技术之一。 在基于Ajax的Web程序中,在用户行为和服务器端多了一层Ajax引擎,它负责处理用户的行为,并转化为对服务器的请求。同时它接收服务器端的返回信息,经过处理后显示给用户。由于Ajax在后台以异步的方式的工作,用户无需等待服务器的处理,可以进行并发工作,这就在用户界面层次中更为接近了CS架构的客户端平台。 Ajax包括以下几种技术:JavaScript脚本语言;可扩展标记语言(XML);文档对象模型(DOM);级联样式表(CSS);XMLHttpRequest对象等。 常用的Ajax框架有:WebORB for Java,Echo 2 ,DWR,SWATO,The AJAX JSP Tag Library,The Ajax-JSF等。 Ajax的核心对象是XMLHttpRequest对象。 function createXmlHttpRequest(){ if(window.ActiveXObject){ return new ActiveXObject(“Microsoft.XMLHTTP”); }else if(window.XMLHttpRequest){ return new XMLHttpRequest(); } } DWR(Direct Web Remoting)是开源,免费的Ajax框架,它将Java类发布为JavaScript可调用的脚本对象,提供JavaScript工具类,简化页面编码。 使用DWR框架的步骤: 1) 准备工作:下载dwr.jar, 添加到项目中( http://getahead.org/dwr ),创建配置文件:/WEB-INF/dwr.xml,配置web.xml 2)发布Java类,完成dwr.xml文件配置。 3) 在页面中使用。 function checkUserExists(oCtl){ var uname = oCtl.value; // 发送请求到服务器,判断用户名是否存在 JUserChecker.check(uname,haoLeJiaoWo); } function haoLeJiaoWo(isExist) { if(isExist == 1){ alert("用户名已存在!"); } else if(isExist == 0){ alert("用户名不存在!"); } } 130. Spring框架有哪几部分组成?
131. 在应用程序中如何获得Spring容器?
132. Spring中的Bean和传统JavaBean有什么不同?
133. Spring中的Bean如何实现继承?它和java中的继承有什么区别?
134. Spirng中的Bean的作用范围有哪些?
135. ApplicationConext和BeanFactory有什么主要区别?
136. Spring和Struts集成可以有哪几种方式?
137. Spring的后处理器有哪几种?它们有什么作用?
138. Spring的配置文件可不可以有多个?
139. Spring的注入方式有哪几种?
140. Spring提供了哪几个工具类或接口来支持DAO组件的实现?
141. 在web应用中创建Spring容器有哪几种方式?
142. Spring中创建Bean有哪几种方式?
143. web2.0有什么特点?主要包括什么技术?
144. 什么是Ajax?
145. 简要描述Ajax应用的工作流程。
146. Ajax包括哪些关键技术?
147. 常用的Ajax框架有哪些?
148. Ajax的核心对象是什么?
149. 请写出创建XMLHttpRequest对象的javascript函数。
150. 谈谈你对DWR框架的理解。