作为一个java后端老鸟,跌打滚爬多次被面试和面试别人,总结了一些经验,希望对大家有所帮助。文末有整理好的面试文件,可以免费获取。
特别说明,仅仅针对工作两年以上的java后端开发。以开发性题目为主。 假设1亿整数存放在一个txt文件中,如何去重和排序? 思路: 1.面试者要评估一下一亿整数的大小。一个int占4个字节,1亿呢? 2.去重的数据结构有哪些?HashSet--->引申到HashMap--->ConcurrentHashMap 3.数据量增大到十亿百亿怎么去重? 布隆过滤器,优点,缺点 4.其他方式? 数据库distinct order by,txt怎么导入到数据库?load redis去重排序,redis的数据结构-->引申到其他数据结构 String,list,hash,set,sorted set,hyperloglog,geo mongo去重排序, .... 斐波那契数列(fabnacci)实现,首先介绍一下该算法的思想
1.第一级别实现: 两层递归 public static long fibonacci(int n){ if(n==0) return 0; else if(n==1) return 1; else return fibonacci(n-1)+fibonacci(n-2); } 问算法复杂度及评估一下性能问题,提示可以优化。 2.第二级别:减少一层递归 public static void main(String[] args) { long tmp=0; // TODO Auto-generated method stub int n=10; Long start=System.currentTimeMillis(); for(int i=0;i<n;i++){< p=""> System.out.print(fibonacci(i)+" "); } System.out.println("-------------------------"); System.out.println("耗时:"+(System.currentTimeMillis()-start)); } public static long fibonacci(int n) { long result=0; if (n==0) { result=0; } else if (n==1) { result=1; tmp=result; } else { result=tmp+fibonacci(n - 2); tmp=result; } return result; } 问题,算法复杂度,引导有没有不用递归的? 3.无递归 public static long fibonacci(int n){ long before=0,behind=0; long result=0; for(int i=0;i result=0; before=0; behind=0; } else if(i==1){ result=1; before=0; behind=result; }else{ result=before+behind; before=behind; behind=result; } } return result; } 给出一个普通的spring mvc controller,如下: @Controllerpublic class WelcomeController { private final Logger logger=LoggerFactory.getLogger(WelcomeController.class); @Autowired private final HelloWorldService helloWorldService; @RequestMapping(value="/", method=RequestMethod.GET) public String index(Map model) { logger.debug("index() is executed!"); model.put("title", helloWorldService.getTitle("")); model.put("msg", helloWorldService.getDesc()); return "index"; } } 问题: 线程模型是什么?单线程如何提升qps?线程池 executor在线程池下如何控制并发?信号量Semaphore或者计数器CountDownLatch 引申到:Java中的可重入锁:synchronized 和 java.util.concurrent.locks.ReentrantLock 场景:一张表 test(a,b,c,e,f,g) 100w记录 常用查询条件 ab abc abe,如何提升查询效率? 索引复合索引的规则:最左原则。查询条件ae走不走索引?1000w,1亿,十亿以上条记录查询是否会有什么不同?多线程下如何保证数据一致性?乐观锁/悲观锁,应用场景不同点 public class Test { @Test public void test() throws InterruptedException, ExecutionException { AsyncTaskExecutor executor=new SimpleAsyncTaskExecutor("sys.out"); Future future=executor.submit(new OutThread()); System.out.println(future.get()); System.out.println("Hello, World!"); Thread.sleep(10000 * 1000L); } static class OutThread implements Callable { public void run() { } @Override public String call() throws Exception { String ret=" i test callable"; for (int i=0; i < 10; i++) { try { Thread.sleep(2 * 1000L); System.out.println("i sleep 1s"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return ret; } } } 5.1 看程序说明 5.2 引申到reactor模型 spring reactorvert.xakka 5.3 servlet 3 响应式编程 如何设计实现LRU缓存? Least Recently Used,最近最少使用缓存。 思路: 每个key 需要有value,最近的使用时间戳面向对象思想,Node{key,value,timestamp}组成线程安全的链表ConcurrentLinkedQueue 如何设计一个停车场系统? 思路: 1.user-case图 涉及的人:用户(普通用户/特权用户),车(小汽车/货车等),停车场普通管理员,停车场系统管理员,车位信息 2.功能: 用户停车导航,缴费,历史记录;车包含车牌,类型和古董用户关联;停车场普通管理员提供停车车位,导航和收费,车位的维护;停车场系统管理员停车场利用率,收费情况,维护费用,盈利报表等 3.关键点:评估系统的费用,硬件的费用。 如何设计一个安全的api接口给第三方使用? 1.http和https 证书 2.防篡改 md5,sha1,sha256 签名 3.加密,对称加密des和非对称加密rsa 4.可以参考 open.taobao/doc.htm?docId=73&docType=1 淘宝开发平台 一个日志文件约为10亿行记录,如何错误日志? grep 命令,sed命令 秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购。 并发量分别在0~100,100~1000,1000~10000,10000~100000的设计方案,这些设计方案的不同点是什么?相同点是什么? 设计思路: 防火墙如何限流,黑板名单 CND LB负载层 前端:页面静态化 禁止重复提交后端:限流 削峰 异步处理 预处理 参考架构方案:
最后针对上面的高频常问面试题我还总结出了各大互联网公司java程序员面试涉及到的绝大部分面试题及答案做成了文档和学习笔记文件以及架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习,也可以关注我一下以后会有更多干货分享。 |
|
来自: 新用户0175WbuX > 《待分类》