前段时间准备面试时,遇到的一些常问问题总结
1.Switch 语句能否作用于byte,long,String?
byte可以,long,String不可以,因为switch 的判断条件可以接受int,byte,char,short,不接受其他类型
2.给出输出结果
int testNum = 1;
switch(testNum ){
case 1:
System.out.println('A');
case 2:
System.out.println('B');
case 3:
System.out.println('C');
}
结果应该为:
A
B
C
原因:switch语句中,一旦case匹配,则顺序执行后边的程序代码(即绿色部分),而不管caes是否匹配,直至遇到break为止。所以,如果只想输出‘A’,则需要在第一个分支执行程序代码段中加break
3.final,finally,finalize的区别
final—修饰符(关键字)。
a.如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
b.若修饰变量,须在声明时给定初值,只能被读取
c.修饰方法,该方法只能被使用,不能被重载
finally—在异常处理时提供finally块来执行任何清除操作
finalize—方法名
Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,很少使用。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的
4. 原始数据类型
int,byte,long,short,float,double,boolean,char,一共8种
int 4个字节
byte 1字节 -2^7 ~ 2^7
short 4字节
long 8字节
float 4字节
double 8字节
char 2字节
boolean 1位
5. 常见的集合类型
ArrayList,LinkedList,Vector,HashMap,HashSet,HashTable
HashMap与ArrayList,异步效率高;
Vector和HashTable 线程同步。
性能上,ArrayList和HashMap分别比Vector和HashTable要好。
基于Array的List(Vector,ArrayList) 适合查询,而LinkedList适合添加,删除操作;
5.1 Arraylist与Vector的区别:
同步性:Vector线程安全,ArrayList线程不安全
数据增长: Vector默认增长为原来的一倍,ArrayList增长是原来的一半
5.2 HashMap与HashTable区别:
同步性:HashTable线程安全,HashMap线程不安全
值:HashMap允许空值作为Key或value
5.3 怎么理解Vector的线程同步?
6. 浮点数比较相等
abs(a/b - 1) < epsilon”:将它们差的绝对值同一些预先定义的小正数进行比较,测试它们是否 足够相近。计算机表示浮点数有精度限制,对于超出精度限制的浮点数,计算机会把超出精度限制的小数点位舍弃掉,进行四舍五入。
7.String,StringBuffer,StringBuilder的区别
String为字符串常量,final类,不可变;
StringBuffer,StringBuffer为字符串变量,用来存储可变字符串,其中StringBuffer线程安全,StringBuilder非线程安全。
一般情况下,存储效率 StringBuilder>StringBuffer>String
但个别情况下,String速度 > StringBuffer
eg: String s1= "This is a simple"+" String"+" test case";
StringBuffer sb = new StringBuffer().append("This is a ").append(" simple string ").append(" test case ");
8. hashCode()和equals()方法
9.怎样给servlet做单元测试(大概了解)
使用Junit中的HttpUnit
使用mock对象
10.浅复制和深复制
浅复制:实现 Cloneable 接口,重写Object的clone方法,返回 super.clone()
Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始 对象的内容一一复制到新对象的存储空间中。
深层复制:深复制把要复制的对象所引用的对象都复制了一遍。新科隆对象的引用值改变不影响原对象的引用值。
实现方式一:原有对象类型和引用对象类型都要实现Cloneable,并分别重写clone(),比较繁琐
实现方式二:利用串行化来做深复制,将对象写到流里,再把它读出来
11.IO
字节流(8位)
字节输入流:InputStream read() 读取文本内容
字节输出流:OutputStream write(" .....") 将数据写入文本中
FileInputStream 和FileOutputStream读写文本文件
字符流(16位)主要用来读写字符串数据
字符输入流:Reader 文件读出(FileReader,InputStreamReader,BufferedReader)
InputStreamReader:将一个InputStream转换成Reader,是字节转换成字符的桥梁
常用方法: BufferedReader的readLine() ,close()
字符输出流:Writer 文件的写入(FileWriter,OutputStreamWriter,PrintWriter)
OutputStreamWriter:将一个OutputStream转换成Writer
常用方法: BufferedWriter的write("") , bw.flush() ,close()
12. 堆(heap)与栈(stack)