1 JVM、JRE和JDK
1.1 JVM
Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
1.2 JRE
JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java虚拟机(JVM),Java类库,java命令和其他的一些基础构件。但是,它不能用于创建新程序。
1.3 JDK
JDK是Java Development Kit,它是功能齐全的Java SDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。
2 重载与重写
重载:发生在同一个类中,方法名必须相同,参数类型、个数、顺序不同,返回值和权限修饰符可以不同,发生在编译时。
重写:发生在继承时,方法名和参数列表必须相同,返回值范围小于父类,抛异常范围小于等于父类,权限修饰符范围大于等于父类;父类是private修饰的话子类就不能重写改方法。
3 三大特性
3.1 封装
封装就是把一个对象的属性私有化,同时提供一些可以被外界访问属性的方法。
3.2 继承
继承是用来扩展类的,子类可以继承父类的非私有属性和方法,增加多样性。
3.3 多态
多态已封装和继承为基础,根据运行时对象实际类型使同一行为具有不同表现形式。
4 反射
在运行状态中,对于任意一个类都能知道它的所有属性和方法,对于任意一个对象都能调用它的任意方法和属性,这种动态获取信息及调用对象方法的功能称为反射,缺点是破坏了封装性及泛型约束。
5 equals和==的区别
- ==是判断两个变量或实例是不是指向同一个内存空间;equals是判断两个变量或实例所指向的内存空间的值是不是相同 ;
- ==是指对内存地址进行比较 ;equals()是对字符串的内容进行比较
- ==指引用是否相同;equals()指的是值是否相同
6 equals 和 hashCode 的关系
每个对象都有默认散列码,值由对象存储地址得出。字符串散列码由内容导出,值可能相同。为了在集合中正确使用,一般需要同时重写 equals 和 hashCode,要求 equals 相同 hashCode 必须相同,hashCode 相同 equals 未必相同。
7 Object都有那些方法
- equals:检测对象是否相等,默认使用 == 比较,可以重写该方法自定义规则。
- hashCode:每个对象都有默认散列码,值由对象存储地址得出。字符串散列码由内容导出,值可能相同。
- toString:默认打印表示对象值的一个字符串。
- getClass:返回对象所属类的 Class 对象。
- wait:阻塞持有该对象锁的线程。
- notify:唤醒持有该对象锁的线程,notify 随机唤醒一个线程,notifyAll 唤醒全部线程。
8 八大基本数据类型
9 简述序列化
- Java对象在JVM退出时会全部销毁,如果需要将对象持久化就要通过序列化来实现,将内存中的对象保存在二进制流中,需要时再将二进制流反序列化成对象。
- 对象序列化保存的是对象的状态,属于属性的静态变量不会被序列化。
常见的三种序列化
Java原生序列化
Hessian序列化
JSON序列化
- Java 原生序列化,实现 Serializabale 标记接口,兼容性最好,但不支持跨语言,性能一般。序列化和反序列化必须保持序列化 ID 的一致,一般使用 private static final long serialVersionUID 定义序列化 ID,如果不设置编译器会根据类的内部实现自动生成该值。
- Hessian 序列化,支持动态类型、跨语言。
- JSON 序列化,将数据对象转换为 JSON 字符串,抛弃了类型信息,反序列化时只有提供类型信息才能准确进行。相比前两种方式可读性更好。
- 注意:序列化通常使用网络传输对象,容易遭受攻击,因此不需要进行序列化的敏感属性应加上 transient 关键字,把变量生命周期仅限于内存,不会写到磁盘。
10 简述泛型
泛型本质是参数化类型,解决不确定对象具体类型的问题,可以在类或方法中预支地使用未知的类型。
- 好处:
- 类型安全,不存在ClassCastException
- 提升可读性,编码阶段就显式知道泛型集合、泛型方法等处理的数据类型。
11 抽象类和接口的区别
相同点
- 都不能被实例化
- 接口实现类或抽象类的子类都只有实现了接口或继承抽象类才能用
不同点
- 抽象类是用来捕捉子类的通用特性的;接口是抽象方法的集合
- 抽象类可以有定义和实现;接口只有定义,不能有方法的实现
- 继承抽象类用extends;实现接口用implements
- 抽象类强调所属关系;接口强调特定功能的实现
- 抽象方法用abstract修饰,只能被public或protect修饰,不带花括号;接口成员变量默认用public static final修饰,成员方法用public abstract修饰