第 25 页 共 71 页
择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
快速排序的伪代码:使用快速排序方法对a[ 0 :n- 1 ]排序从a[ 0 :n- 1 ]中选择一个元素作为middle,该元素为支点;把余下的元素分割为两段left和right,使得left中的元素都小于等于支点,而right中的元素都大于等于支点;
递归地使用快速排序方法对left进行排序;递归地使用快速排序方法对right进行排序;所得结果为left + middle + right。
94、请用JAVA实现两个类,分别实现堆栈(Stack)和队列(Queue)操作。 答:public class MyStack { private List list; public MyStack(){
list = new ArrayList(); }
public boolean isEmpty(){ return list.size() == 0; }
public void push(Object obj){ list.add(obj); }
public Object pop(){ if(list.size()>0){
Object obj = list.get(list.size()-1); list.remove(list.size()-1); return obj; }else{
return null; } }
public int getNumber(){ return list.size(); } }
class IntegerQueue {
public int[] integerQueue;// 用来当队列 public int tail;// 队尾
public int size;// 队的长度,也可以设置一个默认值,溢出时从新申请
public IntegerQueue(int size) { integerQueue = new int[size]; this.size = size; tail = 0; }
public void inQueue(int i) { if (tail < size) {
this.integerQueue[tail] = i; tail++; } else {
System.err.println(\溢出啦!\ } }
public int outQueue() { if (tail >= 0) {
Copyright Tarena Corporation,2009.All rights reserved
第 26 页 共 71 页
}
}
int tmp = this.integerQueue[tail]; tail--; return tmp; } else {
System.err.println(\队列为空!\ throw new RuntimeException(); }
95、简述JAVA代码安全性
答:类加载器(class loader)加载程序运行所需要的所有类,它通过区分本机文件系统的类和网络系统导入的类增加安全性,这可以限制任何的特洛伊木马程序,因为本机类总是先被加载,一旦所有的类被加载完,执行文件的内存划分就固定了,在这个时候特定的内存地址被分配给对应的符号引用,查找表(lookuo table)也被建立,由于内存划分发生在运行时,解释器在受限制的代码区增加保护防止未授权的访问;然后字节码校验器(byte code verifier)进行校验,主要执行下面的检查:类符合JVM规范的类文件格式,没有违反访问限制,代码没有造成堆栈的上溢或者下溢,所有操作代码的参数类型都是正确的,没有非法的数据类型转换(例如将整型数转换成对象类型)发生;校验通过的字节码被解释器(interpreter)执行,解释器在必要时通过运行时系统执行对底层硬件的合适调用。
96、简述java中的继承
答:Java中是单继承关系,也就是说一个类只能有一个父类,但是可以同时实现多个接口;对于接口本身而言,可以继承多个接口。这样做的目的就是为了阻止因为多继承而造成的的业务对象本身的可读性的降低。
97、简述java中的垃圾回收
答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法:System.gc() 或Runtime.getRuntime().gc() 。
98、一个subclass怎样调用superclass中的方法(myMethod)和构造函数? 答:用super关键字,子类去调用父类的方法,如:super.myMethod();子类去调用父类的构造函数,如:super();。
99、String a=null; if (a!=null && a.length()>10) {...} 上面面的代码,如果你用“&”替换“&&”将发生什么错误?
答:会抛出空指针异常;&&会短路,只要遇到boolean值为false就不会再往后执行了;而&则是会把两边的运算都执行完。
100、abstract class和interface有什么区别?
答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。新型多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,所有成员变量都是public static final的。一个类可以实现多个接口,当类实现接口时,必须实现接口的所有方法。抽象类在Java语言中表示的是一种单继承的关系,而接口表示的是多继承的关系;抽象类中可以定义自己的成员变量,也可以包含非抽象的方法,而在
Copyright Tarena Corporation,2009.All rights reserved
第 27 页 共 71 页
接口中只能有静态的常量,所有方法必须是抽象的;实现抽象类时可以只实现其中的部分方法,而要是实现一个接口的话就必须实现这个接口中的所有抽象方法。
101、String, StringBuffer StringBuilder的区别。 答:String的长度是不可变的; StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法;线程安全;
StringBuilder是从 JDK 5 开始,为StringBuffer该类补充了一个单个线程使用的等价类;通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
102、谈谈final, finally, finalize的区别
答:final —修饰符(关键字)如果一个类被声明为final,意味着它不能再派 生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的 ,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不 被改变。被声明为final的变量必须在声明时给定 初值,而在以后的引用中只 能读取,不可修改。被声明为final的方法也同样只能使用,不能重载
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块( 如果有的话)
finalize —方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对 象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定 这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此 所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其 他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 103、屋子里面有椅子,椅子有四只腿及靠背。屋子、椅子什么关系,椅子、腿、靠背什么关系(HAS-A,IS-A)?
答:屋子HAS-A椅子
椅子HAS-A四只腿及靠背
104、你认为java与其他(你所了解的)语言相比,有什么优点和缺点? 答:1). Java没有预处理指令。(如C中的#define , #include , #ifdef等)。C中的常量定义在Java中用static final来取代。
2). Java中没有C中的全局变量。
3). Java中的主类型的size是确定的,而C中主类型的size跟平台相关。
4). Java中没有了指针,它使用了类似的句柄来取代指针,但是Java中不允许对句柄进行加减,没有取地址操作符之类的东东。
5). Java有垃圾收集机制,不需要自己释放空间。
6). Java没有goto语句。Java在C提供的控制语句基础上增加了异常处理和标签break和continue语句。这些可以替代goto的作用。
7). C要求一个方法或块中使用的所有局部变量的定义在该方法或块的最开始处定义,而Java允许这些定义在方法或块的任意地方出现。
8). Java不要求在调用一个函数以前已经定义了该函数,可以在调用点后面定义。而C有这个要求。
9). Java不支持C中的strut 和 union类型。Java支持方法重载。 10). Java不支持C中的enum关键字。 11). Java不支持C中的bitfields能力。 12). Java不支持C的typedef。 13). Java不支持C的方法指针。 14). Java不支持C的可变参数表。
java和.net的都不适合做桌面程序,这两个比较适合写WEB的程序;
c++比较适合写桌面程序c++/java都是强类型的静态预编译型语言。优点是结构性强,程序可读性
Copyright Tarena Corporation,2009.All rights reserved
第 28 页 共 71 页
好,开发效率高,适合开发大型应用。就本人的经验而言,java的开发效率优于c++,实际上java大行其道的首要因素就是它够简单。java尤其不适合开发桌面程序,GUI的API一直都是java的弱点;
perl/python是动态解释型语言。perl是弱类型的而python是强类型的,后者的变量一旦赋值,就拥有了类型,不能再赋其他类型的值。不象javascript/perl可以随便定义。perl是unix下的王牌工具,在缺乏IDE的字符界面下,很好地弥补了unix;
shell/utility的不足,并且部分继承了面向对象语言的灵活性。适合用来搭建大程序。
105、Java中包含哪些基本数据类型?String是最基本的数据类型吗?是否可以继承String类? 答:基本类型包括byte、int、short、long、float、double、boolean
String不是基本数据类型,因为String类是final的,所以不能够被继承。
106、Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
答:Math.round(11.5)==12 Math.round(-11.5)==-11 round方法返回与参数最接近的长整数,参数加1/2后求其floor。
107、Bit和 Byte是什么意思?它们之间有什么关系?
答:bit中文名称是位,是用以描述电脑数据量的最小单位。
byte(字节)是计算机信息技术用于计量存储容量和传输容量的一种计量单 位1byte=8bit
108、用最有效的方法算出2乘已8对于几? 答: 2 << 3。
109、String s=new Stirng(\创建了几个String Object? 答:创建两个,一个在堆内存(通过new得到),另一个在字符串常量池(“xyz”)对象。
110、swtich是否能作用在byte上?是否能作用在long上? 是否能作用在char上? 是否能作用在short上?是否能作用在String上?
答:可以用在byte、short、int、char和枚举类型。
111、char型变量中能不能存贮一个中文汉字?为什么?
答:能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的。
112、java语言中public、private、protected三个关键字的用法,重写和重载的区别。 答:
作用域 当前类 同包 子类 其它
public √ √ √ √ protected √ √ √ × default √ √ × × private √ × × ×
重写:发生在父子类之间,方法名相同,参数的类型、个数、顺序相同,返回值相同,访问权限不能更封闭,抛出异常不能宽泛;
重载:发生在同一个类中,方法名相同,但是参数不同(类型不同或个数不同或参数的顺序不同),返回值可以不相同。
113、说一下 “==”和equals()方法在字串变量操作中的不同? 答:”==”比较的是两个字符串对象的地址,equals()是比较的两个字符串的具体值。
114、异常机制中try{}后一定要跟catch和finally吗?
答:一定要有catch或者finally,catch子句紧跟在try块后面,用来指定你想要捕捉的“异常”的类型。如果有catch的话,可以没有finally。
115、能用foreach遍历访问的对象需要实现?
Copyright Tarena Corporation,2009.All rights reserved

