您的位置:首页 > 职场人生

java面试打击后归来深刻总结分析

2016-12-16 14:27 330 查看
1、String和StringBuffer问题:面试管:用String和操作符“+”来连接就可以了,干嘛还用StringBuffer? 我:懵……………………….

检讨:for Example:String result =”aaa” +”bbb” +”ccc”; vs String result = new StringBuffer.append(“aaa”).append(“bbb”).append(“ccc”).toString();

对于String类型,它是储存在内存常量区的,so不会被Gc,可以认为其一直存在,String类型的+操作每进行一次就会保存在常量区一次,但我们只需要执行完最后一次+操作的数值,所以浪费了很多内存;

对于StringBuffer来说,new一个后它是储存在堆内存上的,并且只有一个,append操作只操作这一个对象,将其toStirng()后则保存在常量区(只有一份储存),然后该StringBuffer对象被GC;

2、hashCode的作用:

hashCode仅用于HashMap、Hashtable及HashSet储存数据时识别不同对象时,当你自定义一个类时,需重写其equals()方法,最好一起重写hashCode()方法(万一该对象用于hash类型的储存呢?)

for example:

new一个类:如下,假如我仅对于该类相等的条件是两个Fujian对象的name相等,我完全可以只重写下边的equals()方法(Object默认的equals()对比的是两个对象的内存地址);但假如我要将两个new Fujian对象存到HashSet中去呢?如果不重写hashCode()方法,则默认为对象的内存地址对比,两个new出来的对象在内存中地址肯定不一样啦,不重写hashCode()的话则他们虽然equals(equals()方法被重写)但hashCode不一样啊,这样储存到HashSet中就成了两个不同的对象,想想也够矛盾的,两个对象equals但储存却是不同的对象,so重写equals方法也要重写hashCode方法

class Fujian{

String name= "linfujian";

int age;
public void setAge(int age){
this.age=age;

}
public int getAge(){
return age;
}
public String toString(){
return this.name;
}
public boolean equals(Object obj){
if(obj instanceof Fujian){
Fujian fujian = (Fujian)obj;
return (name.equals(fujian.name));
}
return super.equals(obj);
}

public int hashCode(){
return name.hashCode();
}

}


3、catch语句和finally语句同时存在return,哪一个起作用

public static void main(String[] args){
System.out.println(foo());
}

public static int foo(){
int result;
try {
result = 10;
result = result/0;
} catch (Exception e) {
System.out.println("Exception");
result = -1;
return result;
} finally {
result = 100;
System.out.println("it alaways do!");
return result;
}
}


只需掌握一点:finall语句总要执行,那么catch语句执行到renturn之前finall语句必须要执行,否则catch语句一renturn那么finally语句就没机会执行了,so当catch语句和finally语句同时存在return时catch语句执行到return前先去执行finally,finally里又有return,则catch中的return就没机会执行了。

答案就是:

Exception
it alaways do!
100
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: