java高级工程师 考试_java高级工程师开放面试题集<一>

1fea00d19c6a1977027f3f9f1ce7f065.png

临近年关,不少人蠢蠢欲动,有童鞋问我java后端面试会面试什么?

作为一个java后端老鸟,跌打滚爬多次被面试和面试别人,总结了一些经验,希望对大家有所帮助。

特别说明,仅仅针对工作两年以上的java后端开发。以开放性题目为主。

1.数据结构相关

假设1亿整数存放在一个txt文件中,如何去重和排序?

思路:

1.1.面试者要评估一下一亿整数的大小。一个int占4个字节,1亿呢?

1.2.去重的数据结构有哪些?HashSet--->引申到HashMap--->ConcurrentHashMap

1.3 数据量增大到十亿百亿怎么去重?

布隆过滤器,优点,缺点

1.4.其他方式?

数据库distinct order by,txt怎么导入到数据库?load

redis去重排序,redis的数据结构-->引申到其他数据结构 String,list,hash,set,sorted set,hyperloglog,geo

mongo去重排序,

....

2. 算法相关,主要考察代码能力

斐波那契数列(fabnacci)实现,首先介绍一下该算法的思想

b4059df1ab28b7d34e8207f4b821468a.png

2.1 第一级别实现: 两层递归

public static long fibonacci(intn){if(n==0) return 0;else if(n==1) return 1;else

return fibonacci(n-1)+fibonacci(n-2);

}

问算法复杂度及评估一下性能问题,提示可以优化。

2.2 第二级别:减少一层递归

public static voidmain(String[] args) {long tmp=0;//TODO Auto-generated method stub

int n=10;

Long start=System.currentTimeMillis();for(int i=0;i

System.out.print(fibonacci(i)+" ");

}

System.out.println("-------------------------");

System.out.println("耗时:"+(System.currentTimeMillis()-start));

}public static long fibonacci(intn) {long result = 0;if (n == 0) {

result= 0;

}else if (n == 1) {

result= 1;

tmp=result;

}else{

result= tmp+fibonacci(n - 2);

tmp=result;

}returnresult;

}

问题,算法复杂度,引导有没有不用递归的?

2.3 无递归

public static long fibonacci(intn){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;

}

}returnresult;

}

3.并发问题

给出一个普通的spring mvc controller,如下:

@Controllerpublic classWelcomeController {private final Logger logger = LoggerFactory.getLogger(WelcomeController.class);

@Autowired

private finalHelloWorldService helloWorldService;@RequestMapping(value= "/", method =RequestMethod.GET)public String index(Mapmodel) {

logger.debug("index() is executed!");

model.put("title", helloWorldService.getTitle(""));

model.put("msg", helloWorldService.getDesc());return "index";

}

}

问题:

3.1.线程模型是什么?单线程

3. 2.如何提升qps?线程池 executor

3.3.在线程池下如何控制并发?信号量Semaphore或者计数器CountDownLatch

引申到:Java中的可重入锁:synchronized 和 java.util.concurrent.locks.ReentrantLock

4.数据库相关

场景:一张表 test(a,b,c,e,f,g) 100w记录  常用查询条件 ab  abc  abe,如何提升查询效率?

4.1.索引,

4.2.复合索引的规则:最左原则。查询条件ae走不走索引?

4.3 1000w,1亿,十亿以上条记录查询是否会有什么不同?

4.4 多线程下如何保证数据一致性?乐观锁/悲观锁,应用场景不同点

5.设计模式相关

public classTest {

@Testpublic void test() throwsInterruptedException, ExecutionException {

AsyncTaskExecutor executor= new SimpleAsyncTaskExecutor("sys.out");

Future future = executor.submit(newOutThread());

System.out.println(future.get());

System.out.println("Hello, World!");

Thread.sleep(10000 * 1000L);

}static class OutThread implements Callable{public voidrun() {

}

@Overridepublic String call() throwsException {

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();

}

}returnret;

}

}

}

5.1 看程序说明

5.2 引申到reactor模型

spring reactor

vert.x

akka

5.3 servlet 3 响应式编程

太累,先写到这里吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值