面试题讲评
2011年03月14日
面试了几家公司,只有这一两公司的面试题有点水平.且听我一一讲评:
a. 在java中导入一个包,会导入这个包的所有类及其嵌套包的所有类,这个说话正确吗?
错误 前半句"会导入这个包的所有类"是正确的,但是不能导入其嵌套包的所有类,如event包在awt包中,我们在做applet程序时要同时import java.awt.*;和import java.awt.event.*;
b. String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); String s4 = new String("Hello");为什么s1 == s2为true,而s3 == s4为false呢?
(我记得这个题目应该跟别人讲过哦!)因为s1和s2是定义在String pool中的两个常量,两者的内存地址相同;而new出来的对象是在heap堆中开辟一块内存空间,如:s3和s4就是在heap堆中开辟了两块不同的内存空间后,分别让s3和s4指向它们,两者的内存地址不相同.而==比较符又是比较左右两个变量的内存地址是否相等,所以会有以上结果!
c. double a = 1.1; double b = 110/100;为什么a与b不相等?
这个很简单哦,因为110/100逻辑运算中,两个参数都是int型,得出的结果也是int型.然后转换成double型,在结果的小数点后面补0所以b的结果是1.0,与1.1不相等.
d. SQL Server可以应用与Linux平台吗?
不能(这也是Oracle与SQL Server的一大区别)
e. 为什么捕捉多个异常的时候,Exception的捕捉只能放在最后?
因为Exception是所有异常的父类,如果定义了多个catch语句,而将Exception的捕捉放在前面或中间.一旦发生异常时,总是会进入到Exception的捕捉块中进行处理,而导致后面的catch语句无法运行,从而编译出错,所以Exception的捕捉总是放在最后面的.
一个实战例子(在main方法中定义):
try {
String s = null;
System.out.println(s.length());
}catch(Exception e){
e.printStackTrace();
}catch(NullPointerException e) { // 代码总是不被执行!
e.printStackTrace();
}
f. Integer a = 100;Integer b = 200;System.out.println((a+b));此处的+是不是像c或c++中重载了连接符+呢?如果不是,那java是怎么做到的?
不是 java是利用装拆箱来进行操作的,在jdk1.6中java提供了自动装箱和拆箱的操作,a+b在进行操作时,已经被自动转换成int型(手动拆箱: Integer.parseInt(int number)),从而进行整型的加法逻辑运算.
g. 在进行大数据量地改变字符串时,为什么使用StringBuffer和StringBuilder,而不使用String?
因为String提供了不可变的字符序列而StringBuffer(或StringBuilder)提供了可变的字符序列,在进行大数据量改变字符串时,StringBuffer(或StringBuilder)可以直接进行操作,而String必须在每次操作后要创建一个新的String对象进行接收,浪费内存空间;其次,StringBuffer(或Stringbuider)提供的append方法比String的+连接符具有更高的效率,更加适合字符串的拼接操作
h. 从控制台输入一个字符串,并且反转输出:
import java.util.*;
public class ReverseInput {
static String input;
static StringBuffer output;
public static void main(String[] args) {
System.out.println("请输入一个字符串: "); // 如:输入"我爱牛奶"
Scanner s = new Scanner(System.in);
input = s.next();
output = reverseStr(input);
System.out.println("反转后的结果是: " + output); // 细心的朋友可能发现,output是一个StringBuffer类型,但它可以与一个字符串进行拼接操作
}
public static StringBuffer reverseStr(String input) {
return (new StringBuffer(input)).reverse();
}
}
i. 从控制台接收一个字符串,进行parseInt操作,捕捉NumberFormatException,并且定义一个异常,判断数字是否在[0,100]范围内.如果不在,抛出异常,否则判断是否大于60,进行输出.
import java.io.*;
import java.util.*;
public class DefinedException {
public static void main(String[] args) {
int score = 0;
System.out.print("请输入一个分数: ");
Scanner s = new Scanner(System.in);
String str = s.next();
try {
score = Integer.parseInt(str);
} catch (NumberFormatException e) {
System.err.println("您输入的不是一个数字!"); // System.err与System.out的区别在于:体现在MyEclipse上,前者是以红色警告字体进行输出,后者以黑色普通字体进行输出
System.exit(-1); // 退出JVM
}
try {
if (score 100) {
throw(new NotInAreaException("您输入的数字不在0-100的范围内!"));
} else {
System.out.println( (score > 60 ? "恭喜您,及格了!" : "对不起,没有及格!"));
}
} catch (NotInAreaException e) {
System.err.println("错误!" + e.getMessage());
}
}
}
class NotInAreaException extends Exception{
public NotInAreaException(String msg) {
super(msg);
}
}
j. 编写一个方法,接受一个int数组,并且可以输出数组的最大值、最小值和平均值
import java.util.*;
public class TakeOutput {
public static void main(String[] args) {
output(new int[]{1, 5, 7, 4, 3});
}
public static void output(int[] arr) {
// Arrays.sort(arr);
/**
// BubblingSort(冒泡排序写法)
int temp = 0;
for (int i = 0;i arr[j+i]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
*/
System.out.print(" min = " + arr[0] + "\n max = " + arr[arr.length-1] + "\n");
int sum = 0;
for (int element : arr) {
sum += element;
}
System.out.print("avg = " + (sum/arr.length));
}
}
k. 一张表book包含字段press(出版社) name(图书名称) price(价格)查询各个出版社的图书的平均价格.
select distinct a.press, avg_price = (select avg(price) from book b where a.press = b.press) from book a order by a.press
l. 这道题目是关于一个图形化讲解的深复制,要你写出这个程序深复制的代码来.很遗憾,我没有做出来,这儿我就不说了,大家有兴趣的可以去网上查查!
2011年03月14日
面试了几家公司,只有这一两公司的面试题有点水平.且听我一一讲评:
a. 在java中导入一个包,会导入这个包的所有类及其嵌套包的所有类,这个说话正确吗?
错误 前半句"会导入这个包的所有类"是正确的,但是不能导入其嵌套包的所有类,如event包在awt包中,我们在做applet程序时要同时import java.awt.*;和import java.awt.event.*;
b. String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); String s4 = new String("Hello");为什么s1 == s2为true,而s3 == s4为false呢?
(我记得这个题目应该跟别人讲过哦!)因为s1和s2是定义在String pool中的两个常量,两者的内存地址相同;而new出来的对象是在heap堆中开辟一块内存空间,如:s3和s4就是在heap堆中开辟了两块不同的内存空间后,分别让s3和s4指向它们,两者的内存地址不相同.而==比较符又是比较左右两个变量的内存地址是否相等,所以会有以上结果!
c. double a = 1.1; double b = 110/100;为什么a与b不相等?
这个很简单哦,因为110/100逻辑运算中,两个参数都是int型,得出的结果也是int型.然后转换成double型,在结果的小数点后面补0所以b的结果是1.0,与1.1不相等.
d. SQL Server可以应用与Linux平台吗?
不能(这也是Oracle与SQL Server的一大区别)
e. 为什么捕捉多个异常的时候,Exception的捕捉只能放在最后?
因为Exception是所有异常的父类,如果定义了多个catch语句,而将Exception的捕捉放在前面或中间.一旦发生异常时,总是会进入到Exception的捕捉块中进行处理,而导致后面的catch语句无法运行,从而编译出错,所以Exception的捕捉总是放在最后面的.
一个实战例子(在main方法中定义):
try {
String s = null;
System.out.println(s.length());
}catch(Exception e){
e.printStackTrace();
}catch(NullPointerException e) { // 代码总是不被执行!
e.printStackTrace();
}
f. Integer a = 100;Integer b = 200;System.out.println((a+b));此处的+是不是像c或c++中重载了连接符+呢?如果不是,那java是怎么做到的?
不是 java是利用装拆箱来进行操作的,在jdk1.6中java提供了自动装箱和拆箱的操作,a+b在进行操作时,已经被自动转换成int型(手动拆箱: Integer.parseInt(int number)),从而进行整型的加法逻辑运算.
g. 在进行大数据量地改变字符串时,为什么使用StringBuffer和StringBuilder,而不使用String?
因为String提供了不可变的字符序列而StringBuffer(或StringBuilder)提供了可变的字符序列,在进行大数据量改变字符串时,StringBuffer(或StringBuilder)可以直接进行操作,而String必须在每次操作后要创建一个新的String对象进行接收,浪费内存空间;其次,StringBuffer(或Stringbuider)提供的append方法比String的+连接符具有更高的效率,更加适合字符串的拼接操作
h. 从控制台输入一个字符串,并且反转输出:
import java.util.*;
public class ReverseInput {
static String input;
static StringBuffer output;
public static void main(String[] args) {
System.out.println("请输入一个字符串: "); // 如:输入"我爱牛奶"
Scanner s = new Scanner(System.in);
input = s.next();
output = reverseStr(input);
System.out.println("反转后的结果是: " + output); // 细心的朋友可能发现,output是一个StringBuffer类型,但它可以与一个字符串进行拼接操作
}
public static StringBuffer reverseStr(String input) {
return (new StringBuffer(input)).reverse();
}
}
i. 从控制台接收一个字符串,进行parseInt操作,捕捉NumberFormatException,并且定义一个异常,判断数字是否在[0,100]范围内.如果不在,抛出异常,否则判断是否大于60,进行输出.
import java.io.*;
import java.util.*;
public class DefinedException {
public static void main(String[] args) {
int score = 0;
System.out.print("请输入一个分数: ");
Scanner s = new Scanner(System.in);
String str = s.next();
try {
score = Integer.parseInt(str);
} catch (NumberFormatException e) {
System.err.println("您输入的不是一个数字!"); // System.err与System.out的区别在于:体现在MyEclipse上,前者是以红色警告字体进行输出,后者以黑色普通字体进行输出
System.exit(-1); // 退出JVM
}
try {
if (score 100) {
throw(new NotInAreaException("您输入的数字不在0-100的范围内!"));
} else {
System.out.println( (score > 60 ? "恭喜您,及格了!" : "对不起,没有及格!"));
}
} catch (NotInAreaException e) {
System.err.println("错误!" + e.getMessage());
}
}
}
class NotInAreaException extends Exception{
public NotInAreaException(String msg) {
super(msg);
}
}
j. 编写一个方法,接受一个int数组,并且可以输出数组的最大值、最小值和平均值
import java.util.*;
public class TakeOutput {
public static void main(String[] args) {
output(new int[]{1, 5, 7, 4, 3});
}
public static void output(int[] arr) {
// Arrays.sort(arr);
/**
// BubblingSort(冒泡排序写法)
int temp = 0;
for (int i = 0;i arr[j+i]) {
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
*/
System.out.print(" min = " + arr[0] + "\n max = " + arr[arr.length-1] + "\n");
int sum = 0;
for (int element : arr) {
sum += element;
}
System.out.print("avg = " + (sum/arr.length));
}
}
k. 一张表book包含字段press(出版社) name(图书名称) price(价格)查询各个出版社的图书的平均价格.
select distinct a.press, avg_price = (select avg(price) from book b where a.press = b.press) from book a order by a.press
l. 这道题目是关于一个图形化讲解的深复制,要你写出这个程序深复制的代码来.很遗憾,我没有做出来,这儿我就不说了,大家有兴趣的可以去网上查查!