【Java进阶营】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 是异常,分为编译期异常和运行时异常;在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
    编译期异常就是程序必须处理的,不处理你的开发工具就会有错误提示的,比如 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 之前执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值