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

临近年关,不少人蠢蠢欲动,有童鞋问我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去重排序,

....

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

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

b1cdfe04ed1aa622af734f5c68818942.png

2.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.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

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;

}

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

2.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;

}

3.并发问题

给出一个普通的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";

}

}

问题:

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

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 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 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、付费专栏及课程。

余额充值