面試日記——阿里巴巴JAVA面試
阿里的面試是最緊張的一場,也是最考驗技術的一場。
沒想到阿里的面試通知現在才收到,可以說是遲來的愛吧。
面試的遠端面試,需要共用案頭,線上編程。
到官網上排隊,排了1個多小時,總算排到了。
面試我的是一個很年輕的阿里小哥,是架構事業部的。
他主要問我以下幾個問題(為了共同的進步,我把答案也寫在問題下面,僅供參考) 1. jvm模型
http://www.cnblogs.com/AloneSword/p/4262255.html 2. 類載入器
http://blog.csdn.net/gjanyanlig/article/details/6818655/ 3. 記憶體回收分類
http://www.cnblogs.com/davenkin/p/java-garbage-collection.html 4. 查看記憶體回收的命令
http://www.cnblogs.com/wozixiaoyao/p/5658952.html 5. 線程同步的多種方式
http://blog.csdn.net/cengjingyige/article/details/52382300 6. Lucene的底層實現
http://blog.csdn.net/njpjsoftdev/article/details/54015485 7. 資料庫MyISAM和InnoDB索引的儲存方式
http://www.cnblogs.com/renzherushe/p/4780226.html 8. redis的使用情境
http://blog.jobbole.com/88383/ 9. redis如何清除到期資料
http://www.cnblogs.com/zhangchao-letv/articles/6119313.html 10. redis的主機選舉機制
http://www.tuicool.com/articles/yiEnUj 11. Treepmap和HsahMap的區別,底層實現
http://www.chinaitlab.com/Java/base/962510.html 12. JavaWeb中Filter使用的是哪種設計模式
過濾器模式
http://www.runoob.com/design-pattern/filter-pattern.html 13. IO包的輸入輸出資料流使用哪種設計模式
http://www.cnblogs.com/wxgblogs/p/5649933.html 14. 內部類用哪種方式可以擷取
http://blog.csdn.net/qq_32198277/article/details/72593825 15. 編程實現裝飾器模式
http://www.runoob.com/design-pattern/decorator-pattern.html 16. 編程實現菜單層級(最多三層)
當時沒做出來,現在用最簡單的方式來實現
思路是用map來記錄選過的,用兩個list來記錄上次選剩下的和沒有選的(其實可以用一個List加迭代器就行)
因為最多三層,所以最多用3個for迴圈就好
import java.util.*;public class Main { class Menu{ private int id; private String name; private int pId; public Menu(int id, String name, int pId) { this.id = id; this.name = name; this.pId = pId; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getpId() { return pId; } public void setpId(int pId) { this.pId = pId; } } class Result{ private Menu menu; private List<Result>menus=new ArrayList<>(); public Menu getMenu() { return menu; } public void setMenu(Menu menu) { this.menu = menu; } public List<Result> getMenus() { return menus; } public void setMenus(List<Result> menus) { this.menus = menus; } } public void test(){ List<Menu> menuList=new ArrayList<>(); Menu menu1=new Menu(1,"1",0); Menu menu2=new Menu(2,"2",1); Menu menu3=new Menu(4,"4",1); Menu menu4=new Menu(3,"3",2); Menu menu5=new Menu(5,"5",2); Menu menu6=new Menu(6,"6",2); menuList.add(menu4); menuList.add(menu1); menuList.add(menu2); menuList.add(menu3); menuList.add(menu5); menuList.add(menu6); List<Menu> menuList2=new ArrayList<>(menuList); Map<Integer,Result> resultMap=new HashMap<Integer,Result>(); List<Result>results=new ArrayList<Result>(); //先找第一層的 for (Menu menu:menuList){ if (menu.getpId()==0){ Result result=new Result(); result.setMenu(menu); //放進map,表示已經被選過 resultMap.put(menu.getId(),result); results.add(result); //移除選過的 menuList2.remove(menu); } } //menuList和menuList2身份互換 menuList.clear(); menuList.addAll(menuList2); //掃描找到第二層或第三層的 for (Menu menu:menuList2){ Result result=resultMap.get(menu.getpId()); if (result!=null){ Result result1=new Result(); result1.setMenu(menu); resultMap.put(menu.getId(),result1); result.getMenus().add(result1); menuList.remove(menu); } } //menuList和menuList2身份互換 //掃描找到第三層剩下的 for (Menu menu:menuList){ Result result=resultMap.get(menu.getpId()); if (result!=null){ Result result1=new Result(); result1.setMenu(menu); result.getMenus().add(result1); resultMap.put(menu.getId(),result1); } } } public static void main(String[] args) { Main main=new Main(); main.test(); }} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104