小白的第一次面试总结

发布于:2023-01-11 ⋅ 阅读:(440) ⋅ 点赞:(0)

一.面向对象的特性

        1.继承:继承是指这样的一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

        2.封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法让信任的类去访问,对不信任的类进行隐藏

        3.多态:是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据结构或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。

二.抽象类与接口的区别

区别 抽象类

接口

1 结构组成 比普通类多了抽象方法 抽象方法+全局变量
2 权限 各种权限 public
3 子类使用 使用extends继承抽象类 使用implements关键字来进程接口
4 关系 一个抽象类可以实现诺干个接口 接口不能继承抽象类,但是接口可以只用extends关键字继承多个接口
5 子类限制 一个子类只能继承一个抽象类 一个子类可以实现多个接口

三.方法重写和方法重载的区别

四.动态绑定 

    动态绑定是指在执行其期间判断所引用对象的实际类型,根据其实际的类型调用其响应的方法 

   发生条件1.父类的引用引用了子类对象。2.通过父类引用调用父类和子类的同名覆盖方法

五.Java常见的集合框架

        Java集合类主要由两个根接口Collection和Map派生出来的;Collection下有三个子接口:List、Set、Queue, 

        List代表了有序可重复集合,可直接根据元素的索引来访问  ArrayList、LinkedList

        Set代表无序不可重复集合,只能根据元素本身来访问  HashSet、TreeSet

        Queue是队列集合 ArrayQueue

        Map代表的是存储key-value的键值对的集合,可以根据key来访问value   HashMap

六.ArrayList与LinkedList的区别

        底层数据结构:Arraylist底层使用的是Object数组;LinkedList底层使用的是双向循环链表。

        ArrayList由于采用数组存储,所以插入和删除元素的时间复杂度受元素位置到的影响。

        LinkedList采用链表存储,所以插入删除元素的时间复杂度不受元素位置的影响, 

        LinkedList 不支持高效的随机访问元素,而ArrayList实现了RandmoAccess接口,可以通过元素的序号快速获取元素对象。

        内存空间占用:ArrayList的空间浪费主要体现在list列表的结尾会预留一定容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(存放前驱和后继节点以及数据)

七.HashMap

        在JDK1.8中,由“数组+链表+红黑树组成”。默认容量:16

链表转红黑树的条件:

        条件一:某处的链表长度大于8

        条件二:数组的长度超过64

红黑树转为链表的条件:

        条件一: 扩容时,红黑树被拆分后,结点数小于等于 6 个,则链表化

        条件二:移除元素 remove( ) 时,在removeTreeNode( ) 方法会检查红黑树是否满足退化条件,与结点数无关。如果红黑树根 root 为空,或者 root 的左子树/右子树为空,root.left.left 根的左子树的左子树为空,都会发生红黑树退化成链表。

九.TCP和UDP的区别

UDP TCP
是否连接 无连接 面向连接
是否可靠 不可靠

流量控制和拥塞控制保证可靠性

是否有序 无序 有序,TCP会重新排序
传输速度
连接对象个数 一对一,一对多,多对一,多对多 只能是一对一通信
传输方式 面向报文 面向字节流
首部开销 首部开销小,仅8字节 首部最小20字节,最大60字节
适用场景 实时应用,视频会议,直播 要求可靠的传输,文件传输

 TCP握手的目的有哪些?

        确认双方的收发能力都没有问题,初始化序列号,确认窗口大小即 MSS 等信息

 十.线程池的执行流程

        1.提交任务后,线程池先判断线程数是否达到了核心线程数(corePoolSize)。如果未达到线程数,则创建核心线程处理任务;否则,就执行下一步;

        2.接着线程池判断任务队列是否满了。如果没满,则将任务添加到任务队列中;否则,执行下一步;

        3.接着因为任务队列满了,线程池就判断线程数是否达到了最大线程数。如果未达到,则创建非核心线程处理任务;否则,就执行拒接策略,默认会抛出RejectedExecutionException异常。

十一.volatile的使用及其原理

        1.volatile保证变量对所有线程的可见性,当volatile标量被修改,所有线程会立即更新。

        2.jdk1.5之后volatile关键字完全避免了指令重排优化,实现了有序性。

十二.锁的升级过程

十三.ynchronized和Lock有什么区别

1.synchronized是Java的关键字,由JVM实现,需要依赖操作系统提供的线程互斥原语(mutex);Lock

十四.CAS

        CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。

        一个CAS涉及到以下操作: 1.比较A与V的值是否相等(比较)

                                                    2.如果比较相等,将B写入V(交换)

                                                    3.返回操作是否成功。

 CAS的应用:实现原子类;实现自旋锁

CAS有什么一些缺陷

        1.ABA问题:

                解决方案:要给修改的值引入版本号,在比较当前线程数据值和主内存数据值时,也要比较版本号是否符合预期。如果当前版本号和读到的版本号相同,则修改数据,并把版本号+1;如果当前版本号高于读到版本号,就操作失败。

        2.循环时间长开销大:

                解决方案:设置次数次数 ;

        3.只能保证一个变量的原子操作:        

                解决方案:1.使用互斥锁来保证原子性

                                  2.将多个变量封装成对象,通过AtomicReference来保证原子性。 


十五.数据库事务的特性和隔离级别

        事务就是一组原子性的操作,这些操作要么全部发生,要么全部不发生。事务把数据库从一种一致性状态转换成另一种一致性状态

        事务的特性:1.原子性 ;2.一致性  ;3.隔离性 ;4.持续性;

        四种隔离级别:1.读未提交 ;2.读已提交 ;3.可重复读 ;4.可串行化

十六.索引底层的数据结构

        点击跳转至MySQL索引底层数据结构

 
 

本文含有隐藏内容,请 开通VIP 后查看