美文网首页
Java系列0 面试题

Java系列0 面试题

作者: 莫小归 | 来源:发表于2019-02-27 16:01 被阅读0次

参考:
https://blog.csdn.net/linzhiqiang0316/article/details/80473906

一.Java相关概念

1.面向对象的三个特征?
  • 封装
  • 继承
  • 多态
2.代码中如何实现多态?
  • 接口实现
  • 重写父类方法
  • 本类方法重载
3.虚拟机如何实现多态?
  • 动态绑定
    虚拟机在执行时判断所引用对象的实际类型,再根据实际类型调用对应方法

4.抽象类和接口的区别

抽象类 接口
方法实现 可以有方法实现 仅有方法定义
实现方式 extends,如果子类不是抽象类,则需实现抽象类声明的所有方法 implements,接口实现类需实现接口定义的所有方法
访问控制符 public/protected/default 默认public,不能使用其他访问控制符
5.Java创建对象有哪些方式?
  • new
  • 反射
  • clone
  • 序列化
6.Switch支持的参数类型
  • byte
  • char
  • short
  • int
  • String (jdk1.7后)
7.object类有哪些共有方法?
  • equals
  • hashCode
  • clone
  • getClass
  • toString
  • notify/notifyAll/wait
8.Java中有哪几种引用,有什么区别?
  • 强引用:不会被GC
  • 软引用:JVM内存不够时将被GC
  • 弱引用:即使JVM内存充足,该引用也将在下次GC时回收
  • 虚引用:总会被回收,但在回收时GC将发送引用回收通知
9.什么叫深拷贝和浅拷贝?

10.equals()和==的区别
  • 对基本类型而言,equals和==均是值比较
  • 对对象而言,==比较地址,想要比较值需要重写equals方法
11.equals()和hashCode()的联系
  • hashCode()返回对象的哈希值
  • 如果两个对象equals方法结果相等,那么他们调用hashCode方法必定产生相同哈希值
  • 如果两个对象equals方法结果不等,那么他们调用hashCode方法产生的哈希值一般不相等(仅在哈希碰撞的情况下相等)
12.&与&&的区别
  • &是位运算符,&&是逻辑运算符
  • &&具备短路特性
13.static的用法
  • 静态变量
  • 静态方法
  • 静态代码块
  • 静态内部类
  • 静态导包
14.String、StringBuffer和StringBuilder的区别
  • String是字符串常量,使用final修饰,效率低
  • StringBuffer是字符串变量,线程安全,效率较高
  • StringBuilder也是字符串变量,但线程不安全,效率最高

二.垃圾回收

1.常用垃圾回收算法有哪些?
  • 标记-清除
  • 标记-复制
  • 标记-整理
  • 分代回收
2.判断对象是否被回收的方法有?
  • 引用计数法(循环引用会造成内存泄漏)
  • 可达性分析法
3.调用System.gc()方法是否会立刻进行垃圾回收?
  • 不会
    调用该方法将通知GC开始工作,具体回收时间不定

三.多线程和锁

1.进程和线程有哪些区别?
进程 线程
基本单位 程序运行和资源分配的基本单位 CPU调度和分派的基本单位
内存共享 拥有独立的内存单元 多个线程共享内存资源
关系 一个进程至少有一个线程 同一进程的多个线程可并发执行
2.什么叫守护线程?常见的守护进程有哪些?
  • 程序运行完毕后,JVM将等待非守护线程完成后关闭,并直接关闭守护线程
  • GC线程即常见的守护线程
3.创建线程的方法有哪些?
  • 继承Thread类
  • 实现Runnable接口的run()
  • 实现Callable接口的call()
    call方法有返回值,和Future、FutureTask配合可获取异步执行结果
4.Thread类的start()和run()有什么区别?
  • 调用start()将启动新线程调用run()
  • 调用run()将直接在当前线程执行run()
5.线程阻塞的相关方法?
  • sleep():阻塞一定时间
  • suspend() / resume():suspend阻塞当前线程,直到对应的resume方法被调用
  • yield():使当前线程放弃已经获得的CPU时间,回到可执行状态,重新竞争CPU时间
  • wait() / notify():阻塞一定时间,直到时间结束或被notify方法调用
5.1怎样唤醒一个阻塞的线程
  • 如果是因为调用wait()、sleep()或join()导致的阻塞,可中断线程,并抛出InterruptedException唤醒线程
  • 如果是遇到IO阻塞,IO由操作系统实现,Java无法将之唤醒
6.产生死锁的条件?

7.wait()和sleep()的区别
  • wait()是object类的方法,sleep()是Thread类的方法
  • 调用wait()方法将释放对象锁,但调用sleep()方法则不会
  • sleep()需要指定一个睡眠时间,时间到后自动唤醒,wait()则需要配合notify()或notifyAll()使用
8.什么是多线程的上下文切换?
  • CPU控制权的切换
  • 由一个正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程
9.Synchronized和ReentrantLock的区别?

10.Java中有哪些锁?
  • 自旋锁
    因为共享数据的锁定通常只会持续很短时间,为这一小段时间而挂起和恢复线程显得有点浪费,所以让请求锁的线程稍等一会(执行自旋操作)而不放弃CPU执行时间,看持有锁的线程能否快速释放
  • 偏向锁
    用于消除数据在无竞争情况下的同步原语。锁会偏向第一个获得它的线程,如果在之后的执行过程中,没有其他线程获取该锁,则持有偏向锁的线程将不需要再进行同步
  • 轻量级锁
  • 重量级锁
11.什么是线程局部变量ThreadLocal?
  • 线程局部变量是局限于线程内部的变量,属于线程自身所有,不与其他线程共享
  • Java提供ThreadLocal类支持线程局部变量,在每个Thread中维护一个ThreadLocalMap完成数据隔离,以空间换时间的方式实现线程安全
12.什么是CAS?
  • Compare And Swap,即比较-替换
  • 假设有三个操作数 内存值V、旧的预期值A、要修改的值B
  • 当且仅当预期值A和内存值V相同时,才会将内存值修改为B并返回true,否则什么都不做并返回false
13.什么是悲观锁和乐观锁?
  • 乐观锁认为竞争不总会发生,所以它不需要持有锁,直接进行CAS。例子如数据库进行并发控制采用的时间戳
  • 悲观锁认为竞争总是会发生,因此会先获得锁,再对资源进行操作
14.多线程开发的良好实践有哪些?
  • 给线程命令
  • 最小化同步范围
  • 优先使用volatile
  • 使用线程池
  • 尽可能使用更高层次的并发工具(如BlockingQueue)而非wait和notify进行线程通信
  • 优先使用并发容器而非同步容器

待续内容

  • 线程池
  • 线程框架

四.一些实例

1.String s1="ab", String s2="a"+"b", String s3="a", String s4="b", String s5=s3+s4。那么s2==s5返回什么?
  • false
  • s2在编译时会优化为s2=”ab”,存入方法区字符串常量池
  • s5将通过new创建,作为对象存入堆内存
2. 3*0.1==0.3?
  • false
  • 浮点数无法被精确表示
3.short s=1;s=s+1;和short s=1;s+=1;两条语句是否会报错错?
  • short s=1;s=s+1;会报错,s+1的结果将转为int类型,再赋值给s时存在向下转型的问题
  • short s=1;s+=1;不会报错,+=操作符会将计算结果隐式转换为赋值变量的类型,相当于s=(short)(s+1)

待续...

相关文章

网友评论

      本文标题:Java系列0 面试题

      本文链接:https://www.haomeiwen.com/subject/kwhtuqtx.html