JAVA基础面试题

一、JDK 和 JRE 有什么区别?

        JDK (Java Development Kit),java 开发工具包

        JRE (Java Runtime Environment),Java 运行环境

        JDK 中包含JRE,JDK 中有一个名为 jre 的目录,里面包含两个文件夹 bin 和 lib bin 就是JVM ,lib 就是 JVM 工作所需要的类库

二、== 和 equals 的区别?

        == 既可以比较基本数据类型,也可以比较引用数据类型:

                基本数据类型:比较的是值

                引用数据类型:比较的是地址

        equals 只能用于比较引用数据类型:

                如果没有重写 equals方法,equals 相当于 ==

                如果重写了equals方法,equal比较的是对象的内容

三、final 关键字的作用?

        (1)用来修饰类:

                被 final 修饰的类为最终类,不能被继承

        (2)用来修饰方法:

                被 final 修饰的方法为最终方法,不能被重写,但可以被继承

        (3)用来修饰变量:

                被 final 修饰的变量为常量,不能重新赋值

四、普通类和抽象类有什么区别?

        (1)抽象类不能被实例化

        (2)抽象类可以有抽象方法,只需声明,无需实现

        (3)有抽象方法的类一定是抽象类

        (4)抽象类的子类必须实现抽象类中的所有抽象方法

        (5)抽象方法不能声明为静态,不能被 static 、final 修饰

五、接口和抽象类有什么区别?

        (1)接口:

                1.接口使用 interface 修饰

                2.接口不能实例化

                3.类可以实现多个接口

                4.java8之前,接口中的方法都是抽象方法,省略了 public abstract ,java 8之后,接口中可以定义静态方法,静态方法必须有方法体,普通方法没有方法体,需要被实现

        (2)抽象类

                1.抽象类使用 abstract 修饰

                2.抽象类不能被实例化

                3.抽象类只能单继承

                4.抽象类中可以包含抽象方法和普通方法,普通方法需要有方法体

                5.如果一个类继承了抽象类:

                        如果实现了所有的抽象方法,子类可以不是抽象类

                        如果没有实现所有的抽象方法,子类仍然是抽象类

六、 java 中的 IO 流分为几种?

        (1)按流划分:可以分为输入流输出流

        (2)按单位划分:可以分为字节流字符流

                字节流:inputStream 、outputStream

                字符流:reader 、writer

七、BIO 、BIO 、AIO 有什么区别? 

        (1)BIO:同步阻塞IO

                一个连接一个线程

                BIO就是我们平常使用的传统IO,它的特点是模式简单,使用方便,并发处理能力底

                客户端在请求数据的过程中,保持一个连接,不能做其它事情

        (2)NIO:同步非阻塞IO

                一个请求一个线程

                NIO是传统IO(BIO)的升级,客户端和服务端通过 Channel (通道)通讯,实现了多路复用

                客户端在请求数据的过程中,不用保持一个连接,不能做其他事情 

        (3)AIO:异步非阻塞IO

                一个有效请求一个线程

                AIO是 BIO 的升级,实现了异步非阻塞

                客户端在请求数据的过程中,不用保持一个连接,可以做其他事情

八、什么是反射?

        反射就是将类的各个组成部分封装对象的过程

                (1)把类 - 封装为 class 类的对象

                (2)把成员变量 - 封装为 Field 类的对象

                (3)把构造方法 - 封装为 Constructor 类的对象

                (4)把成员方法 - 封装为 Method 类的对象

        好处:

                (1)可以在程序运行的过程中,获取一个类的所有信息,并操作这些对象

                (2)可以解耦,提高程序的可扩展性

九、深拷贝和浅拷贝的区别?

        (1)浅拷贝是指:只会拷贝基本数据类型的值,以及实例对象的引用地址,并不会拷贝引用地址所指向的对象,也就是浅拷贝出来的对象,内部的属性指向的是同一个对象

        (2)深拷贝是指:即会拷贝基本数据类型的值,也会拷贝实例对象的引用地址所指向的对象,深拷贝出来的对象,内部的属性指向的不是同一个对象 

十、throw 和 throws 的区别?

        (1)throw:作用在方法内,表示抛出具体异常,由方法体内的语句处理,一定抛出了异常

        (2)throws:作用在方法声明上,表示抛出异常,由调用者来进行异常处理,可能出现异常,不一定会发生异常

十一、String 、StringBuilder 、StringBuffer 的区别?

        (1)String 是不可变的,如果尝试去修改,会生成一个字符串对象,StringBuilder 和 StringBuffer 是可变的,StringBuilder 和 StringBuffer 都是在原对象的基础上操作

        (2)StringBuilder 是线程不安全的StringBuffer 是线程安全的,所以在单线程环境下,StringBuilder 的效率更高

        (3)对于操作的效率而言,StringBuilder > StringBuffer >String

十二、 Java 中的异常体系?

        (1)java 中的所有异常都来自顶级父类 Throwable 

        (2)Throwable 下有两个子类 Exception 和 Error

        (3)Error 是程序无法处理的错误,一旦出现这个错误,则程序将被迫停止运行

        (4)Exception 不会导致程序停止,又分为两个部分 RuntimeException 运行时异常和 CheckedException  检查异常

        (5)RuntimeException 常常发生在程序运行过程中,会导致程序当前线程执行失败

        (6)CheckedException 常常发生在程序编译过程中,会导致程序编译不通过

十三、final 、finally 、finalize 有什么区别?

        (1)final 可以修饰类、变量、方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写

        (2)finally 需配合 try catch 使用,用于异常的处理,finally 代码块中的语句无论是否发生异常都会执行,常用于关闭资源

        (3)finalize 是 Object 类中的方法,用于垃圾回收,一般情况下不需要我们重写

十四、List 和 Set 的区别?

        (1)List :有序,按对象进入的顺序保存对象,可重复,允许多个 Null 元素对象,可以使用 Iterator 取出所有元素,在逐一遍历,还可以使用 get ( int index ) 获取指定下标的元素

        (2)Set :无序,不可重复,最多允许有一个 Null 元素对象,取元素时只能用 Iterator 接口取出所有元素,在逐一遍历各个元素

十四、队列 和 栈是什么?有什么区别?

        队列 和 栈 是两种不同的数据结构,都是用来存储数据的

        区别:

        (1)操作的名称不同:队列的 插入 称为 入队,队列的 删除 称为 出队。栈的插入 称为 进栈,栈的删除 称为 出栈

        (2)可操作的方向不同:队列是在队尾入队,队头出队,即两边都可操作,而栈的进栈和出栈都是在栈顶进行,无法对栈底直接进行操作

        (3)操作的方法不同:队列是 先进先出(FIFO),而栈为先进后出(FILO)

十五、方法重载和方法重写的区别?

        (1)重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和权限修饰符可以不同,发生在编译时

        (2)重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,权限修饰符范围大于等于父类,如果父类方法的权限修饰符为 private 则子类就不能重写该方法

十六、Java 中有哪些类加载器?

        JDK 自带有三个类加载器:BootstrapClassLoader ExtClassLoader AppClassLoader

        (1)BootstrapClassLoader 是 ExtClassLoader 的父类加载器,默认负责加载 %JAVA_HOME%lib 下的 jar 包和 class 文件

        (2)ExtClassLoader 是 AppClassLoader 的父类加载器,默认负责加载 %JAVA_HOME%lib/ext 文件夹下的 jar 包 和 class 类

        (3)AppClassLoader 是自定义类加载器的父类,负责加载 claspath 下的类文件

十七、

                 

                 

        

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值