Java中的面试题(2)

1、Java中的四种引用类型

  1. 强引用:在Java中使用new关键字创建的对象都属于强引用,当一个对象被强引用变量引用时,它就始终处于一个可达状态,垃圾回收器永远不会回收该对象,因此强引用是造成Java内存泄漏的主要原因之一。强引用也是使用最多的。
  2. 软引用:软引用需要通过SoftReference类来创建的,对于弱引用来说,当系统中的内存不够用时就会被回收。
  3. 弱引用:弱引用需要通过WeakReference类来创建的,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不论系统内存是否够用,该对象就会立即被回收。
  4. 虚引用:虚引用需要通过PhantomReference类来创建的,一般不单独使用,必须和引用队列一起使用。也成为幽灵对象,使用的比较少。

2、Java中的内存泄漏

  1. 什么是内存泄漏:内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。
  2. 为什么会发生内存泄漏:在开发过程中,jvm虚拟机会回收不在使用的对象,但是由于各种原因让垃圾回收器误以为对象还在使用中而造成的内存泄漏。
  3. 内存泄漏有哪些情况:使用强引用变量引用的对象。资源没有及时的关闭。

3、Java中如何停止线程(使run方法结束运行)

  1. stop()方法,强制让线程结束,该方法比较暴力不建议使用。
  2. 使用共享变量,使共享变量的值发生改变,从而让线程退出循环。
  3. interrput方式,在线程内部中有中断标志的值改为false。

4、Java中sleep()和wait()的区别

  1. sleep()属于Thread类中的静态方法,wait()属于Object类中的方法。
  2. sleep()可以被自动唤醒,wait()需要手动唤醒。
  3. sleep()在持有锁的情况下运行,运行完毕不会被释放锁资源,wait()会自动释放锁资源。
  4. sleep()可以在持有锁或者不持有锁的情况下运行,wait()必须在持有锁的情况下运行。

5、@SpringBootApplication的三个主要注解

  1. @ComponentScan:从spring容器中进行扫描,扫描路径为当前在解析这个类所在的包路径。
  2. @EnableAutoConfiguration:负责自动加载配置类,就是将项目中自动配置类引入到spring容器中。
  3. @SpringBootConfiguration:表示当前类是一个配置类。

6、对Spring的理解

sping是一个轻量级开源的框架,主要功能有IoC(控制反转)和AOP(面向切面编程)。

它可以通过IoC来解耦合,降低代码之间的耦合度。

包含并管理应用对象(bean)的配置和生命周期。(容器角度)

将一些简单的容器对象组合成一个复杂的应用。(框架角度)

7、对IoC的理解

IoC容器:实际上就是一个map集合,里边存储的是各种对象(在xml文件中配置的bean节点,@service,@component、@controller),在项目启动时读取配置文件中bean标签,通过反射创建对象放到map中,扫描添加注解的类还是通过反射创建对象并放入到map集合中。

控制反转:将程序员手机创建对象的权利反转到IoC容器里。

依赖注入:在IoC容器运行期间,动态的将某种依赖关系注入到对象中。

8、BeanFactory和ApplicationContext有什么区别

ApplicationContext是BeanFactory的子接口。

ApplicationContext提供了更多的功能:

  • 继承了MessageSource,因此支持国际化。
  • 统一的资源文件访问方式。
  • 同时加载多个配置文件。
  • 提供在监听器中注册bean的事件。

ApplicationContext在容器启动时就一次性创建所有的bean对象。这样在容器启动时我们就可以发现Spring配置中是否存在错误。

BeanFactory在getBean()后才会创建bean对象,这样在容器启动时我们就不可以发现Spring配置中是否存在错误。只有在第一次使用getBean()方法后才能抛出异常。

ApplicationContext相比较于BeanFactory比较占用内存,启动较慢。

9、深拷贝和浅拷贝

深拷贝和浅拷贝是指在拷贝时对象中存在的两种属性:一是基本数据类型,二是引用数据类型

浅拷贝:在拷贝时如果是基本数据类型直接拷贝值,如果是引用数据类型,会拷贝地址,并不会拷贝一份引用地址所指向的对象,也就是说拷贝出来的对象和原本的对象中引用数据类型指的是同一个对象。

深拷贝:在拷贝时如果是基本数据类型直接拷贝值,如果是引用数据类型,会拷贝一份引用地址所指向的对象,也就是说拷贝出来的对象和原本的对象中引用的不是同一个对象。

10、synchronized的优化

锁消除:在synchronized修饰的代码中,如果不存在操作临界资源的情况,会触发锁消除,即使写了synchronized也不会有效果。可以避免没有操作临界资源时锁的一个频繁竞争。

锁膨胀:如果在一个循环中,频繁的获取和释放锁资源这样带来的消耗较大,锁膨胀就是将锁的范围扩大,避免频繁的进行锁资源的竞争带来的资源的消耗。

锁升级:在1.6以前如果线程获取不到锁会被挂起。所以synchronized的性能比较差。所以进行了锁优化升级。

 11、产生死锁的四个必要条件

  1. 互斥条件:一个资源每次只能被一个线程访问。
  2. 请求于保持条件:一个进程因请求资源而阻塞时,对已有的资源保持不放。
  3. 不剥夺条件:进程已获取的资源,在未使用完之前,不会被强行剥夺。
  4. 循环等待条件:若干进程之间形成一种循环等待的状态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值