JAVA面试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA面试题相关的知识,希望对你有一定的参考价值。

1、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 

重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)

重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

2、String和StringBuilder、StringBuffer的区别?

String是只读字符串,也就意味着String引用的字符串内容是不能被改变的

StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改

StringBuilderJava 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要

3.存在使i + 1 < i的数吗()

答案:存在

解析:如果i为int型,那么当i为int能表示的最大整数时,i+1就溢出变成负数了,此时不就<i了吗。

扩展:存在使i > j || i <= j不成立的数吗()

答案:存在

解析:比如Double.NaN或Float.NaN

4、最近还遇到一个面试题,也是和自动装箱和拆箱有点关系的,代码如下所示:

 

[html] view plain copy
 
 技术分享技术分享
  1. public class Test03 {  
  2.   
  3.     public static void main(String[] args) {  
  4.         Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;  
  5.   
  6.         System.out.println(f1 == f2);  //true  
  7.         System.out.println(f3 == f4);  //false  
  8.     }  
  9. }  

 

 

 

 

 

简单的说,如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是true,而f3==f4的结果是false。

5、&和&&的区别? 

&运算符有两种用法:(1)按位与;(2)逻辑与;二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true

&左边如果不成立,还会验证右边;&&左边不成立就退出(短路运算)

6、阐述final、finally、finalize的区别。 
答: 
- final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。 
- finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。 
- finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。

 

7、Java支持的数据类型有哪些?什么是自动拆装箱

Java语言支持的8中基本数据类型是:

  • byte
  • short
  • int
  • long
  • float
  • double
  • boolean
  • char

自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。

 

8.进程和线程的区别是什么?

进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

9.如何确保N个线程可以访问N个资源同时又不导致死锁?

使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。

比如资源ABCD ,那所有线程必须获取了A资源再去 申请B资源 , 类推

10. 下面程序的运行结果是什么()

技术分享
class HelloA {

    public HelloA() {
        System.out.println("HelloA");
    }
    
    { System.out.println("I‘m A class"); }
    
    static { System.out.println("static A"); }

}

public class HelloB extends HelloA {
    public HelloB() {
        System.out.println("HelloB");
    }
    
    { System.out.println("I‘m B class"); }
    
    static { System.out.println("static B"); }
    
    public static void main(String[] args) { 
     new HelloB(); 
   }

}
技术分享

答案:

static A
static B
I‘m A class
HelloA
I‘m B class
HelloB

解析:说实话我觉得这题很好,考查静态语句块、构造语句块(就是只有大括号的那块)以及构造函数的执行顺序。

对象的初始化顺序:(1)类加载之后,按从上到下(从父类到子类)执行被static修饰的语句;(2)当static语句执行完之后,再执行main方法;(3)如果有语句new了自身的对象,将从上到下执行构造代码块、构造器(两者可以说绑定在一起)。

 

以上是关于JAVA面试题的主要内容,如果未能解决你的问题,请参考以下文章

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

前端面试题之手写promise

一道经典面试题:字符串在Java中如何通过“引用”传递

Java之String相关内容详解(字符串和字符串常量池)面试题

JAVA基础面试题

Java面试题及答案2020,java登录界面代码