`
aniu2008
  • 浏览: 42717 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

迅雷亲历面经:笔试+上机+面试(完整JAVA面试题求解大讨论)

阅读更多
迅雷面试回来,用了整整一下午(不知道怎么说了,其中等待时间都快2小时了),自己感觉笔试和上机还可以,但技术面谈这一关答得不太好,现在再次感觉互联网公司与一般软件公司的区别了,其中一点就是互联网应用在性能上要求很高,谈了一个小时大部分题目感觉都在谈论性能问题,自己在方面一直是弱项,汗啊:(

仔细回忆了一下整个面试过程的题目,记录下来,希望大家多多给点意见讨论下啊

一、笔试题:
A)JAVA基础多项选择题,比较简单,略

B)问答:
1)ajax原理、如何实现刷新数据及优点?
2)门面模式的解释、适用场合?
3)写6个linux常用命令?
4)SQL语句题,较简单

C)编程:
1)有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…
2)假如有字符串“6sabcsssfsfs33” ,用最有快速的方法去掉字符“ab3”,不能用java内置字符串方法(indeOf,substring,replaceAll等)?

二、上机题:
Java上机实现统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数?

三、面试题:
1、说说JVM原理?内存泄露与溢出区别,何时产生内存泄露?
2、用java怎么实现有每天有1亿条记录的DB存储?mysql上亿记录数据量的数据库如何设计?
3、mysql支持事务吗?DB存储引擎有哪些?
4、mvc原理,mvc模式的优缺点,如果让你设计你会怎么改造MVC?
5、hibernate支持集群吗?如何实现集群?
6、tomcat 最多支持并发多少用户?
7、map原理,它是如何快速查找key的?map与set区别?
8、描术算法,如何有效合并两个文件:一个是1亿条的用户基本信息,另一个是用户每天看电影连续剧等的记录,5000万条。内存只有1G???
9、在1亿条用户记录里,如何快速查询统计出看了5个电影以上的用户?
10、Spring如何实现IOC与AOP的,说出实现原理?

期待大家的探讨,共同提高,多谢
分享到:
评论
97 楼 suciudeman 2010-03-30  
NeighborWolf 写道
linyvlu 写道
		StringBuilder sb = new StringBuilder("6sabcsssfsfs33");
		sb.delete(2, 4);
		sb.delete(sb.length()-2, sb.length());

哈哈,看到你的帖子,我想到一个更简单的方法,人工识别:
StringBuilder sb = new StringBuilder("6sabcsssfsfs33");
//使用“眼睛”去掉ab3
System.out.println("6scsssfsfs");


显然可以证明,这样耗时最少,效率最高^_^


该答案得分1000分
96 楼 vjwz 2010-03-29  
pan_java 写道
8、描术算法,如何有效合并两个文件:一个是1亿条的用户基本信息,另一个是用户每天看电影连续剧等的记录,5000万条。内存只有1G???
9、在1亿条用户记录里,如何快速查询统计出看了5个电影以上的用户?

怎么处理????


问题8:
假设用户信息文件仅存在用户信息:
用户A:姓名,性别,生日,……
用户B:姓名,性别,生日,……
用户Z:姓名,性别,生日,……
用户D:姓名,性别,生日,……
……
看电影纪录仅存在“看过”电影的用户纪录,每次一条:
用户A:电影a
用户Z:电影c
用户A:电影d
……

处理思路:
1、用较简单的数据存储方式预处理5000万条用户看电影的记录,使每个用户最多仅生成一条记录,生成中间文件“TEMP”:
用户A:电影a,电影d
用户Z:电影c
……
2、将TEMP文件读入内存,此时数据量应小于5000万,极端情况下等于5000万,1G内存够用。再顺序读入1亿用户基本信息(顺序处理所占用的内存忽略不计),将当前读入的用户信息与内存中的TEMP数据进行匹配查找,查找结果存入合并文件。

仅思考了一下思路,这个思路下可以满足功能要求和内存限制,未过多考虑性能。性能方面考虑应着重在5000万数据的预处理以及第2步的匹配过程中。


问题9:如果是数据库,一个SQL语句可以满足功能要求,但基础数据量较大,估计无法满足性能要求,尤其是有一定并发的情况下。我们一般处理这样类似的需求时,一定有其他数据表专门存储。如建立一个表专门存储用户看电影的数量,每当生成一条用户看电影的日志数据时,这个表对应的数据条目+1,这样在需要的时候仅需要简单查询即可。实际操作时可通过触发器和存储过程自动处理。


95 楼 iooyoo 2010-03-25  
不能用java内置字符串方法(indeOf,substring,replaceAll等)

自己实现遍历统计就是了
94 楼 mercyblitz 2010-03-24  
linghongli 写道
aniu2008 写道
wfwkiss 写道
public class GoodCode{
	//假如有字符串“6sabcsssfsfs33” ,
	//用最有快速的方法去掉字符“ab3”,不能用java内置字符串方法(indeOf,substring,replaceAll等)? 
	
	public void isGood(){
		String str = "6sabcsssfsfs33";
		char c1 ='a';
		char c2 ='b';
		char c3 ='3';
		
		char[] c = str.toCharArray();
		StringBuilder sl = new StringBuilder();
		for(char temp:c){
			if(temp != c1 && temp !=c2 && temp !=c3)
				sl.append(temp);
		}
		
		System.out.println(sl.toString());
		
	}
	
	public static void main(String[] args){
		GoodCode g = new GoodCode();
		g.isGood();
	}
}



这是种好方法,呵呵 

我想没那么简单,如果真的是这样,只要会java的基本上都能写出来,何况是工作了几年的lz呢



你想复杂了,JDK是专家写的,这些东西别人已经考虑到了~
93 楼 linghongli 2010-03-24  
aniu2008 写道
wfwkiss 写道
public class GoodCode{
	//假如有字符串“6sabcsssfsfs33” ,
	//用最有快速的方法去掉字符“ab3”,不能用java内置字符串方法(indeOf,substring,replaceAll等)? 
	
	public void isGood(){
		String str = "6sabcsssfsfs33";
		char c1 ='a';
		char c2 ='b';
		char c3 ='3';
		
		char[] c = str.toCharArray();
		StringBuilder sl = new StringBuilder();
		for(char temp:c){
			if(temp != c1 && temp !=c2 && temp !=c3)
				sl.append(temp);
		}
		
		System.out.println(sl.toString());
		
	}
	
	public static void main(String[] args){
		GoodCode g = new GoodCode();
		g.isGood();
	}
}



这是种好方法,呵呵 

我想没那么简单,如果真的是这样,只要会java的基本上都能写出来,何况是工作了几年的lz呢
92 楼 kingwolf543 2010-03-24  
package com.jar.test.package1;

public class Worker implements Runnable {

/**
* @author ZHAOXIAOMING993
*
*/

static int count = 0;

static Object lock = new Object();

int index;

    int pCount;

public Worker(int index) {
this.index = index;
}

public void run() {
synchronized (lock) {
for (;;) {
if (count % 3 == index) {
System.out.print(Thread.currentThread().getName());
count++;
pCount++;
lock.notifyAll();
if (pCount == 10){
break;
}
} else {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

/**
* @param args
*/
public static void main(String[] args) {
new Thread(new Worker(0), "A").start();
new Thread(new Worker(1), "B").start();
new Thread(new Worker(2), "C").start();
}
}

91 楼 mercyblitz 2010-03-24  
<div class="quote_title">aniu2008 写道</div>
<div class="quote_div">
<div class="quote_title">cranehovers 写道</div>
<div class="quote_div">
<div class="quote_title">aniu2008 写道</div>
<div class="quote_div">
<div class="quote_title">diaodou 写道</div>
<div class="quote_div">C 2) 可以用这个简单方法。<br>上机题是一样的方法,开个256的数组,count[256],表示每个字母,数字等的出现次数。<br>class Remove{ <br> public static void main(String args[]) { <br>  String str="6sabcsssfsfs33; <br>    boolean removeChars[256] = {true};<br>    removeChars['a'] = false;<br>    removeChars['b'] = false;<br>    removeChars['3'] = false;<br>  StringBuffer sb = new StringBuffer();<br>    for (char ch: str) {<br>        if (!removeChars[ch]) sb.append(ch);<br>    }<br>    String result = sb.toString();<br> } <br>}</div>
<br><br>高人啊,应该就是这个方法了<img src="/images/smiles/icon_idea.gif" alt="">
</div>
<p> </p>
<p>太强了 我看了好久才看懂  看来菜鸟和大牛区别就是不同……</p>
</div>
<br>哇,这个方法,确实好,效率还高,真是另类高人:)</div>
<p> </p>
<p> </p>
<p>AbstractStringBuilder#replace就可以的</p>
<p> </p>
90 楼 mercyblitz 2010-03-24  
ppm10103 写道
ckn126 写道
看来我是要多学一点性能上的东西在去面试这样的公司比较可能性大一点

在1亿条用户记录里,如何快速查询统计出看了5个电影以上的用户?
----可以参考 位图索引的原理


关键是表很大,索引也无能为力。

策略性分表是一个方法。大表化小或化区


89 楼 zhangdp_neu 2010-03-24  
解一下这个吧
有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…



package ThreadTest;

import java.util.concurrent.Semaphore;

/**
 * 
 * @author zhangdepeng318@gmail.com
 * 
 */
public class TestOderThread {

	private static Semaphore semaphore1 = new Semaphore(0);
	private static Semaphore semaphore2 = new Semaphore(0);
	private static Semaphore semaphore3 = new Semaphore(0);
	public Thread t1;
	public Thread t2;
	public Thread t3;
	public volatile boolean x1 = true, x2 = true, x3 = true;

	public TestOderThread() {
		t1 = new Thread() {
			public void run() {
				try {
					semaphore1.acquire();// 必须先获得 锁才可以继续,要等release释放的。
					System.out.print("B");
					semaphore2.release();
					semaphore3.acquire();
					x1 = false;
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		t2 = new Thread() {
			public void run() {
				System.out.print("A");
				semaphore1.release();
				x2 = false;
			}
		};
		t3 = new Thread() {
			public void run() {
				try {
					semaphore2.acquire();
					System.out.print("C");
					semaphore3.release();
					x3 = false;
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};

	}

	public void run() {
		t1.start();
		t2.start();
		t3.start();
	}

	public static void main(String args[]) {
		TestOderThread t = new TestOderThread();
		for (int i = 0; i < 10; i++) {
			t = new TestOderThread();
			t.run();
			//如果有一个为真 的话 就代表没有全部完成。
			//采用繁忙等待模式
			while (t.x1 || t.x2 || t.x3) {
				if (!t.x1&&!t.x2&&!t.x3) {
					//代表全部完成
					//System.out.println();
				    break;
				}else{
					//break;
				}
			}
		}
	}
}




输出:ABCABCABCABCABCABCABCABCABCABC
88 楼 hellojinjie 2010-02-14  
用信号量实现的,,,

class MyWorker implements Runnable {

	private static Semaphore[] semaphores = { new Semaphore(1),
			new Semaphore(0), new Semaphore(0) };

	private int index = 0;
	private int count = 0;

	public MyWorker(int index) {
		this.index = index;
	}

	public static void main(String[] args) {
		new Thread(new MyWorker(0), "A").start();
		new Thread(new MyWorker(1), "B").start();
		new Thread(new MyWorker(2), "C").start();
	}

	public void run() {
		for (;;) {
			try {
				semaphores[index].acquire();
				System.out.println(Thread.currentThread().getName());
				count++;
				semaphores[(index + 1) % 3].release();
				if (count >= 10)
					break;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
87 楼 ppm10103 2010-02-12  
ckn126 写道
看来我是要多学一点性能上的东西在去面试这样的公司比较可能性大一点

在1亿条用户记录里,如何快速查询统计出看了5个电影以上的用户?
----可以参考 位图索引的原理
86 楼 ckn126 2010-01-12  
看来我是要多学一点性能上的东西在去面试这样的公司比较可能性大一点
85 楼 gdufsbobo 2010-01-11  
哗,面试题很有深度,很多我都不会答。
84 楼 zhangguofeng 2009-12-29  
giginet 写道
一般拒绝笔试的很多都是技术比较牛但理论基础比较差的,很多工作久的人都会有这种感觉。毕竟实际动手能力最重要,虽然理论也是必不可少的。

另外,想想一把年纪还要参加笔试,不能不说是技术人员的悲哀~~~想想都很窝火的,但又很无可奈何。

深有同感.
83 楼 NeighborWolf 2009-12-25  
linyvlu 写道
		StringBuilder sb = new StringBuilder("6sabcsssfsfs33");
		sb.delete(2, 4);
		sb.delete(sb.length()-2, sb.length());

哈哈,看到你的帖子,我想到一个更简单的方法,人工识别:
StringBuilder sb = new StringBuilder("6sabcsssfsfs33");
//使用“眼睛”去掉ab3
System.out.println("6scsssfsfs");


显然可以证明,这样耗时最少,效率最高^_^
82 楼 egmacross 2009-12-16  
test1中把hash数组取出去,没必要每次都建立,要不然就没意义了。   


public static boolean[] removeChars;

    public Test()
    {
        removeChars = new boolean[256];
        removeChars['a'] = true;
        removeChars['b'] = true;
        removeChars['3'] = true;
    }
public void test1()
    {
        char[] chars = "6sabcsssfsfs33".toCharArray();

        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < chars.length; i++)
        {
            if (!removeChars[chars[i]])
            {
                sb.append(chars[i]);
            }
        }
    }

再试试
81 楼 wavesun 2009-12-15  
import java.util.Arrays;
import java.util.Date;
import java.util.regex.*;
public class DTest {  
	public void test1(){
		char[] chars="6sabcsssfsfs33".toCharArray();
		boolean[] removeChars = new boolean[256];  
		removeChars['a'] = true;  
		removeChars['b'] = true;  
		removeChars['3'] = true;  
		StringBuffer sb = new StringBuffer();  
		for (int i = 0; i < chars.length; i++) {  
			if (!removeChars[chars[i]]) {
				sb.append(chars[i]);  
			}
		}    
		//System.out.println(sb.toString());  
	}
	public void test2(){
		char[] chars="6sabcsssfsfs33".toCharArray();
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<chars.length;i++){
			if(chars[i]=='a'||chars[i]=='b'||chars[i]=='3'){
				continue;
			}
			sb.append(chars[i]);
		}
		//System.out.println(sb.toString());  
	}
	public void test3(){
		String regx="[^a|b|3]";  
    	String temp="6sabcsssfsfs33";  
    	Pattern p=Pattern.compile(regx);  
    	Matcher m=p.matcher(temp);  
    	StringBuffer sb=new StringBuffer();
    	while(m.find())  {
    		sb.append(m.group());
    	}
     	//System.out.print(sb); 
	}
	public static void main(String args[]) {   
		DTest dt=new DTest();
		Date now1=new Date();
		for(int i=0;i<100000;i++){
			dt.test1();
		}
		Date now2=new Date();
		System.out.println(now2.getTime()+"-"+now1.getTime()+",共用:"+(now2.getTime()-now1.getTime()));
		Date now3=new Date();
		for(int i=0;i<100000;i++){
			dt.test2();
		}
		Date now4=new Date();
		System.out.println(now4.getTime()+"-"+now3.getTime()+",共用:"+(now4.getTime()-now3.getTime()));
		
		Date now5=new Date();
		for(int i=0;i<100000;i++){
			dt.test3();
		}
		Date now6=new Date();
		System.out.println(now6.getTime()+"-"+now5.getTime()+",共用:"+(now6.getTime()-now5.getTime()));
		
	}   
}  

用事实说话,test2小胜
80 楼 piao16702155 2009-12-07  
diaodou 写道
jupiterpan 写道
piao16702155 写道
不解


boolean removeChars[256] = {true}; 创建数组可以加数字吗

for (char ch: str) // 里面是数组名吧


楼主估计在逗他们玩呢, String在JAVA里不能直接用作char数组~ 不能这么遍历~



唉,那个代码是随手写的,重要的是思想,我把调试好的代码贴一下吧:
public class Test {
	public static void main(String args[]) { 
		String str="6sabcsssfsfs33";
		boolean[] removeChars = new boolean[256];
		Arrays.fill(removeChars, false);
		removeChars['a'] = true;
		removeChars['b'] = true;
		removeChars['3'] = true;
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < str.length(); i++) {
			char ch = str.charAt(i);
		    if (!removeChars[ch]) sb.append(ch);
		}
		String result = sb.toString();
		System.out.println(result);
	} 
}



思想看懂了。只是刚接触java。有点教条
79 楼 zwq4166506 2009-12-07  
mooninday 写道
不知道循环打印ABCABC那题怎解呀?
请LZ谈谈吧

用线程同步
78 楼 controlz 2009-12-07  
2)假如有字符串“6sabcsssfsfs33” ,用最有快速的方法去掉字符“ab3”,不能用java内置字符串方法(indeOf,substring,replaceAll等)?

------------------------------------------------------------------
String value = "6sab3csssfsfs33";
        StringBuffer buffer = new StringBuffer();
        for(int i=0;i<value.length();i++){
            char c = value.charAt(i);
            if(c=='a'){
                if(value.charAt(i+1)=='b'){
                    if(value.charAt(i+2)=='3'){
                        i+=2;
                        continue;
                    }
                }
            }
            buffer.append(c);
        }
        System.out.println(buffer.toString());

相关推荐

Global site tag (gtag.js) - Google Analytics