java基础面试题(二)附答案

java基础面试题(二)附答案

  1. 值传递和引用传递是什么?java是什么传递的?

    值传递意思是传递数据就是改数据原本

    引用传递是传递的数据的副本,就是拷贝了一份使用,基本类型是数值,引用类型是地址

    java使用的是值传递

  2. 重载和重写的区别?

    ​ 重载是发生在同一个类中的,相同方法名不同的参数的多个方法,执行不同的逻辑处理

    1. 重载发生在编译期

    2. 构造方法可以重载

    3. 重载的方法名相同,参数列表不同(个数、顺序、类型)

    4. 重载的返回值和访问修饰符可以不相同

      重写是发生在同一个子类中的,重写是子类对父类方法的重写构造;外部定义不能访问

      • 重写发生在运行器
      • 重写的方法必须名相同、参数相同
      • 重写的方法访问修饰符必须大于等于父类方法的访问修饰符
      • 重写的方法抛出的异常类型范围必须小于等于父类方法
      • 构造方法不能重写
      • 如果父类的方法是被final、private、static所修饰的则子类不能重写该方法
  3. 什么是深拷贝、什么是浅拷贝?

    • 浅拷贝是拷贝对象仅仅拷贝的是此对象本身(包括此对象的成员变量),而不包括该对象的引用所指的对象;实现方法,实现Cloneable接口,重写clone方法
    • 深拷贝是拷贝对象不仅仅拷贝的是此对象本身(包括此对象的成员变量),还不包括该对象的引用所指的对象
      • 实现方式有两种
        • 每一层的引用对象实现Cloneable接口,实现clone方法(实现复杂,但执行效率高)
        • 使用序列化接口实现深拷贝(实现简单,但效率低下)
  4. 接口和抽象类有什么区别?

    1. 接口使用interface声明;抽象类使用abstract声明
    2. 接口使用implement实现;抽象类使用extends实现
    3. 接口内部定义的都是public修饰的方法;抽象类里面的方法是任意的访问修饰符
    4. 接口可以使实例化对象;抽象类不能实例化对象
    5. 接口可以被实现多个;抽象类是能实现一个
    6. 接口里面不能有main方法;抽象类里可以有main方法
    7. 接口在JDK8之前不能有方法体(之后加入了可以写default方法),声明的都是抽象方法;抽象类可以声明实例方法和抽象方法
    8. 接口里面不能有构造方法;抽象类中可以有构造方法
  5. 请你说一下java支持的数据类型是什么?什么是自动拆箱?

    支持的数据类型是byte、short、int、long、double、float、char、string、boolean

    自动拆箱就是将引用类型数据拆箱成基本数据类型;装箱相反。

  6. 解释一下为什么会出现4.0-3.6=0.4000000001这种现象?

    这是java中对浮点类型数据的精度丢失;

    因为java计算是将浮点类型数据转换为二进制数据存放,转换的时候二进制可能表达的与原数据略有出入,则存入的数据也会有精度缺失,

    一般在科学计算或者其他权威的领域可以使用String+Bigdecimal来解决精度丢失问题。

  7. 请说明一下Comparable和Comparator接口的作用和他们的区别

    • Comparable和Comparator接口都是比较器接口
      • 实现Comparable接口要实现默认的ComparTo(Obj o)方法,值传入一个参数,像tree的集合的实现类一般都有实现比较器
      • 实现Comparator接口实现的方法是Compar(Obj o1,Obj o2)属于自定义的比较丰富,返具有返回值 根据返回值进行具体的排序实现
  8. 谈一谈反射创建对象

    反射是java程序运行中对自我的检查,并能操作内部的方法和属性

    反射创建对象有五种方式

    • Method类可以创建
    • Filed类可以创建
    • 构造方法方式创建 constructor
    • Object类创建
    • Class类创建
  9. StringBuffer和StringBuilder有什么区别?

    相同点:

    ​ 都是继承AbstractStringBuilder父类,都能存储字符数据,都是可变的字符串。

    不同点:

    • 线程安全:

      StringBuffer类下的方法都是使用了synchronize关键字所修饰,在相同的环境下,相比StringBuilder的线程安全。

    • 性能方面:

      由于StringBuffer操作需要获取锁和释放锁,性能相比StringBuilder慢一点,但是StringBuilder在相同的情况下要承担10%-15%的线程安全。

  10. 列举Object类的方法并简要说明

    1. HashCode()方法:获取对象的HashCode值
    2. equals()方法:基本类型比较值,引用类型比较地址
    3. wait()方法:线程等待方法
    4. notify()方法:线程的唤醒方法
    5. notifyAll()方法:线程的唤醒所有方法
    6. GetClass()方法:获取类对象
    7. clone()方法:复制对象的方法有深拷贝和浅拷贝
    8. toString()方法:转为字符串方法
    9. finalize()方法:垃圾回收时调用的方法,释放缓存等

猜你喜欢

转载自blog.csdn.net/weixin_44641846/article/details/115030529
今日推荐