前言
题目汇总来源 史上最全各类面试题汇总,没有之一,不接受反驳
春招的进度有些太快了,不知道现在开始学还来不来得及。跟着上面那篇公众号文章里的问题学的,顺便做个记录。
- 面试题汇总一 Java 语言基础篇
- 面试题汇总二 Java 多线程篇
- 面试题汇总三 Java 集合篇
- 面试题汇总四 JVM 篇
- 面试题汇总五 Spring 篇
- 面试题汇总六 数据库篇
- 面试题汇总七 计算机网络篇
目录
Object类的equal和hashCode方法重写,为什么?
String、StringBuffer、StringBuilder区别
静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用
反射中ClassLoader.loadClass和class.ForName区别
Java基础知识
面向对象三大特征
- 继承:子类继承父类的特征和行为
- 封装:隐藏内部实现,暴露公共行为
- 多态:不同对象对一个动作有不同表现
面向对象六大原则
- 单一职责原则 SRP:一个类只担负一个职责
- 开闭原则 OCP:类对扩展开放,对修改关闭
- 里式替换原则 LSP:引用基类的地方必须能透明地使用其子类对象
- 依赖倒置原则 DIP:依赖抽象接口,不依赖具体实现
- 接口隔离原则 ISP:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上
- 迪米特原则 LOD:低耦合,高内聚
Java可见性修饰符
public > protected > default > private
Java设计模式
Java中==和equals和hashCode的区别
1. 基本数据类型用==进行比较。
2. 引用使用==判断是否指向同一个对象,也可覆盖equals方法实现自定义判断。
3. hashCode生成hash码。同一对象一定生成相同的hash码
4. hashCode和equals的关系
-
同一对象上多次调用hashCode()方法,总是返回相同的整型值。
-
如果a.equals(b),则一定有a.hashCode() 一定等于 b.hashCode()。
-
如果!a.equals(b),则a.hashCode() 不一定不等于 b.hashCode()。此时如果a.hashCode() 总是不等于 b.hashCode(),会提高hashtables的性能。
-
a.hashCode() == b.hashCode() 则 a.equals(b)可真可假
-
a.hashCode() != b.hashCode() 则 a.equals(b)为假。
Object类的equal和hashCode方法重写,为什么?
- 如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
- 如果两个对象不equals,他们的hashcode有可能相等。
- 如果两个对象hashcode相等,他们不一定equals。
- 如果两个对象hashcode不相等,他们一定不equals。
- 若重写 equals(Object obj) 方法,有必要重写 hashcode() 方法,确保通过 equals(Object obj) 方法判断结果为true的两个对象具备相等的 hashcode() 返回值。说得简单点就是:“如果两个对象相同,那么他们的 hashcode 应该相等”。不过请注意:这个只是规范,如果你非要写一个类让 equals(Object obj) 返回 true 而 hashcode() 返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。
- 一个很常见的错误根源在于没有覆盖 hashCode 方法。在每个覆盖了 equals 方法的类中,也必须覆盖 hashCode 方法。如果不这样做的话,就会违反 Object.hashCode 的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括 HashMap、HashSet 和 Hashtable。
Java基本类型及其占用空间
byte | 1字节 |
short | 2字节 |
char | 2字节 |
int | 4字节 |
float | 4字节 |
boolean | 4字节 |
long | 8字节 |
double | 8字节 |
int与integer的区别
1. Integer是int的包装类,int则是java的一种基本数据类型
2. Integer变量必须实例化后才能使用,而int变量不需要
3. Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4. Integer的默认值是null,int的默认值是0
类变量初始化顺序
- 父类显式静态初始化代码块
- 子类显式静态初始化代码块
- 父类非静态实例初始化代码块
- 父类构造函数
- 子类非静态实例初始化代码块
- 子类构造函数
抽象类的意义
一个类中如果包含抽象方法,这个类应该用abstract关键字声明为抽象类。
意义:
1. 为子类提供一个公共的类型;
2. 封装子类中重复内容(成员变量和方法);
3. 定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的。
接口和抽象类的区别
抽象类:
包含抽象方法的类要用abstract修饰(虽然没有抽象方法也可以)。
和普通类一样可以有普通成员变量和方法。
接口:
接口中所有的方法不能有具体的实现。
变量会被隐式地指定为public static final变量
能否创建一个包含可变对象的不可变对象?
原公众号放答案了,自己看吧?
谈谈对java多态的理解
概念:
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。
父类引用指向子类对象,可以提高代码的灵活性和可扩展性。
实现条件:
继承、重写、向上转型。
实现形式:
继承和接口。
重载规则:必须具有不同的参数列表; 可以有不同的返回类型;可以有不同的访问修饰符;可以抛出不同的异常。
重写规则:参数列表必须完全相同;返回类型必须相同;访问修饰符的限制一定要大于等于被重写方法的访问修饰符;重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。