1.线性的数据结构有哪些?
主要有线性表,队列,栈,一维数组。
2.常见的非线性数据结构?
二维数组,图,树
3.怎么找出一个图是否有环?
对于判断一个图是否有环,我们需要知道的是这个图示有向图还是无向图。
对于有向图而言,我们都知道可以直接用拓扑排序来进行直接判断,也就是首先找到入度为0的顶点,然后删除这个顶点和对应的边,然后重复这个过程。若执行结束后,图中仍然还有顶点,那么就是有环的,否则就是无环的。
对于有向图来说,其实我们可以参考拓扑排序,这时候没有出入度之分了,但是每个顶点都存在着一个度数。我们先找出图中度数为1的顶点,删除这个顶点和其相关的边,并重复上述过程,如果到最后图中仍然有顶点存在,那么这个无向图就是有环的,否则就是无环的。
4.ArrayList和linkedList底层实现原理以及区别?
我们先来说说ArrayList,它是基于动态数组实现的,初始长度为10,所以它的查找效率高,但是添加和修改的效率低。
LinkedList是基于双向链表实现的,链表可以占用一段不连续的内存空间,所以它的查找效率要低一些,但是添加和修改的效率要高一些。
5.java集合类中哪些是有序的,哪些是无序的?
实现了list接口的全部都是有序的,也就是ArrayList(线程不同步,所以线程不安全),LinkList(线程不安全)
实现了set接口的,hashset是无序的,TreeSet是有序的
实现了Map接口的,HashMap是无序的,TreeMap是有序的
6.HashMap和HashTable的区别?
首先HashMap和HashTable都实现了Map接口,但是他们之间肯定是有区别的,区别主要在以下几个方面:
① 同步和线程安全:HashMap是线程不同步的,所以它是线程不安全的。HashTable是线程同步的,所以它是线程安全的,多个线程可以共享一个HashTable
②是否允许存在null:HashMap是可以允许存在null的,也就是空的键或者空的值,但是HashTable是不允许的
③在单一线程情况下,因为HashTable是线程同步的,所以它的速度是要慢一些的。
7.常见状态码
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在,403禁止访问
- 500 - 内部服务器错误
8.二叉树的定义
二叉树是一个连通的无环图,并且每一个顶点的度不大于3。二叉树是递归定义的,其结点有左右子树之分。
对于二叉树来说,有先序遍历,中序遍历,后序遍历。但因为二叉树其实也是一个连通的无环图,所以也有深度优先遍历和广度优先遍历。
9.B树/B+树的应用场景。
广泛用于文件系统及数据库中。
10.快速排序
最好和平均情况的时间复杂度是O(nlgn),最坏情况下是O(n2)。它是不稳定的排序
11.TCP三次握手的过程
首先是客户端向服务器端发送一个SYN包,等待服务器的确认。然后第二次握手,首先服务器要确认客户端的SYN,也就是自己再发送一个SYN+ACK的包。第三次握手,客户端收到服务器的SYN+ACK的包,自己发送一个ACK确认
12.断开连接的四次挥手
第一次挥手,主动关闭方发送一个FIN包,告诉对方我不会再给你发送数据了
第二次挥手,被关闭方,对关闭方发送的包发送一个ACK确认
第三次挥手,被关闭方,也发送一个FIN包,告诉对方,我的数据也发送完了,不会再给你发送数据了
第四次挥手,主动关闭方对收到的FIN包进行确认,发送一个ACK包
13.UDP和TCP报文的主要区别
UDP的报头要比TCP的要简单很多,它只有源端口号,目的端口号,数据长度和校验和。但是TCP包括选项,紧急指针,序号,确认号等等
14.死锁的四个必要条件
互斥,不可抢占,循环等待,占有且等待
15.什么是线程安全。
线程安全问题是在多线程情况下需要特别注意的。也就是我们需要在多条数据访问的时候需要程序还是按照我们预期的想法去进行。打个比方,就是两个进程分别需要对一个count进行读和修改,当A进程刚刚读取了count,但还没来得及修改,这是B进程读取了count的值,这时两个进程读取的count就是一样的了。这就是线程不安全。
那么解决线程安全问题,Java中一般有两种方式。
第一种是加同步的关键字,然后就可以保证这个在多线程的环境下不被同时执行。一般是加在方法上,锁的是方法括号里面的对象。
第二种是在我们需要的时候去手动的添加锁和释放锁。一般把释放锁的过程放在finally中。我们这里再说一种,就是tryLock()这个方法跟Lock()是有区别的,Lock在获取锁的时候,如果拿不到锁,就一直处于等待状态,直到拿到锁,但是tryLock()却不是这样的,tryLock是有一个Boolean的返回值的,如果没有拿到锁,直接返回false,停止等待,它不会像Lock()那样去一直等待获取锁。
16.MyBatis中#和$的区别。
#{} 在预处理时,会把参数部分用一个占位符 ? 代替。
而 ${} 则只是简单的字符串替换,在动态解析阶段, sql 语句里面会被替换。
17.Spring中的控制反转,依赖注入,AOP
IOC就是将原来程序员new实例化的事情交给Spring来负责,控制二字指的是控制类的对象。最大作用就是解耦,对象和程序员之间的耦合。
依赖注入:当一个类(A)中需要依赖另一个类(B)对象时,把 B 赋值给 A 的过程就叫做依赖注入.。比如说,B是一个Bean,然后通过ref引用。
AOP:也就是面向切面编程。在原有的程序执行过程中,针对某一个方法添加通知,形成横切面的过程就叫做AOP。Spring提供了两种AOP实现方式,第一种是Schema-based(每个通知都需要实现类和接口),第二种是AspectJ(不需要实现类和接口,但要在配置文件中配置子标签)
18.依赖注入的几种方式
构造方法注入,setter(set方法,反射)注入,基于注解的注入
19.什么是反射
反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
20.常见的Java设计模式
https://blog.csdn.net/Ly20160520/article/details/88817445
21.事务是怎么控制的?事务有哪些特性?
事务是通过并发控制的,
原子性,一致性,隔离性,持久性
22.为什么要建立索引?如果我的数据访问量都很大那怎么办?
索引方便用户对数据的访问,为数据库的表建立正确,合理的索引,可以极大的提高应用系统的性能。
在存取索引时,避免进行表扫描的次数。如果没有索引,每次都要进行表扫描。
对大表进行分区,减少IO操作。
23.唯一索引和主键的区别?
主键是相对表来说的,不可以为空,也不可以重复。而索引时为了提高数据检索效率而建立的,它可以为空但不能重复。
24.重载和重写的区别?
重载就是一个类中多态性的一种表现,如果在一个类中定义了多个同名的方法,他们或有不同的参数个数或有不同的参数类型,则称为方法的重载。重载可以改变返回值类型。因为构造方法不能被继承,所以构造方法能被重载不能被重写。
重写就是子类与父类之间多态性的一种表现,如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。
25.异常
26.Java中垃圾回收机制及其原理。
我们从三个角度来分析Java中的垃圾回收机制。
第一,jvm怎么确定哪些对象需要进行回收。这里运用了两个算法。
1.引用计数法:简单来说就是判断对象的引用数量,如果一个对象没有被引用,就说明这个对象是一个垃圾对象。
2.可达性分析算法:就是把所有的引用关系看做是一张图,从一个名为Gc Root的点开始,向下搜寻,走过的路径称为引用链,当一个对象没有任何引用链相连时,就说明,这个对象是垃圾对象。
第二,什么时候进行垃圾回收。
1.CPU空闲时自动进行垃圾回收
2.在堆内存满了之后
3.主动调用System.gc()尝试回收
第三,如何回收。
jvm中用的最多的是分代回收算法。也就是存在新生代,年老代,和永久代,新生代里面分几个区,一个区满了再放到另一个区,然后新生代区都满了,就会放到年老区,年老区里面的对象是经历了很多次垃圾回收仍然存在的对象。永久代一般对垃圾回收没有影响,存放一些静态文件,类和方法等。
27.Java中内存模型。
在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。
程序计数器:为了线程切换后能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存,
Java栈:与线程对应起来的,Java栈数据不是线程共有的,所以不需要关心其数据一致性,也不会存在同步锁的问题。
Java栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会指向该地址。
Java堆:堆是JVM所管理的内存中国最大的一块,是被所有Java线程锁共享的,不是线程安全的,在JVM启动时创建。所有的对象实例以及数组都要在堆上分配。Java堆是GC管理的主要区域,从内存回收的角度来看,由于现在GC基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代。
方法区:存放了要加载的类的信息(名称、修饰符等)、类中的静态常量、类中定义为final类型的常量。方法区是被Java线程锁共享的,不像Java堆中其他部分一样会频繁被GC回收,它存储的信息相对比较稳定,在一定条件下会被GC。
常量池:常量池本身是方法区中的一个数据结构。常量池中存储了如字符串、final变量值、类名和方法名常量。常量池在编译期间就被确定,并保存在已编译的.class文件中。
28.Linux怎么查看cpu的使用率,怎么处理cpu过高。
top:查看cpu使用率(进程级别 top -u oracle 即可查看oracle的cpu使用情况)
vmstat:系统级别的cpu使用情况
处理cpu跑高:top查看----p排序----ll /proc/PID/exe可以查看每个进程ID对应的程序文件----k PID终止进程
29.关于dubbo
项目是面向服务架构的,也就是有一个专门提供服务的单元,其他所有单元都调用这个服务,因为公司不允许所有的项目都可以访问数据库,而且开发时,数据库访问层代码可能会出现冗余。
什么是RPC,也就是远程过程调用协议,就是客户端A通过互联网调用远程服务器,不知道远程服务器的具体实现,只知道远程服务器提供了什么功能。最大优点,数据安全性。
而Dubbo就是一个RPC服务框架。
运行原理,首先启动容器就相当于启动了Provider,然后去注册中心注册,注册所有可以提供的服务列表。当Consumer启动后,会去注册中心获取服务列表和Provider地址进行订阅,根据Provider的地址,真实的调用Provider的功能。
30.关于Redis
Redis 是一个基于key-value形式进行存储的内存型数据库.。它其实是一个NOSQL数据库。它不能完全代替关系型数据库,只能是它的补充,将它作缓存工具来使用.把某些使用频率较高的内容不仅仅存储到关系型数据库中还存储到NoSQL数据中。
31.关于Nginx
Nginx是一个反向代理服务器。反向代理:客户端只知道代理服务器地址,而不知道真实访问的服务器地址.。正向代理:客户端知道最终要访问的服务器地址.