小白的第一次面试总结

一.面向对象的特性

        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的区别

UDPTCP
是否连接无连接面向连接
是否可靠不可靠

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

是否有序无序有序,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索引底层数据结构

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值