滴滴一面面经
1、自我介绍
2、聊项目(社团项目和个人项目)
3、数据库相关,数据库的事务
据库事务是指一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚。事务的目的是确保数据库的一致性和完整性。
事务具有以下四个特性,通常被称为ACID特性:
- 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不会出现部分执行的情况。
- 一致性(Consistency):事务在执行前后,数据库的状态必须保持一致。即事务开始时和结束时,数据库中的数据必须满足预设的约束条件。
- 隔离性(Isolation):并发执行的事务之间应该相互隔离,每个事务都应该感觉不到其他事务的存在。隔离级别包括读未提交、读已提交、可重复读和串行化。
- 持久性(Durability):一旦事务提交成功,其所做的修改将永久保存在数据库中,即使系统发生故障也不会丢失。
数据库事务可以通过以下方式来管理:
- 开始事务(BEGIN):标识一个事务的开始。
- 提交事务(COMMIT):将事务中的操作永久保存到数据库中。
- 回滚事务(ROLLBACK):撤销事务中的所有操作,回到事务开始前的状态。
4、Redis相关,Redis的三大问题(缓存击穿,缓存雪崩,缓存穿透)
5、面向对象的概念(继承,多态,封装)
对于什么是面向对象,它是一种编程思想。聊到面向对象,我们需要聊一下面向过程的编程方式,因为面向对象是从面向过程过渡而来的。面向过程跟面向对象,是两种不同的思维方式,处理问题的思考的角度不一样。
- 面相过程的思维方式,它更加注重这个事情的每一个步骤以及顺序。他比较直接高效,需要做什么可以直接开始干。
- 面向对象的思维方式,它更加注重事情有哪些参与者,需求里面有哪些对象,这些对象各自需要做些什么事情。将其拆解成一个个模块和对象,这样会更易于维护和拓展。
这个是面向过程跟面向对象的区别。
1、继承
什么是继承呢?
在 Java 中子类使用关键词 extend 去继承父类的关系。
继承主要用途是将子类存在共性的东西,把它抽取出来放到父类里面,比如将共同拥有的属性和方法抽取出来放到父类里面。
继承的好处:
想要使用这些属性和方法的时候,可以直接去使用父类的,而不需要自己再重新去定义,更大程度的实现代码复用。
我们不需要写很多的冗余的代码,把共性的全部抽到父类,可以直接调用,如果需要个性化自定义子类的方法时,去重写父类的方法即可。
2、多态
什么是多态呢?
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作
多态的理解稍微有点抽象,解释一下:
多态是和继承一脉相承的,多态存在的需要有三个必要条件:继承、重写、父类引用指向子类对象。
用个案例再补充解释一下:
比如说打印机,它属于一个父类,有一台彩色打印机,属于子类,有一台黑白打印机,也属于子类。
打印机的关系
用这个案例来解释一下多态,以及多态存在的三个必要条件:
继承,彩色打印机和黑白打印机都继承自打印机这个父类;
重写,打印机有一个打印的方法,彩色打印机和黑白打印机会重写父类的打印的方法,效果就是,彩色打印机打印出来的效果是彩色,而黑白打印机打印出来的效果是黑白的。
父类引用指向子类对象,例如:Parent p = new Child() ;对应到打印机的案例,new 一个对象的时候,父类打印机的引用会指向具体的对象,彩色打印机或者黑白打印机。
多态的好处:
便于接口的维护和拓展,可以将某一个子类切换成其他的子类,代码不需要做任何的改变,具有可替换性。
多态的弊端:
只有是子类重写的父类的方法,父类才可以调用,但如果子类的方法不是重写父类的,而是子类独有的,那么这个时候多态就使用不了,这个是需要注意的点。
3、封装
什么是封装呢?
通过访问修饰符(如 private)来修饰成员变量和成员方法,将不需要对外提供的内容都隐藏起来,提供公共方法对其访问。
封装的好处是:
隐藏实现细节,提供公共的访问方式
提高了代码的复用性
提高安全性
封装的意义在于,将内部的实现细节隐藏起来,对外部的调用者来说是透明的,调用者也不用关心它内部是怎么实现的,只需要知道这个方法是干什么的就好。
6、int 和 integer 的区别
(1)Integer是int的包装类;int是基本数据类型。
(2)Integer变量必须实例化后才能使用;int变量不需要。
(3)Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。
(4)Integer的默认值是null;int的默认值是0