java部分面试题

1、runnable和callable的区别

相同点:

1、两者都是接口

2、两者都需要Thread.start();来启动线程

不同点:

1、runnable重写的是run方法,callable重写的是call方法

2、runnable不能获取返回值,而callble可以通过futuretask.get()来获取返回值,不过执行get的时候主线程会阻塞,等待该线程返回

3、runnable不能抛出异常,而callable可以

 

2、要在一个大到内存无法装下的文件中,找到出现次数最多的前100个数,怎么处理

首先文件很大不能全部加载到内存,需要对文件进行分成N个小文件。

循环读取拆分的小文件,统计各个数出现是次数(这里统计的数据次数也会很大,达到内存无法保存),按照hash算法将统计到的数据写入到各个小文件中,分别进行命名,如果一个文件太大,再将该文件进行拆分。要保证一个数只能在一个文件中统计。

采用Topk算法来找出前100个数

将统计完成的小文件,分别进行加在到内存,使用小顶堆(堆顶元素最小)进行统计,堆长度为100,循环过程中,如果对重元素长度没有100,执行堆插入操作,如果堆长度超过100了,将取到的数字和堆顶数字进行对比,一旦发现,堆顶数字比取到的数字小,将堆顶元素削掉(此时堆中元素会进行重排序),再将取到的数据放入堆中(此时堆会再进行一次排序),当循环完以后,堆中的100个数字就是最大值。

(这里没有用有序列表进行排序的原因是列表效率低,可能再插入元素的时候进行时间复杂度为O(n),如果使用ArrayList还得移动元素,而使用堆排序比较次数时间复杂度为O(logn),插入新元素,最多进行一次左旋或者右旋就可以了)。

3、线程间通信机制的几种方式

1、使用volatile关键字,大致是多个线程在监听同一个变量,当一个线程对这个变量进行修改时,其它线程会马上感知。

2、使用object的wait()和notify()来实现,不过该方法必须和synchronized结合使用

3、使用java.util.concurrent包下的CountDownLatch类。基于AQS线程共享变量的state来实现的。方法是countDownLatch.countDown()和countDownLatch.await()。

4、使用ReentrantLock 结合condition来使用,

             ReentrantLock lock = new ReentrantLock();

             Condition condition = lock.newCondition();

             condition.signal();

             condition.await();

5、使用locksupport来实现,LockSupport.unpark(thread);LockSupport.park()。

4、线程池的工作过程

当提交一个任务到线程池时,判断corePoolSize是否都在执行任务,如果有空闲线程,那就从核心线程池中取一个线程来执行任务,知道线程数量等于核心线程数。

当提交任务大于核心线程数时,继续提交的任务会加入到阻塞队列中进行等待被执行。

当阻塞队列满时,创建新的线程来执行新的任务,当新的线程数达到最大线程数时,新提交的任务由拒绝策略来处理。

5、哪些可以作为GCROOT

首先了解GCROOT,GCROOT是垃圾回收算法中的根搜索算法。

1、虚拟机栈中的对象,当执行一个方法时,会创建局部变量表,操作数栈,运行时的常量池

2、方法区中的静态属性引用的对象,用static修饰,加载类的时候就会加载到内存中。

3、方法区中的常量引用对象。用final修饰,第一次被赋值后不允许修改,因此可以作为GCROOT对象

4、本地方法栈中的JNI(native方法)引用的对象

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java是一种常见的编程语言,它被广泛用于各种应用程序和软件的开发。对于那些正在寻求Java开发岗位的人来说,熟悉Java高级面试题pdf对于他们的工作前景至关重要。Java高级面试题pdf覆盖了各种话题,包括语言和语法,JVM,多线程编程,集合框架,网络编程和Web开发等。以下是我对Java高级面试题pdf的深入分析。 语言和语法:了解Java的基本语法对于开发者来说是非常重要的。这包括管理变量和数据类型,条件运算符、循环结构等。Java高级面试题pdf通常涉及垃圾回收机制和内存管理问题,这是当代Java应用程序中最重要的部分之一。 JVM:Java虚拟机(JVM)是执行Java代码的重要部分Java高级面试题pdf将测试开发人员对JVM的理解,包括Java内存模型,JVM优化和垃圾回收器等。不仅如此,还涉及到Java类加载器、类方法区、线程栈和虚拟机线程等方面。 多线程编程:并发性是当代Java应用程序开发中最活跃和最具有挑战性的领域。Java高级面试题往往会涉及多线程编程的基础知识,如锁,同步和线程通信等。开发人员还需要了解线程池、同时执行器以及同步集合类等。 集合框架:Java集合框架使开发人员能够轻松地组织和操作数据。Java高级面试题通常会涉及集合框架的类层次结构,特别是List、Map和Set等类。还可能会涉及到自定义集合类以及如何使用迭代器、复制和序列化等技术。 网络编程:Java网络编程是实现分布式系统的重要组成部分Java高级面试题往往涉及如何在Java中使用套接字、建立TCP/IP连接、创建网络应用程序,并进行数据传输等方面的问题。除此之外,还可能会涉及HTTP、REST以及SOAP等方面的Web协议。 Web开发:Java可用于开发Web应用程序。Java高级面试题pdf会测试开发人员关于Java Web开发方面的使用。这可能涉及Servlet和JSP、Spring框架、Hibernate ORM以及Web应用程序部署等方面的知识。 总之,Java高级面试题pdf为应聘者提供了一个全面的Java知识体系。答好这些问题可以大大增加面试者的聘用机会。因此,准备这些面试题的人们可以确保他们在Java应用程序开发领域的专业能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员老牛了laoliu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值