频率较高的Java面试题
- 面向对象的三大特性:
封装:把数据和操作数据的方法绑定起来,暴露出想要暴露的方法,供其他类调用。
继承:是从已有类中获得信息创建新类的过程,提供信息的类叫做父类(超类,基类),继承的类为子类(派生类), 继承具有传递性。
多态(最精髓的东西):不同类型的对象对同一消息做出的不同的响应,条件:方法重写,父类引用指向子类对象 - java中多态的机制:运行时绑定,只有到需要的时候才会决定具体使用哪个类的哪个方法,并不是声明该类的方法
- java异常:
编译时异常:运行前的异常,都必须要显示处理;处理方式有两种(1)利用trycatch语句(2)定义方法时抛出异常
运行时异常:数组下标越界异常,类型转换异常,空指针异常,除数是0异常,IO异常,FilenotExist异常 - 下面的语句执行的结果是:3。 因为异常机制有一个原则,当try或者catch语句中有返回语句,会先执行finally语句,然后继续执行返回语句(防止一些流打开了没有关闭就返回,导致程序异常),可是当执行到第八行的时候语句已经返回,所以不会在执行catch中的语句
-
java基础类型所占字节数:
byte:1 short:2 char:2 int:4 float:4 double:8 long:8 boolean:1(有时多个boolean也只占一个字节) -
linkedhashmap有序
-
ArrayList 、HashSet、 HashMap都不是线程安全的,都没有加锁,使用下列方法可以变成线程安全的
-
java创建多线程的三种方式:(1)new thread对象(无参),重写run方法 ,并调用start方法;(2) new thread对象(参数为new runnable) (3)实现runnable接口,重写run方法;
-
java中wait()和sleep()的不同之处在于:wait会释放锁,而sleep会持有锁,wait通常用于线程间交互,sleep用于暂停执行
- synchronized 和volatile:
volatile:(1)保证了不同线程对这个变量操作的可见性,即一个线程修改这个变量的值,其他线程立即可见
(2)只能作用于变量
(3)不会造成线程阻塞
(4)不能被编译器优化
synchronized :(1)锁定当前变量,只有当前线程可以修改
(2)可作用于变量,方法,类
(3)可能造成线程阻塞
(4)可以被编译器优化 - 下面的代码的输入结果是:
输出结果一定小于1000,每一个线程运行时都有一个线程栈,线程栈中保存了线程运行时的变量的信息,但线程运行时,首先通过变量的引用找到变量在堆内存中的值,然后复制到线程栈中,当线程运行时修改的是线程栈中的值,线程运行完毕,会将线程栈中的值在传回到堆内存中,所以在图中的程序中就会出现线程安全问题,因此结果一般小于1000; -
线程池:事先将多个线程放到一个容器中,当使用的时候就不是去new线程,而是直接去线程池中拿线程即可,节省了开辟子线程的时间,提高代码执行效率
有点:(1)通过重复使用已创建的线程降低线程创建和销毁带来的消耗
(2)提高响应速度,当任务到达时,不需要等待线程创建就能立即执行
(3)提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅消耗系统资源,还会降低系统的稳 定性,使用线程池可以进行统一分配,调优和监控。