欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java面试题,java面试题及答案2020

来源: javaer 分享于  点击 25849 次 点评:206

java面试题,java面试题及答案2020


Array和ArrayList的不同点

  • Array可以包含基本类型和对象类型,ArrayList只能包含对象类型
  • Array大小是固定的,ArrayList的大小是动态变化的

Map和ConcurrentHashMap的区别

  • Map是线程不安全的,put在多线程情况下,会形成环从而导致死循环
  • ConcurrentHashMap是线程安全的,采用分段锁机制,减少锁的粒度

Synchronized

  • Synchronized修饰的静态方法以及同步代码块锁的是类,线程想要执行对应同步代码,需要获得类锁
  • Synchronized修饰成员方法,线程获取的是当前调用该方法的对象实例的对象锁

volatile

  • 可见性:可以使得一个线程修改后的变量立即对其他线程可见
  • 不保证原子性
  • 禁止指令重排

sychronized和lock

sychronized是java的关键字,当它用来修饰一个方法或一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段。jdk1.5之后引入了自旋锁,锁粗化,轻量级锁,偏向锁来有优化关键字的性能。
Lock是一个接口,而synchronized是java中的关键字。sychronized在发生异常时,会自动释放线程占有的锁。因此不会导致死锁现象的发生,而Lock在发生异常时,如果没有主动unLock()释放锁,则很有可能导致死锁的现象。因此使用Lock时需要在finally块中释放锁。Lock可以让等待锁的线程响应中断,而synchroniezd却不行,使用synchrnized时,等待的线程会一直等待下去,不能够响应中断。通过Lock可以知道没有成功获取锁,而synchronized却无法办到。

final

  • final修饰一个类时,表示该类无法被继承
  • final修饰一个方法时,表示该方法不可被覆盖
  • final修饰一个属性时,表示该属性一旦被初始化便不可更改

static

  • static表示一个成员变量或者成员方法可以在没有所属类的实例变量的情况下能被访问
  • java中的static方法不能被覆盖。因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的,static方法跟类的任何实例都不相关

StringBuffer和StringBuilder

  • StringBuffer是线程安全的,StringBuildr是线程不安全的,底层实现上的话,StringBuffer其实就是比StringBuilder多了一个Synchronized修饰符

接口和抽象类的区别

不同点:

Comparable和Comparator

反射

反射机制是指,在运行状态中,对于任意一个类,可以知道它的任意属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,对于这种动态调用对象方法的功能成为java语言的反射机制

反射创建对象

获取和设置对象的私有字段的值

通过类对象getDeclaredField()方法,再通过setAccessible(true)将其设置为可以访问,接下来通过get/set方法类获取/设置字段的值了

进程和线程的区别

  • 进程是资源分配的最小单位,线程是cpu调度的最小单位

start和run的区别

  • start方法会创建一个新的子线程并启动
  • run()方法只是Thread的一个普通方法的调用(还是在主线程里执行)

Thread和Runnable的去呗

  • Thread是一个类,Runnable是一个接口,Thread类实现了Runnable接口
  • Thread是实现了Runnable接口的类,通过start给Runnable的run方法赋上多线程的特性,因为java是单一继承原则,为了提升系统的可扩展性,推荐通过使业务类实现Runnable接口将业务逻辑封装在run方法里

线程的状态

sleep和wait的区别

sleep()方法是Thread类方法,wait方法是Object类中定义的方法
sleep可以在任何地方使用
wait方法只能在sychronized方法或者synchronized块中使用

最本质的差别
sleep方法只会让出cpu,不会导致锁的变化,如果当前线程是拥有锁的,那么Thread.sleep方法不会让线程释放锁,而只会主动让出cpu,让出cpu,cpu就可以去执行其他任务了
wait方法不仅会让出cpu,而且还会释放以及占有的同步资源锁,以便它在等待该资源的线程得到该资源进而去执行

notify和notifyAll的区别

  • notifyAll会让所有处于等待池中的线程全部进入锁池去竞争获取锁的机会,没有获取到锁的只能等待其他机会去获取锁,不能主动回到线程池中。
  • notify 只能随机选取一个处于等待池中的线程去竞争获取锁的机会

yield函数

  • 当调用Thread.yield()方法时,会给线程调度器一个当前线程愿意让出CPU使用的暗示,但是线程调度器会忽略这个暗示。
  • yield方法对锁的行为不会有影响的,不会让当前线程让出锁

interrupt

调用interrupt方法,通知线程应该中断了,该线程到底是中断还是继续执行,应该由这个线程自己去处理
如果线程处于被阻塞状态,例如:sleep,wait,join状态,那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常
如果线程处于正常活动状态,那么会将该线程的中断标识设置为true,被设置中断标示的线程将继续正常运行,不受影响

相关文章

    暂无相关文章
相关栏目:

用户点评