三道java高级工程师面试题

X元素 2017-02-14 03:57:43
加精
1.junit 下测试多线程注意事项。
2.高并发 ,处理时间短,选用哪种线程池,
并发低,处理时间长,选用哪种线程池,
高并发,处理时间长,如何处理。
3.100亿个数字,如何最快找出其中10000个最大的数。
...全文
16038 85 打赏 收藏 转发到动态 举报
写回复
用AI写文章
85 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr_Xu_Sea 2017-11-23
  • 打赏
  • 举报
回复
引用 37楼injuer 的回复:
1.junit 下测试多线程注意事项? answer : 1.1. 测试用例需实现runnable. 1.2. 编写统一条用函数. 1.3. 网络协议. 2.高并发 ,处理时间短,选用哪种线程池,并发低,处理时间长,选用哪种线程池,高并发,处理时间长,如何处理? answer : 2.1 高并发,处理时间短 --> join-fork. 2.2 并发低,处理时间长 --> put-poll. 2.3 高并发,处理时间长 --> fork + poll + splice. 3.100亿个数字,如何最快找出其中10000个最大的数? answer : 3.1 切片 3.2 计算线性向量 3.3 创建阀值的线程 3.4 提取分布特性 3.5 计算分布特性增量
大神,能略微解释下 join fork pur poll么
Mr_Xu_Sea 2017-11-23
  • 打赏
  • 举报
回复
需要具体到哪一种线程池类?
Love_云宝儿 2017-08-14
  • 打赏
  • 举报
回复
引用 23 楼 twotuli_software 的回复:
进这个贴的,我想都是高级工程师,于是我想问一个问题:

public class Test {
 
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        /* 调用方法1*/
        method1(a,b); //要求在方法1被调用之后打印出a=100 b=200 请写出method1的代码
        System.out.println("a="+a);
        System.out.println("b="+b);
    
同求,但我觉得可能和Java虚拟机里面的堆、栈、方法区有关
尽在云中 2017-08-14
  • 打赏
  • 举报
回复
菜鸟一枚,你要的应该是这个 putlic static void method1() { System.out.println("a=100 b=200"); System.exit(0); }
引用 23 楼 twotuli_software 的回复:
进这个贴的,我想都是高级工程师,于是我想问一个问题:

public class Test {
 
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        /* 调用方法1*/
        method1(a,b); //要求在方法1被调用之后打印出a=100 b=200 请写出method1的代码
        System.out.println("a="+a);
        System.out.println("b="+b);
    
「已注销」 2017-07-05
  • 打赏
  • 举报
回复
引用 30 楼 lwxin0000 的回复:
ublic class Test { public static void main(String[] args) { int a = 10; int b = 20; /* 调用方法1*/ method1(a,b); //要求在方法1被调用之后打印出a=100 b=200 请写出method1的代码 System.out.println("a="+a); System.out.println("b="+b); 这个的关注点是面向切面编程,如何可以使用spring ,就是使用aop,如果不能使用spring ,就是使用java的反射, aop的底层就是java的反射。
能用你说的这些东西实现,除非你自己开发一个JVM,这也是基础,基本数据类型不能通过method赋值,你想改变这一点除非你不是写java了。
qq_37733891 2017-03-22
  • 打赏
  • 举报
回复
引用 10 楼 X元素的回复:
[quote=引用 8 楼 ShuaiSix 的回复:] 第三题 100亿个数字,如何最快找出其中10000个最大的数。 把每一百万数字降序排序分成一个单独的文件,一共 1万个文件 然后比较每个文件的第一个数字,排序以后转存到新的文件,一万个就结束 具体的参考这篇文章
思路没问题。如果能用代码实现是最好的。[/quote] 这有bug,就拿两组说,如果第一组的最大数字,没有第二组(降序排序)第二个数字大,那么比第一组最大的数字还大就被忽略了。
fengws 2017-03-08
  • 打赏
  • 举报
回复
学习一下,顶顶顶
heiguiDeng 2017-03-07
  • 打赏
  • 举报
回复
培训入职几个月的萌新处理下第三题思路: 第三题有大概有两个卡点: 第一,减少源数据比较。 第二,减少结果数据比较与替换排序。 鉴于以上的要求我会分三层批量处理 源数据→缓冲层→结果集 1我们把源数据分割成10000*10000的规格文件。 2我们把全部单元进行排序处理。 3构造对象(含有属性:文件编号、首位数字大小,排序号)。 4取出所有文件的头位构造10000个构造对象的集合作为结果集进行排序。 5取出所有文件的第二位构造10000个构造对象的集合作为缓冲层一进行排序。 6找出缓冲层一最大值与结果集最小值分别在缓冲层与结果集中取出排序构造缓冲层二。 7从缓冲层二中取出集合替换结果集中小于缓冲层最大值的对象。 8抛弃没被结果集选中的文件。 9这时候就有新的文件群,新的结果集了。这时候再继续取出第三位进行第五步操作即可。 10直到所有文件排除完毕。 这种方法首次删除的文件最低也能做到二分法,高的来说一次比较可以解决掉全部文件,看运气~~~~~~~~ 当然这中间还有很多优化的余地~~~~卖个关子不赘述,上班干活~~~~~~
格拉 2017-03-07
  • 打赏
  • 举报
回复
引用 23 楼 twotuli_software 的回复:
进这个贴的,我想都是高级工程师,于是我想问一个问题:

public class Test {
 
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        /* 调用方法1*/
        method1(a,b); //要求在方法1被调用之后打印出a=100 b=200 请写出method1的代码
        System.out.println("a="+a);
        System.out.println("b="+b);
    
private static void method1(int a,int b)  
	{
		System.out.println("a="+a*10);//100
		System.out.println("b="+b*10);//200
		System.exit(0);
		
	}
slmax1 2017-03-07
  • 打赏
  • 举报
回复
营养贴......
wjb_yd 2017-03-07
  • 打赏
  • 举报
回复
引用 73 楼 taoleialskdjfhg 的回复:
[quote=引用 50 楼 wjb_yd 的回复:] [quote=引用 40 楼 bree06 的回复:] [quote=引用 39 楼 wjb_yd 的回复:] 你的这个解法没问题,人家8楼的解法也问题,但是人家面试官肯定想要的是8楼的那个解法,因为这种题目一般都有个限制,只允许你使用多少M的内存,你这上来就开1个亿的数组我也是呵呵了。 要是100亿呢? 8楼的思路依然可行,你的这个解法压根没发运行了
我new 1亿是因为1亿int数组服务器完全没有压力, 100亿不会装载100次每次装1亿吗? 后面的动作都是重复的有必要再写吗? 呵呵别人想法之前先考虑一下有没有看明白别人的思路, 除开原数据100亿, 我的空间复杂度也只有10000也就是结果要求的10000个最大值. 不知道你在嘲笑我什么?[/quote] 厉害了,我的哥。。。 你先看清我说的意思,我并没有说你的解法不对,我只是说你的解法太依赖空间限制条件。你说除开源数据100亿,再看空间复杂度只有1W,那么我请问你如果题目给的这100亿数字都来源于文件,你把他们一下子加载到内存,你这个算法的空间复杂程度到底算1W还是1亿+1W呢? 另外,你说的没错,我是有点嘲笑你的口气,那是因为你在13楼评论别人的算法时,说话的口气也不客气。 先学会尊重别人,再要求别人尊重你自己吧。[/quote] 借用层主的观念,如果100亿数字源于文件,可以读文件,读1亿个数字(256MB内存应该可以吧),然后存到数组,对这个数组排序找出最大的1W个数字,存在内存中,然后重复读文件,循环100次,获得100组1W个数字,接着排序,皆可得到前1W个数字。 不知道这个想法行不行?[/quote] 这题的正确答案上面已经有很多朋友提出来了,多路归并或者堆排序都可以。你的这个解法还是有问题,首先256MB的内存,只能装下3200W个数,不是一个亿。第二,你循环到100次的过程中,每一次的排序结果都要放到内存里,也就是你需要额外的32W个数字的内存。抛开这两点,你的这个解法也没问题,但是本质和归并排序的思路是一样的。正解还是每次排序1W个数,然后放到临时文件中,最后对这些临时文件做多路归并排序。
_kid_ 2017-03-07
  • 打赏
  • 举报
回复
学习了.....
ZealotTL 2017-03-06
  • 打赏
  • 举报
回复
引用 50 楼 wjb_yd 的回复:
[quote=引用 40 楼 bree06 的回复:] [quote=引用 39 楼 wjb_yd 的回复:] 你的这个解法没问题,人家8楼的解法也问题,但是人家面试官肯定想要的是8楼的那个解法,因为这种题目一般都有个限制,只允许你使用多少M的内存,你这上来就开1个亿的数组我也是呵呵了。 要是100亿呢? 8楼的思路依然可行,你的这个解法压根没发运行了
我new 1亿是因为1亿int数组服务器完全没有压力, 100亿不会装载100次每次装1亿吗? 后面的动作都是重复的有必要再写吗? 呵呵别人想法之前先考虑一下有没有看明白别人的思路, 除开原数据100亿, 我的空间复杂度也只有10000也就是结果要求的10000个最大值. 不知道你在嘲笑我什么?[/quote] 厉害了,我的哥。。。 你先看清我说的意思,我并没有说你的解法不对,我只是说你的解法太依赖空间限制条件。你说除开源数据100亿,再看空间复杂度只有1W,那么我请问你如果题目给的这100亿数字都来源于文件,你把他们一下子加载到内存,你这个算法的空间复杂程度到底算1W还是1亿+1W呢? 另外,你说的没错,我是有点嘲笑你的口气,那是因为你在13楼评论别人的算法时,说话的口气也不客气。 先学会尊重别人,再要求别人尊重你自己吧。[/quote] 借用层主的观念,如果100亿数字源于文件,可以读文件,读1亿个数字(256MB内存应该可以吧),然后存到数组,对这个数组排序找出最大的1W个数字,存在内存中,然后重复读文件,循环100次,获得100组1W个数字,接着排序,皆可得到前1W个数字。 不知道这个想法行不行?
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
题目2: 高并发 ,处理时间短,选用哪种线程池, 并发低,处理时间长,选用哪种线程池, 高并发,处理时间长,如何处理。 线程池要点:1、尽量减少线程切换和管理的开支; 2、最大化利用cpu。 对于任务耗时短的情况,要求线程尽量少,如果线程太多,有可能出现线程切换和管理的时间,大于任务执行的时间,那效率就低了;对于耗时长的任务,要分是cpu任务,还是io等类型的任务。如果是cpu类型的任务,线程数不宜太多;但是如果是io类型的任务,线程多一些更好,可以更充分利用cpu。对于2,要求尽量多的线程,以保证CPU资源最大化的利用; 所以: 高并发,低耗时的情况:建议少线程,只要满足并发即可;例如并发100,线程池可能设置为10就可以 低并发,高耗时的情况:建议多线程,保证有空闲线程,接受新的任务;例如并发10,线程池可能就要设置为20; 高并发高耗时:1要分析任务类型,2增加排队,3、加大线程数; 我是搬运工。 source: http://ifeve.com/question/%E9%AB%98%E5%B9%B6%E5%8F%91%EF%BC%8C%E6%89%A7%E8%A1%8C%E8%80%97%E6%97%B6%E7%9F%AD%E7%9A%84%E4%BB%BB%E5%8A%A1%EF%BC%8C%E8%BF%98%E6%9C%89%E4%BD%8E%E5%B9%B6%E5%8F%91%EF%BC%8C%E6%89%A7%E8%A1%8C%E8%80%97/
  • 打赏
  • 举报
回复
引用 69 楼 enpain 的回复:
我觉得应该使用最小树。含有一万个数的最小树。默认前10000个放入最小树。然后将100亿个数,从第10001个开始,依次和最小树中的根节点比较,如果比这个数大于根节点,则替换掉根节点,并重新整理最小树;否则,接着比较下一个数。复杂度的话,如果整理最小树复杂度为O(m),那么整个下来的复杂度为100亿*O(m).
这是第三题
  • 打赏
  • 举报
回复
我觉得应该使用最小树。含有一万个数的最小树。默认前10000个放入最小树。然后将100亿个数,从第10001个开始,依次和最小树中的根节点比较,如果比这个数大于根节点,则替换掉根节点,并重新整理最小树;否则,接着比较下一个数。复杂度的话,如果整理最小树复杂度为O(m),那么整个下来的复杂度为100亿*O(m).
舰行天下 2017-03-02
  • 打赏
  • 举报
回复
引用 65 楼 ZZY1078689276 的回复:
用过滤的方法应该用不了多少内存,思路是这样的,从100亿个数据中抽出头10000个数字组成一个筛子,随后后面的(100亿-10000)个数字的文件就像是水一样流经过着10000个数字组成的筛子,凡是大的数字留下,小的数字就直接流走,分批分割储存.
hudaohai 2017-03-02
  • 打赏
  • 举报
回复
顶,收获很大啊
jjioooppxxcc 2017-03-01
  • 打赏
  • 举报
回复
回答一下第三问吧。 声明一个最小堆,最小堆最多放10000个元素, 然后扫那几百亿的数组,比如新的变量的名字叫B 如果最小堆顶端,变量A,B比A大,就把最小堆的顶端(A)pop掉,然后push那个B。 如果A比B大,那就没必要,继续扫 复杂度是O(mlog(n)),m是数列长度,n是找最大的n个数。在这里就是10000吧。 伪代码:

MinHeap minHeap = new MinHeap();
while (到没有数字available){
Integer b = nextInt();
if minHeap.size() == 0 {
  minHeap.push(b);
  continue;
}
Integer a = minHeap.top();
if (a < b) {
  if (minHeap.size() >= 10000) {
    minHeap.pop();
   }
   minHeap.push(b);
}
}
把所有heap里的元素pop出来就是10000个最大的数字。 =。=|||
加载更多回复(63)

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧