1,JDK 和 JRE JVM 有什么区别?

JDK: 提供了java的开发环境和运行环境
JRE: 为java的运行提供了所需环境
JVM:JDK包含了JRE,同时还包含了编译java源码的编码器,还包含了很多java程序调试和分析的工具。

2、面向对象的基本特征

封装,继承,多态,抽象

3、有了基本数据类型,为什么还需要包装类型?

因为java是一个面向对象的语言,然而基本数据类型不具备面向对象思想的特点,当我们把基本数据类型包装成包装类型之后 它就有了面向对象的特征

4,== 和equals区别

==:比较基本数据类型,比较的就是值是否相等,比较引用数据类型(引用地址值)是否相等。
equals:比较引用地址值是否相等

5、String和StringBuilder和StringBuffer的区别?以及什么场景下使用StringBuilder什么场景使用StringBuffer?

String:是不可变的(字符串常量),string底层是有final修饰的char数组,由于不可变,进行字符串操作每次都会生成新的string对象,然后将指针指向新的string对象
stringBuffer:没有被final修饰,即可变 ,里面的方法都使用synchronized修饰,线程安全
stringBulider:字符串变量,线程不安全,效率高。适合单进程下对字符缓冲区进行大量操作

6,实现一个拷贝文件的工具类使用字节流还是字符流?

拷贝文件不确定是包含字符流,有可能有字节流(图片,声音,图像等),为考虑到通用性,使用的字节流。

7,讲一下什么是设计模式?常用的设计模式有哪些?

设计模式:就是经过前人无数次的实践总结出的,设计过程中可能反复使用的,可以解决特定问题的设计方法。
设计模式分3大类:创建模式,结构模式,行为模式 每个类里面还有很多设计模式 共23种

8,final finally finalize 区别?

final:可以用来修饰类,变量,方法,修饰类表示不能被继承;修饰方法表示改方法不能被重写;修饰变量表示改变量不能被重新赋值。
finally:一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally中,表示不管是否出现异常,该代码都会执行。一般用来存放一些关闭资源的代码。
finalize:是一个方法,属于object类的一个方法,而objest类是所有类的父类,改方法一般有垃圾回收器来调用,我们当调用system.gc()方法的时候没有垃圾回收器调用finalize().

9,静态变量与实例变量,普通变量的区别

  1. 静态变量:静态变量由于不属于任何实例对象,属于类。所以在内存中会有一份,在类的加载过程中,jvm之为静态变量分配一次内存空间。<br /> 实例变量:每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量

10,重载与重写的区别?重载的方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于重载实现的是编译时的多态性,而重写实现的是运行时的多态性。
重载:发生在同一类中,方法名相同参数列表不同(参数类型不同,个数不同,顺序不同),于方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
重写:发生父子类中,方法名参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类(里氏换原则);如果父类方法访问修饰符为private这子类中就不是重写。

11,抽象类和接口的区别?

抽象类是用来捕捉子类的通用特性的,接口是抽象方法的集合。
从设计层来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范
相同点: 接口和抽象类都不能实例化 都位于继承的顶端,用于被其他实现或继承
都包含抽象方法,其子类都必须覆写这些抽象方法
不同点:抽象类 ,接口

12,如何将字符串反正?

使用stringbuilder 或者stringbuffer 的reverse()方法

13,BIO 和 NIO 和 AIO 有什么区别?
BIO:同步阻塞式IO ,就是我们平时使用的传统IO ,它的特点是模式简单使用方便,并发处理能力低。
NIO:同步非阻塞IO,是传统IO的升级,客户端和服务器端通过Channel(通道)通讯,实现了多路复用。
AIO:是NIO的升级,也叫NIO2,实现了异步非阻塞IO,异步IO的操作基于事件和回调机制