# Java 面试题汇总及解答
让天下没有难拿的 Offer。欢迎在 Issue 中提出你遇到的或想得到解答的面试问题,或者你觉得某个某个问题有更好的解答,也欢迎 PR & Issue。
持续更新中...
## 基础篇
### 基本功
- 面向对象的特征
- 封装
- 继承
- 多态
- final, finally, finalize 的区别
- final
- final 修饰类,表示该类不可以被继承
- final 修饰变量,分两种情况,如果修饰的是基本类型变量,那么只能被赋值一次,不能被赋值两次,
如果修饰的是引用类型变量,那么引用指向的内存地址将不可变,但是引用类型内的属性可以被修改
- final 修饰方法,表示该方法不可以被子类重写,但是可以被子类继承使用
- finally
- finally 跟随 `try{}` 代码块,`try{}finally{}`
- finally 跟随 `try{}catch{}` 代码块, `try{}catch{}finally{}`,
一般情况都是在`finally`代码块
写释放资源类代码,例如 数据库连接,流的关闭等,保证代码始终会被执行到
- finally 的执行需要注意,只有当代码执行到`try`代码块的时候,`finally`才会执行,如果`try{}catch{}`内部都有
return 语句,那么最终返回的结果,将是`finally` return的结果,
- finalize 的使用跟作用
- finalize 是顶级父类 `Object` 内的方法,所有子类都会继承该方法
- finalize 方法,当JVM发现这个特定实例应该被垃圾收集时,会调用`finalize`方法,这样在该方法内可以做任何操作,例如阻止被垃圾回收等
- finalize 的调用,是JVM触发调用,不是自己调用
- int 和 Integer 有什么区别
- int 是JAVA八个基本类型中的一个,它的值范围为 `2147483648~2147483647`,占用4个字节,32位
- Integer 是引用类型,包装了基本类型中的`int`
- int的初始化可以是 `int a = 1`,而 `Integer`的初始化可以是 `Integer a = 1` 或者 `Integer a = new Integer(1)`
- Integer 缓存了 `-128~127` 范围数值在内部的一个数组内,该数值范围可以通过启动虚拟机参数 `-XX:AutoBoxCacheMax=` 进行设置大小
并且在该范围内用==比较另外一个Integer的时候,实际上是int类型的比较,不过不推荐该方式,包装类型尽量使用`equals`来进行比较
- 重载和重写的区别
- 重载
- 重载是在编译的时候就确定执行哪个方法
- 重载的签名,只有参数类型,参数个数,参数顺序参与签名,返回值不参与签名
- 在同一个类中,如果方法名称一致,但是 参数个数,参数类型,参数顺序不一致,称之为重载,其中 `参数个数>参数类型>参数顺序,如果参数类型都一致`,
但是顺序不同,是不算重载的
- 重写
- 重写存在子类继承父类中,其中子类定义一个方法,该方法的方法名,参数,类型都跟父类一致,称之为重写
- 重写是多态的表现形式之一,重写的方法,只有在运行的时候,才能确定具体调用的是父类的方法还是子类的方法
- 抽象类和接口有什么区别
- 抽象类
- 抽象类可以没有抽象方法,但是有抽象方法的类一定是抽象类
- 一个类只能继承一个类,也就是只能继承一个抽象类
- 抽象类内部,可以有抽象方法,也可以没有抽象方法,如果是抽象方法,那么如果子类不是抽象类,那么必须实现抽象方法
- 抽象类不可以被直接实例化,它只是对一个事物的抽象,只能被声明,不能被实例化
- 抽象类内 属性跟方法默认的访问权限都是 `protected`
- 抽象类内部可以定义 `private`的属性跟方法
- 定义抽象类是使用在类名前加入 `abstract`
- 接口
- 接口是一系列方法的申明,JDK1.8之前接口内只有方法声明,没有方法的实现,JDK1.8后,接口可以定义默认的实现
- 接口只负责定义方法,具体的实现,将有子类去实现
- 接口所有方法,默认的访问权限都是 `public`
- 接口不能被直接实例化,因为它也是对一个事物的抽象,只能申明,不能被实例化
- 一个类可以实现多个接口
- 接口内部不能定义 `private`的方法,因为私有方法没有实现是没有意义的
- 定义接口是使用 `interface`
- 说说反射的用途及实现
- 说说自定义注解的场景及实现
- HTTP 请求的 GET 与 POST 方式的区别
- session 与 cookie 区别
- session 分布式处理
- JDBC 流程
- MVC 设计思想
- equals 与 == 的区别
- 要理解 `equals` 跟`==` 的区别,首先我们要知道java里面只有基本类型跟引用类型,基本类型存储在`栈`中,而引用类型存储在`堆`内
- `==`既可以用于基本类型的比较,也可以用于引用类型的比较,但是两者用`==`比较是有不同的
- `==`比较基本类型的时候,比较的是值大小例如:
```java
//基本类型用 == 比较,其实比较的是 值
int a = 1;
int b = 1;
//打印结果为 true 因为 1==1 是真
System.out.println(a == b);
//引用类型使用==比较,比较的实际上是在堆内的内存地址,例如:
User u1 = new User();
User u2 = new User();
//打印结果为 false 因为两个对象的内存地址不相等
System.out.println(u1==u2);
```
- 所以基本类型用`==`比较是没有问题的,但是引用类型却不能使用`==`比较,因为两个引用类型在内存中的地址是不一样的,用`==`比较两个引用类型会得到false
- String最好也不好用`==`比较,虽然常量池内会预先保留一些字符串,但是避免万一,String最好还是用`equals`来进行比较
- `euqals`只能用于比较引用类型,它是超类`Object`的方法,默认的实现是`==`比较,也就是`默认比较两个引用对象的内存地址值`,所以我们要判断两个引用类型是否相等,不能通过内存地址去比较,一般是通过引用类型内部的属性的比较,来判断两个引用类型是否相等,例如:
> 有个User对象,内部定义了 name,age,id 三个属性,我们可以认为,只要这三个属性相等,就是同一个对象,这时候我们就可以重写`equals`方法来判断,毕竟,OOP的面向对象,就是对现实世界的抽象嘛..
- 总结
- `==` 在用于基本类型比较的时候,比较的是基本类型的值是否相等
- `==` 在用于引用类型比较的时候,比较的是内存地址是否相同
- `equals`在引用类型重写了`Object`方法的时候比较的是自己定义的比较方式,如果没有重写该方法,那么默认使用的是`==`比较,也就是比较两个对象的内存地址
### 集合
- List 和 Set 区别
- List 和 Map 区别
- Arraylist 与 LinkedList 区别
- ArrayList 与 Vector 区别
- HashMap 和 Hashtable 的区别
- HashSet 和 HashMap 区别
- HashMap 和 ConcurrentHashMap 的区别
- HashMap 的工作原理及代码实现
- ConcurrentHashMap 的工作原理及代码实现
### 线程
- 创建线程的方式及实现
只有一种创建线程的方式:new Thread();Executors,ThreadPoolExecutor 等线程池做了线程的管理和复用,但最终依旧是通过 new Thread() 来创建线程;Runnable,Callable 创建的是任务,最终需要依托于线程去运行,和线程有本质的区别。
- sleep() 、join() 、yield() 有什么区别
sleep() 常用于让线程当前线程睡眠一段时间之后再执行。running -> blocked
join() 常用于控制多个线程的执行次序,例如可以将两个交替执行的线程调度为顺序执行.比如在B线程中调用A线程的 join() 方法,直到A线程执行完毕,B线程才会继续执行.在B线程中表现为 running -> blocked
yield() 不常�
Vighzhen
- 粉丝: 9
- 资源: 9
会员权益专享
最新资源
- 很棒的毕业设计、课程设计、练手的java项目-员工工资管理系统(文档+视频+源码齐全).rar
- 很棒的毕业设计、课程设计、练手的java项目-学生选课系统(文档+视频+源码齐全).rar
- 很棒的毕业设计、课程设计、练手的java项目-学生选课成绩信息管理系统(ER图文档+视频+源码齐全).rar
- 很棒的毕业设计、课程设计、练手的java项目-学生信息管理(文档+视频+源码齐全).rar
- 很棒的毕业设计、课程设计、练手的java项目-图书管管理系统(视频+源码齐全).rar
- 很棒的毕业设计、课程设计、练手的java项目-汽车租赁管理系统(详细文档+视频+源码齐全).rar
- 很棒的毕业设计、课程设计、练手的java项目-酒店管理系统(流程图+需求背景数据库+架构说明,视频源码齐全).rar
- 很棒的毕业设计、课程设计、练手的java项目-Oracle飞机订票系统(流程图+需求背景+数据库+架构说明+源码).rar
- 很棒的毕业设计、课程设计、练手的java项目-购物系统项目(文档+视频+源码).rar
- 很棒的毕业设计、课程设计、练手的java项目-电影票购票管理系统(视频+源码).rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


