几道不错的面试题目,遇到一个写一个吧。
1、先来一个关于值传递和引用传递的例题吧。
public class MyClass { static void aMethod(StringBuffer sf1, StringBuffer sf2) { sf1.append(sf2); sf2 = sf1; } public static void main(String[] args){ StringBuffer sf1 = new StringBuffer("A"); StringBuffer sf2 = new StringBuffer("B"); aMethod(sf1,sf2); System.out .println(sf1+ ":"+sf2); } }
不了解这块的可以自己先做一下在去看答案。
解答:AB:B
聊一下这个值传递和应用传递吧。
值传递:也就是说形参类型是基本数据类型。这些在传递的过程中传递的是那个变量的值。比如
addNum(int a){
a++;
}
如果在main函数中定义一个变量
main(){
int a = 0;
addNum(a);
sysout(a);
}输出结果会是1.
引用传递:无非说的就是形参的数据类型是引用型。其实传递的是变量对应的内存地址。
上述编程题目中使用的是stringBuffer就是引用传递。将是sf1和sf2传到aMethod中。在函数中sf1.append(sf2).其实内存地址中的数据已经改变了。而sf2 = sf1,只是将sf2指向了sf1指向的地址。然后函数结束,回到main中。
这里要注意的是形参中的sf1和sf2与main中的sf1与sf2不是一个,这里是一个陷阱。如果不想被迷惑可以改变一下那个函数的写法,会更加清晰。
static void aMethod(StringBuffer para1, StringBuffer para2) { para1.append(para2); para2= para1; }
这个时候回到main中sf1指向的地址是变化后的也就是ab
sf2指向的地址仍然是b。无变化。
2、写一程序将”张三”, “李四”, “王五” 按汉字拼音首字母排序
public class InterviewThree { public static void main(String[] args) { String [] strs = {"张三","李四","王五"}; Comparator c = Collator.getInstance(Locale.CHINA); //升序 Arrays.sort(strs,c); for(int i=0;i<strs.length;i++){ System.out.println(strs[i]); } } }