java面试题 --- 基础

前段时间给大家发过一份 java 面试题的思维导图,接下来我会用通俗、简洁、易记的话将其整理成一系列的文章,加深自己印象的同时,也希望能助大家跳槽成功!


1. 说说 java 的基本数据类型以及所占的字节数。

  • byte、short、int、long,1、2、4、8;boolean、char、float、double,1、2、4、8。

2. 谈谈你对接口和抽象类的理解。

  • 抽象类是对一组事务的共同点进行提取,比如猫和狗,对它们的共同点进行提取,抽象成一个动物类;
  • 接口是对一组行为的规范,实现接口就必须实现接口里面定义的方法,比如 List 接口规范了它有 add、remove 等方法,那么 List 的实现类就必须按照它的规范去实现 add、remove 等方法。

3. 各权限修饰符有什么区别?

  • public 修饰的任一地方都可以访问;
  • protect 修饰的同一包下的以及它的子类可以访问;
  • 不写(default),只有同一包下的可以访问;
  • private 修饰的只有当前类以及当前类的内部类能访问。

4. switch 可以作用在哪些类型上?

  • byte、short、int、char、String、enum

5. 什么是内部类?优点是什么?

  • 写在一个类里面的类,叫做内部类。优点是对外部不可见,有很好的封装性,而且可以访问私有变量。

6. 什么是 java 的多态?

  • 多态就是要到运行时才能确定类型,体现为重载和重写。

7. 为什么重写了 equals 方法就要重写 hashCode 方法?

  • 因为有个规定,两个对象相等那么 hashCode 值就得相同,而 hashCode 值本来是根据对象在内存中的地址值计算出来的,对象不同那么 hashCode 一定不会相同,所以如果重写了 equals 方法,就一定得重写 hashCode 方法。

8. 类的初始化顺序你知道吗?

  • 加载的先后顺序是:父类静态成员变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。

9. String、StringBuffer 和 StringBuilder有什么不同?

  • String 用 final 修饰了,是不可变的,重新赋值会指向新的对象,因为 final 修饰,所以线程安全;
  • JVM 中有个字符串常量池,jdk1.7 之前这个常量池在方法区,也就是永久代,jdk1.7 及之后字符串常量池在堆内存中;
  • new 一个 String 对象的时候,会在堆内存中生成对象,同时把这个对象放到字符串常量池中;
  • 直接赋值 String 的时候,首先会看字符串常量池中有没有,有就直接拿来用,没有就先往常量池放一份再拿来用;
  • 用加号拼接字符串,如果是两个常量拼接,编译期就直接拼接好,然后放到常量池中,如果有变量拼接,那就会调用 StringBuilder 的 append 方法在堆中生成新对象,但是这个并不会放到常量池中;
  • 它有个 intern 方法,jdk1.7 以前,会把该方法的调用者放到常量池中,jdk1.7 及之后,会把调用者的引用放到常量池中。
  • StringBuffer 是线程安全的、可变的,效率较低;
  • StringBuilder 线程不安全、可变,效率较高。

10. Math.round(11.5) 和 Math.round(-11.5) 的结果分别是什么?

  • 12 和 -11,四舍五入是操作数加上 0.5 然后向下取整。

11. float f = 3.4、short s = 1, s = s + 1、s += 1 是否正确?

  • float f = 3.4 是错误的,浮点型默认是 double,double 类型的用 float 接收属于向下转型,需要强转;
  • short s = 1 是错误的,整型默认是 int,int 类型用 short 接收也是向下转型,要强转;
  • s = s + 1还是错误的,需要强转;s += 1 是正确的,+= 隐含了强转。

12. 假如 Integer i1 = 150,Integer i2 = 150,那么 i1 和 i2 是否相等?

  • Integer 有个缓冲池,-128~127这个范围内的直接从缓冲池取出,超过这个范围会在堆中生成新对象,所以 i1 和 i2 不相等。

13. 与(&)、或(|)、异或(^) 操作符你知道吗?

  • 与,都为 1 时结果才为 1;
  • 或,有 1 时结果就为 1;
  • 异或,一个为 0 一个为 1 时结果才是 1。

14. java 反射怎么理解?

  • 在运行过程中可以获取任意一类的任意属性和方法,可以调用任意一类的属性和方法,这种动态获取信息动态调用对象的机制叫反射。

15. 反射有几种方式?

  • 反射有三种方式,一种是通过对象调用 getClass() 方法;
  • 一种是用 Class.forName("className") 方法;
  • 还有一种是直接 对象.class 。

16. 反射有什么优缺点?

  • 优点是可以动态判断类型,动态加载类,提高代码的灵活性;
  • 缺点是反射需要经过一系列的 JVM 操作,性能不太好。

17. 反射的应用场景有哪些?

  • 比如 JDBC 加载数据库驱动、动态代理、Spring xml 方式加载 bean。

18. java 中的异常体系你知道吗?

  • 最顶层的抽象类是 Throwable,它有两个子类,Error 和 Exception;
  • Error 是虚拟机无法处理的系统错误,比如栈内存溢出 StackOverflowError、内存溢出 OutOfMemoryError;
  • Exception 是异常,分为编译期异常和运行时异常;
  • 编译期异常就是程序必须处理的,不处理你的开发工具就会有错误提示的,比如 IOException、ClassNotFoundException;
  • 运行时异常就是要等程序运行时才会发生的异常,比如 NullPointerException、IndexOutOfBoundsException、ConcurrentModificationException 等。

19. 异常可以怎么处理?

  • 抛出(Throw)、捕获(try catch)、声明(Throws)。

20. 你知道 finally 吗?

  • finally,配合 try catch 使用,try 中写要捕获异常的代码, catch 中写捕获到异常后的操作,finally 中写一定要执行的代码,比如关闭资源、释放连接等。

21. finally 中的代码一定会执行吗?

  • 在程序发生异常之前或 try 中的代码块正常执行完之前,调用了 System.exist(),finally 中代码不会执行;
  • 程序所在线程死亡,finally 中的代码不会执行。

22. 在 try 或 catch 中调用了 return,finally 还会执行吗?

  • 会,且在 return 之前执行。

推荐阅读更多精彩内容