• Java面试复习题汇总


    文章目录

    第一组

    1,Java有哪些基本数据类型,对应的包装类型有哪些, 为什么需要包装类?

    byteByte
    shortShort
    intInteger
    longLong
    floatFloat
    doubleDouble
    charCharacter
    booleanBoolean

    基本数据类型不具备方法去使用,如果想通过基本数据类型来转换,不太方便,所以引出了包装类

    2,Java的访问修饰符及特点

    private:私有的,同一个类中可以被调用,不能用来修饰类

    default:默认的,类的同一个包下都可以调用,可以修饰类,变量,方法

    protected:受保护的,类的同一个包下面都可以调用,可以修饰类,变量,方法

    public:公共的,所有位置都可以被调用

    3,final关键字的用法

    final表示最终的,可以用来修饰类,变量,方法

    final修饰类,不能被继承

    final修饰变量,变量不能被重新赋值,final修饰的是常量,一般final修饰的变量都需要指定初始值

    final修饰方法,方法不能被重写

    4,static关键字的用法

    static是静态的意思,用来修饰类的变量和方法

    被static修饰的变量叫类变量,被static修饰的方法叫类方法,static也可以修饰代码块

    static修饰变量

    (1)static修饰的属性是可以共享的

    (2)如果所有对象有一个共同属性值的变量,可将其定义为静态的,用来节约空间

    static修饰方法

    (1)随着类的加载而加载

    (2)只有静态成员变量和静态方法

    static修饰的代码块叫静态代码块

    (1)在类加载时自动执行

    (2)只执行一次

    (3)可用于异常处理

    5,什么是里氏代换原则

    所有引用父类的地方对于子类来说都是透明的,子类都可以访问父类所有位置,并且如果替换成子类也不会出现异常或者错误

    但是反过来就不行,子类到达的地方,父类不一定能达到。

    第二组

    1, == 和 equals()方法的区别

    ==可以用来比较基本类型和引用类型
    用来比较基本类型的时候比较的是值
    用来比较引用类型的时候比较的是对象的地址值
    .equals()是Object中的方法,一般用来比较对象是否相同,想实现效果必须进行重写

    2,什么是封装以及封装的好处

    封装:是对象的一种隐藏技术,目的是将对象的属性和方法组织起来同时隐藏,不想把属性和方法的实现细节暴露出来,用户和其他对象看不到,也不能对其进行修改,将来只有通过指定的接口去调用对象的方法,才能达到通信的目的。通过private
    封装的好处: 将设计者和使用者分开,不会暴露属性及实现的方法,用户不需要知道实现的细节,只需要设计者提供方法来访问对象就行了

    3,什么是继承以及继承的好处

    继承: 多个类中,相同成员提取出来,定义到一个独立的类中,让当前类和独立类产生关系,使当前类具有独立类的内容
    写法是:class 子类 extends 父类{}
    继承的好处:提高代码的复用率,提高代码的维护性
    让类与类之间产生关系,是学习多态的前提

    4,什么是多态,多态的特点,多态的转型

    多态:一个对象,在不同时刻体现出来的不同状态。
    写法是:父类 对象名 = new 子类();
    多态的特点:有继承或者实现关系,有方法的重写,有父类或者父接口的引用指向子类对象
    多态的转型:向上转型,把子类对象看成是父类对象
    写法:Fu f = new Zi();它一定是安全的
    向下转型,把父类对象还原成子类对象,完成子类特有方法的调用
    写法:Zi zi = (Zi)f;它不一定安全,转换的前提是父类对象必须指向子类对象

    5,方法重载和重写的区别

    重载是同一个类中,根据参数的类型,个数和顺序,定义多个同名但是签名不同的方法,他的方法可以有不同的返回值类型,重载经常提供相似但功能不同的操作
    重写是在继承关系中,子类重新定义父类已有的方法,要求方法名,参数列表,返回类型完全相同,通过重写,子类可以改变父类方法的实现,从而实现自身特有的行为
    重载是同一个类中根据参数的不同定义多个同名的方法,用于提供相似但功能不同的操作
    重写是子类重新定义父类方法,用来改变自身的实现方法

    第三组

    1,成员变量和局部变量的区别

    声明位置不同
    成员变量:类中,方法外
    局部变量:类中,方法内
    初始值不同
    成员变量:可以不同赋值,系统默认给初始值
    局部变量:使用前必须赋值
    内存位置不同
    成员变量:堆
    局部变量:栈
    生命周期不同
    成员变量:随着对象的创建而存在,对象的消失而消失
    局部变量:随着方法的调用而存在,方法调用结束而消失

    2,this关键字的用法

    this.属性名:调用当前对象的属性
    this.方法名:调用当前对象的方法
    this():调用当前类的无参构造
    this(参数):调用当前类的有参构造

    3,super关键字的用法

    super.父类属性名:调用父类的属性
    super.父类方法名:调用父类的方法
    super():调用父类的无参构造函数
    super(参数):调用父类的有参构造函数

    4,什么是构造函数?构造函数的特点

    构造函数:在使用new关键词,创建类的对象时,调用的这个方法
    构造函数特点:没有返回值,
    名称必须与类名相同,
    参数可以是0,1,或多个,
    需要搭配new一起使用
    创建类后,系统默认一个无参构造

    5,抽象类 和 接口的区别

    在这里插入图片描述
    接口:总纲,起主导地位
    抽象类:模板式设计,不起主导地位

    第四组

    1,什么是自动装箱和自动拆箱

    自动装箱:将基本类型的值,直接赋值给对应的包装类对象。
    自动拆箱:将包装类型的对象,直接赋值给对应基本类型变量

    2,常见的5个运行时异常

    NullPointerException(空指针异常)
    ArrayIndexOutOfBoundsException(数组越界异常)
    ClassCastException(类转换异常)
    IllegalArgumentException(非法参数异常)
    ArithmeticException(算术异常)

    3,throw和throws区别

    throw声明在方法内
    throws声明在方法体中

    throw抛出一个具体的异常类型
    throws声明一个方法可能抛出的所有异常信息,表示将来异常的一种可能性,但并不一定发生异常

    throw需要用户自己捕获相关异常,然后再对其处理,最后将异常信息抛出
    throws通常不需要显式的捕获异常,由系统自动将异常抛给上级方法

    4,final、finally、finalize 三个的区别

    final 是一个修饰符,用于修饰类、方法和变量,分别表示不可继承、不可重写和不可修改。
    finally 是一个关键字,用于定义在异常处理中一定会被执行的代码块。

    finalize 是 Object 类的一个方法,用于对象的垃圾回收前的清理操作,

    5,String和StringBuffer、StringBuilder的区别

    String声明的字符不可变,可以看做是字符串常量,String的内容一旦改变,引用就改变了,可以看成是一个新的引用,所以,String类型做字符串拼接,比较耗时
    StringBuffer称为字符串缓冲区,提供了一些方法,可以改变该缓冲区中的数据,但是对应的引用没有改变,相对来说StringBuffer效率更快
    StringBuffer和StringBuilder ,他们都是字符串缓冲区,只不过StringBuffer的方法多了一个 synchronized关键字,它是线程安全的。多线程情况下,用StringBuffer,单线程就用StringBuilder

    第五组

    1,常见的数据结构及特点

    栈: 先进后出

    队列:先进先出

    数组:查询速度快,增删速度慢

    链表:查询速度慢,增删速度快

    : 每个节点都有0个或多个子节点

    ​ 没有父节点的节点叫做根节点

    ​ 每一个非父节点,有且仅有一个父节点

    ​ 除了根节点,每个子节点都可以分为多个不相交的子树

    ​ 查询和增删都很快

    2,Collection的体系结构

    在这里插入图片描述

    3,List集合的特点,Map的特点

    List接口是Collection接口的子接口,表示有序的序列,可以通过索引访问到List中的元素

    List中可以存放 重复的元素 ,并且可以存放null,存放多个null
    List接口中提供了 ListIterator,除了实现Iterator接口中的往后遍历的方法,还写了往前遍历的方法

    Map一次存储两个元素,一个是key(键),一个是value(值)
    Map中的key(键)是唯一的,
    Map中的value(值)是可以重复的,可以有null值

    4,ArrayList的特点

    ArrayList 底层是一个数组,具有数组的优点:查询更新速度快,增加删除慢
    可以存放null,多个null
    ArrayList 默认的初一个object空数组,初始值是10,随着元素的不断添加,该数组会扩充为原来数组长度的1.5倍
    适合频繁进行查询时使用
    数组长度不可变但是集合长度可变
    线程是不安全的

    5,HashMap的特点

    键值对存储
    快速查询
    无序存储
    不允许键重复
    允许存放空键和空值
    非线程安全
    容量可调
    迭代顺序不确定

    第六组

    1,写一个冒泡排序

    在这里插入图片描述

    2,写一个快速排序

    在这里插入图片描述

    3,写一个面向对象的代码示例,私有化属性,添加构造方法、get/set方法子类继承父类,重写父类方法,创建特有方法使用多态方式创建对象,分别调用父类方法、子类方法

    在这里插入图片描述

    4,写一个抽象类和子类的示例

    在这里插入图片描述

    5,写一个接口和实现类的示例

    在这里插入图片描述

    6,写一个ArrayList,往ArrayList中存放元素并遍历

    在这里插入图片描述

    7,写一个HashMap示例,往Map中存放元素并遍历

    在这里插入图片描述

    8,写一个通过io读写的示例

    在这里插入图片描述

  • 相关阅读:
    Efficient Decision-based Black-box Adversarial Attacks on Face Recognition
    10月TIOBE榜Java跌出前三!要不我转回C#吧
    JVM之【运行时数据区2——堆】
    Java23种设计模式-创建型模式之建造者模式
    java版Spring Cloud之Spark 离线开发框架设计与实现
    从0开发一个Chrome插件:用户反馈与更新 Chrome 插件
    从一到无穷大 #13 How does Lindorm TSDB solve the high cardinality problem?
    YYDS!由浅入深学习阿里JDK源码,已在阿里内部疯拿3个金奖
    burp改返回包(Burp Suite抓包使用步骤)
    利用开源代码提高写代码能力
  • 原文地址:https://blog.csdn.net/qq_51944132/article/details/132651478