2022年11月22的第一次面试
一、介绍项目 奇葩乐游
二、mvc的详细流程,数据怎样持久化一步步到数据库的
三、LinkedeList和ArrayList的区别
-
数据结构不同
ArrayList是动态数组的数据结构,LinkedList是链表的数据结构。
-
效率不同
当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
-
初始大小不一样
ArrayList默认初始值是0,LinkList没有初始大小
四、hashMap()的执行原理
hashMap的底层采用数组和链表的数据结构。当我们往HashMap里面put元素的时候,底层调用k的hashcode方法得到hash值,然后通过哈希算法将hash值转换为数组的下标,当下标上没有任何元素的时候,就把这个节点放在这个位置上,如果下标对应的位置上有链表,此时会拿着k和链表上的k进行equals比较,如果和所有链表上的k进行equals比较都是返回false,则将其存入末尾,如果有一个返回为true,则将它的值覆盖,如果添加时发现容量不够,就开始扩容。
在jdk8版本的时候haspMap在第一次添加数据时,默认构造函数构建的初始容量是16,当达到它的临界值(0.75)的时候,数组就会扩容,如果有一条链表的元素个数到达8,且数组的大小到达64时。就会进化成红黑树,当数组的长度重新低于6的时候,又会将红黑树重新转换为链表。
五、tcp和udp的区别
1.udp是无连接的,tcp是面向连接的;2.udp是不可靠传输,tcp是可靠传输;3.udp是面向报文传输,tcp是面向字节流传输。
4.TCP 连接只能是一对一的,UDP 支持一对一,一对多,多对一和多对多的交互通信。
六、tcp为什么相对可靠
TCP通过检验和、连接管理、确认应答、超时重发、连接管理以及流量控制等机制实现可靠性传输。
七、http和tcp的关系
Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的。所以Http连接是一种短连接,是一种无状态的连接。
TCP是底层协议,定义的是数据传输和连接方式的规范。 HTTP是应用层协议,定义的是传输数据的内容的规范。
八、谈一谈你对面向对象的理解
简单理解就是,面向对象是把事物抽象为一种类型,这种类型有自己的属性跟方法,把复杂的事情简化为一个个方法和属性,我们不用关心每个方法的代码是怎么实现的,只需要调用即可。万物皆对象,需要解决什么问题,就将什么问题抽象成对象,通过对象的属性和方法来解决问题。面向对象的主要特征是封装、继承、多态。
封装
封装就是屏蔽细节只暴露实现。人已经有手有脚有嘴,可以直接吃饭跟跑步了,不用关心脚是怎么运动和如何能跑步的,你只需知道有脚就能跑步就行。
封装,意为包装,专业点就是把数据隐藏起来,封装让数据的属性私有化,对数据的访问只能通过调用数据对外开放的方法来操作(get和set方法) 一个对象他所封装的是自己的属性和方法,所以他是不需要依赖其他对象就可以完成自己的操作的。
封装有一下好处:
- 良好的封装能够减少耦合
- 类内部的结构可以自由修改
- 可以对成员进行更精确的控制
- 隐藏信息,实现细节
继承
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。
实际上继承者是被继承者的特殊化,它除了拥有被继承者的特性外,还拥有自己独有得特性。例如猫有抓老鼠、爬树等其他动物没有的特性。同时在继承关系中,继承者完全可以替换被继承者,反之则不可以,例如我们可以说猫是动物,但不能说动物是猫就是这个道理,其实对于这个我们将其称之为“向上转型”。
同时在使用继承时需要记住三句话:
子类拥有父类非private的属性和方法。
子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法(重写)。
学习继承一定少不了这三个东西:构造器、protected关键字、向上转型
多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
对于面向对象而言,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。
多态的实现条件:继承 重写 向上转型
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
九、面向对象和面向过程的区别
当拿到一个需求的时候:
如果你想到的是循环分支,如何一步一步的实现,这就是面向过程的思想。如果你想到的是需要几个对象,分别调用哪些对象可以实现的时候,就是面向对象的思想。
比如说都是做饭,面向过程就是这样考虑的:首先淘米,然后点火,再把锅放灶上,加热20分钟。那面向对象呢?要有米,要有灶,还要有锅米可以淘,灶可以点火,锅可以加热米可以是锅的属性或者用方法参数传递给锅。
我的理解就是,面向过程是一步一步细化操作将问题解决,而面向对象是通过调用对象的属性和方法来将问题解决。