一.面向对象的特性
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.可串行化
十六.索引底层的数据结构