面试地点还在杏石口桥附近
以下是我面试的回顾
public static void main(String[] args) {
final String a="a";
final String b="b";
String c=a+b;
String d="ab";
System.out.println(c==d);
System.out.println(c.equals(d));
}
代码如上,考察的就是== equals的区别,简单说==是比较的引用,equals比较的是实际对象内容。
如果不加final的话结果是
false,true
上上final的话结果是
true(编译器在运行是进行的优化,因为"ab"不会变,指向它的应用也不会变) ,true
接着一个问题也是面试常问的关于拼写字符串的我直接写结论:
stringbuffer线程安全的
stringbuilder线程不安全的,效率会高一点
而在for循环中使用stringbuilder拼接等效于string拼接
最后让我写个冒泡排序,晕,出门看一下堆排和快排,竟然只考了个简单的。
package paixu;
public class MaoPao {
public void sort(int[] a){
for(int i=0;i<a.length;i++){
for(int j=i;j<a.length;j++){
if(a[i]>a[j]){
int tmp = a[i];
a[i] = a[j];
a[j] =tmp;
}
}
}
}
public static void main(String[] args){
MaoPao q = new MaoPao();
int[] a = { 49, 38, 65,12,45,5 };
q.sort(a);
for(int s :a){
System.out.print(s+" ");
}
}
}
第二个面试官,很亲和有木有,总是顺带说一句没关系,我就来顺带了解下你掌握的程度
也是先聊聊做的项目,后来扯到了软件工程方面的版本管理控制,持续集成
这个我还挺6,主要是被现在的工作折磨的,也看了几本这方面的书。
技术问题上:
java的异常集成关系如图所示:
其中粉红色的统称为checkedException,是需要捕获的,否则编译器不通过。
绿色部分看自己需求需要不需要捕获,jvm不强制检查。
然后让写程序,线程安全的stack和冒泡(你们是多喜欢冒泡啊),我说冒泡我刚写过了。
自己写了个拓展性非常不好的线程安全stack,回头看下jdk源码,如何实现。
问题:当被问到加了synchronized就一定线程安全吗,比如两个线程交替着调用pop和push会不会有问题。
当时的理解是有问题,以为锁的是方法。回来后搜了下,这样是对的,util.stack也是这样实现的。
当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。
对synchronize理解的还很浅,回头单独看下原理。
链接几个优质的synchronize分析
http://www.majin163.com/tag/synchronized%E5%8E%9F%E7%90%86/
http://blog.csdn.net/chen77716/article/details/6618779
package datastructure;
public class SafedStack {
private String[] elementArr;
private int elementCount=0;
public SafedStack(){
elementArr = new String[10];
}
public synchronized void push(String str){
elementArr[elementCount++]=str;
}
public synchronized String peek(){
return elementArr[elementCount-1];
}
public synchronized String pop(){
elementArr[elementCount--] = null;
print();
return peek();
}
public int size(){
return elementCount;
}
public void print(){
for(String str:this.elementArr){
System.out.println(str);
}
}
public static void main(String[] args){
SafedStack stack = new SafedStack();
System.out.println("size:"+stack.size());
stack.push("aa");
stack.push("bb");
stack.push("cc");
System.out.println("after push size:"+stack.size());
System.out.println("peek element:"+stack.peek());
stack.pop();
System.out.println("after pop size"+stack.size());
System.out.println("after pop peek element:"+stack.peek());
}
}
第三面是部门领导,当时他在开会,让我等一会,我听见他们在讨论主备设计的问题。
等了有半小时,感觉什么随和一个人,我在回答问题的时候是偶尔漂我一眼,多数时间是不看我,貌似我说什么他都是知道我要表达的。
还是先把做的项目描述一下,然后问了几个问题:职业的规划,项目中的收获,在设计的时候如何考虑稳定性,准确性;让我提问题。
面完之后他送我到他们班车,完事。
有点体会:
面试的时候手上有个纸和笔会好很多,稍微画画写写就有有思路。
有的问题没有思路或者说就没有见过的问题,就想办法吧问题沟通清楚,把自己理解的说出来,好的面试官会提醒引导你的,
不要说放弃或者不说话。有的时候这你可以理解为是一种压力测试。
跟面试官正常沟通就行,越放松发挥越好。
面试表现一般,hr给电话,薪水给开的很低,问愿不愿意,没有去(据说京东是13薪)