- Java有没有goto?(易)
java中的保留字,现在没有在java中使用。
- 启动一个线程是用run()还是start()?(中)
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
- 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?(中)
不对,有相同的hash code。
- swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上? (中)
switch(expr1)中,expr1是一个整数表达式。应该是 int、 short、 char、byte。
long,string 都不能作用于swtich。
- 编程题:写一个Singleton出来。 [难]
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
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;
}
}
String tempStr = “”;
try {
tempStr = new String(str.getBytes(“ISO-8859-1”), “GBK”);
tempStr = tempStr.trim();
}catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}
- String与StringBuffer的区别(中)
答案:String一但声明,在内存中是不可改变的,而SringBuffer是可变的字符序列。
- char型变量中能不能存贮一个中文汉字?为什么?(中)
答案:可以,就为采用Unicode编码.
- Float型float f=3.4是否正确?(易)
答案:不正确,应为:float f =3.4f;
- 下面语句执行后的结果是什么?(难)
答案:true ;false
String a=”teststringA”;
StringBuffer b =new StringBuffer(“teststringA”);
String c=”teststringA”;
System.out.println (a.equals(b.toString()));
System.out.println (a==c);
- class.forname的作用?为什么要用?
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
- JSP中动态INCLUDE与静态INCLUDE的区别?(难)
答案:动态包含可以传递参数,而静态则不可以。
- 以下程序代码将输出什么? (难)
答案:3 null
public class Test {
static int a = 3;
static String b = null;
public void reset(){
a =4;
b = “abc”;
}
public static void main(String[] args) {
System.out.println(a + ” ” + b);
}
}
- 以下程序代码输出的变量i的值为多少?(难)
答案:199
public class Test {
public static void main(String[] args) {
int i = 99;
add(i);
System.out.println(i + 100);
}
public static void add(int i){
i += 100;
}
}
- 以下程序代码中哪行代码将产生错误?(难)
class Parent {
private String name;
public Parent(){
}
}
public class Child extends Parent{
private String dev;
public Child(){}
public String getValue(){
return name; //产生错误
}
public static void main(String[] args) {
Parent p = new Parent();
}
}
- 以下程序代码的输出结果为?(难)
答案:mqv
public class Test {
public static void test(){
try{
generateException();
System.out.print(“e”);
}catch(NumberFormatException ex){
System.out.print(“j”);
}finally{
System.out.print(“m”);
}
}
public static void generateException(){
throw new ArrayIndexOutOfBoundsException();
System.out.print(“h”); //语法错误
}
public static void main(String[] args) {
try{
test();
}catch(Exception ex){
System.out.print(“q”);
}finally{
System.out.print(“v”);
}
}
}
- forward 和redirect的区别(易)
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
- JNDI是什么?(难)
JNDI全称 Java Naming and Directory Interface。JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。
- 错误404,500分别表示什么?(中)
404,没有找到该页(没有找到资源)。500,内部错误。
- 数据库联接的几种方式?(中)
JAVA连接数据库的方式有多种。根据所需要的不同数据库驱动分,分为四种:
l 桥连(Bridge Connectivity):JDBC-ODBC桥的方式。但这种方式不适合程序的重用与维护,不推荐使用。需要数据库的ODBC驱动。
l 本地连接(Native Connectivity):JDBC+厂商API的形式。厂商API一般使用C编写,所以,这种方式也不长使用。
l 数据源连接(Datasource Connectivity):JDBC+厂商Database Connection Server+DataBase的形式。这种方法就是在JAVA 与 DATABASE之间价起了一台专门用与数据库连接的服务器(一般由数据库厂商提供)。在程序运行的外布环境中又称(Context)设置一个datasource数据源,有一个jndi 名称,程序只须查找此名称就可得到一个数据库连接的对象。他的好处在于能优化连接。
l 纯Java连接(Pure Java Connectivity):纯JDBC+DATABASE的连接方式。在程序中硬性编入数据库连接的所须参数。
- 抽象类和接口的区别?(中)
l abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
l 在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
l abstract class和interface所反映出的设计理念不同。其实abstract class表示的是”is-a”关系,interface表示的是”like-a”关系。
l 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
l 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
l 抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
l 接口中的方法默认都是 public,abstract 类型的。
- String s = new String(“abc”);是几个对象?(难)
如果在此语句之前没有用到”abc”,该语句会创建两个对象,”xyz”就是创造了一个String对象,然后调用的String类中的String(String)的构造方法创建的另外一个对象,”xyz”在全局数据区,s指向的对象在堆中。
如果语句如下:
String s1 = new String(“abc”); //创建二个对象
String s2 = new String(“abc”); //创建一个对象,并且以后每执行一次创建一个对象
- Sevlet的生命周期?(易)
Servlet 是一种可以在Servlet容器中运行的组件,那么理所当然就应该有一个从创建到销毁的过程,这个过程我们可以称之为Servlet生命周期。 Servlet的生命周期可以分为加载、实例化、初始化、处理客户请求和卸载五个阶段,体现在方法上主要是init()、service()和 destroy()三个方法。生命周期的具体说明如下:
Servlet容器完成加载Servlet类和实例化一个Servlet对象
init()方法完成初始化工作,该方法由Servlet容器调用完成
service()方法处理客户端请求,并返回响应结果
destroy()方法在Servlet容器卸载Servlet之前被调用,释放一些资源
- 简述TCP的3次握手建立连接(难)
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
l 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN: 同步序列编号(Synchronize Sequence Numbers)
l 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
l 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
- 数据库左连接和右连接的区别?(易)
左连接就是保留左边表的相关字段,如果右边表相关字段有不匹配的,以null填充之。 右连接就是保留右边表的相关字段,如果左边表相关字段有不匹配的,以null填充之
- 简述垃圾回收?(中)
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收
- 用任意语言写出一个堆栈的代码(中)
使用java.util.Stack可以直接创建堆栈对象,Stack 类描述了一个对象的后进先出(LIFO)堆栈,pop()方法删除栈顶的对象并把它作为该函数的值返回,push(Object)把一个对象压入栈顶。
用LinkedList也可以模拟堆栈实现:
public class Stack {
private LinkedList list = new LinkedList();
public void add(Object obj){
list.addLast(obj);
}
public Object get(){
return list.removeLast();
}
public static void main(String[] args){
Stack stack = new Stack();
stack.add(“1”);
stack.add(“2”);
System.out.println(stack.get());
}
}
- 用递归求出斐波那契数列的第30位数?(中)
public static long fib(int n) {
if (n == 1 || n==2) return 1;
else return fib(n-1) + fib(n-2);
}
调用fib(30)即可得到结果
- 写出一个函数实现将两个有序数组合并位一个有序数组(中)
void MergeArray(int [] pArray1, int nLen1, int [] pArray2, int nLen2, int [] pArray){
int i, j, n;
i = j = n = 0;
// 循环一直进行到拷贝完某一个数组的元素为止
while (i < nLen1 && j < nLen2) {
// 拷贝array1的元素
if (pArray1[i] < pArray2[j]) {
pArray[n++] = pArray1[i++];
}
// 拷贝array2的元素
else if (pArray1[i] > pArray2[j]) {
pArray[n++] = pArray2[j++];
}
// 相等的元素拷贝
else{
pArray[n++] = pArray2[j++];
++i;
}
}
// 如果array1已经被拷贝完毕就拷贝array2的元素
if (i == nLen1){
while (j < nLen2) pArray[n++] = pArray2[j++];
}
// 如果array2已经被拷贝完毕就拷贝array1的元素
else{
while (i < nLen1) pArray[n++] = pArray1[i++];
}
}
- 说出ArrayList,Vector, LinkedList的存储性能和特性(中)
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
- Collection 和 Collections的区别。(易)
Collection是集合类的上级接口,继承于它的接口主要有Set 和List。
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。