面试
什么是面向对象?
面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式。
老师问这个问题,只回答三大特性是什么、和三大特性的特点以及好处
他们的好处我们回答的很烂,就不写了,答案不唯一,最好根据自己的理解
比如:想吃鱼香肉丝
面向过程是:买什么东西,怎么做
面向对象是:带张嘴,去店里
它的三大特性是:封装、继承、多态
封装:
将方法和属性写到同一个类中,并将属性私有化,生成 get set方法,外部访问属性需要通过get和set方法,内部可以直接访问属性,这样的一个类我们认为它完成了封装。
他有什么好处? 既可以实现对客体属性的保护作用,又可以提高软件系统的可维护性。
继承:
子类继承父类,子类实例可以调用父类除private修饰以外的所有属性和方法,一个子类只能继承一个父类,但是可以多重继承,一个父类可以拥有多个子类
他有什么好处? 通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。
多态:
父类的引用指向子类的实例,多个子类继承同一个父类实现了这些类共通的方法,每一个子类实现的结果都不同。
他有什么好处? 多态性允许每个对象以适合自身的方式去响应共同的消息。
多态性增强了软件的灵活性和重用性。
集合
集合问的比较细,我背了我桌面的这张图,原图找不到了,这张图虽然改了,但是能看清😂
他问了我一个问题,我蒙了,老师问我Hashtable的好处是什么?我这个没回答上来
下图中:Collections→Queue:作为了解,其他的背一下
HashMap 底层是Hash表,散列表,主干是数组。
String、StringBuffer、StringBuilder的区别!
String是不可变的,比如我们定义一个String a = "abc" 再定义a = "bca" 那么指针就会指向bca,后来定义的就会覆盖第一次定义的
StringBuffer、StringBuilder 是可变的但是StringBuilder是线程安全 StringBuffer线程不安全
线程的创建方式以及执行流程是什么?
①. 继承Thread类创建线程类
②. 通过Runnable接口创建线程类
③. 通过Callable和Future创建线程
执行流程:
new创建→statr就绪→run执行→结束(死亡)
创建线程
当创建一个新的进程时,也创建一个新的线程,进程中的线程可以在同一进程中创建新的线程。
堵塞线程
当线程等待每个事件无法运行时,停止其运行。
唤醒线程
当阻塞线程的事件发生时,将被阻塞的线程状态置为就绪态,将其挂到就绪队列。进程仍然具有与执行相关的状态。例如,所谓进程处于“执行”状态,实际上是指该进程中的某线程正在执行。对进程施加的与进程状态有关的操作,也对其线程起作用。例如,把某个进程挂起时,该进程中的所有线程也都被挂起,激活也是同样。
终止线程
可以正常终止自己,也可能某个线程执行错误,由其它线程强行终止。终止线程操作主要负责释放线程占有的寄存器和栈。
还有
阻塞:wait、sleep
notify
notifyAll
多线程实现方式
1.顺序编程
顺序编程:程序从上往下的同步执行,即如果第一行代码执行没有结束,第二行代码就只能等待第一行执行结束后才能结束。
2.并发编程
并发编程:多个任务可以同时做,常用与任务之间比较独立,互不影响。
Radis是什么?
主要背一下什么是Redis、Redis的优点、六大数据类型、持久化、RDB和AOF的特点和区别
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
Redis优势
(1) 性能极高
– Redis能读的速度是110000次/s,写的速度是81000次/s 。
(2) 丰富的数据类型
– Redis支持二进制案例的 Strings, Lists, Sets, Hashes,zset 及 基数(HyperLogLog) 数据类型操作。
(3) 原子
– Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
(4) 丰富的特性
– Redis还支持 publish/subscribe, 通知, key 过期等等特性
(5) 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不 用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
(6) 使用多路I/O复用模型,非阻塞IO;
Redis持久化方式
RDB和AOF
RDB
时间间隔保存持久化 RDB其实就是把数据以快照的形式保存在磁盘上。
** ①、优势**
(1)RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。
(2)生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
(3)RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
** ②、劣势**
RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。
AOF
replay日志文件持久化 redis会将每一个收到的写命令都通过write函数追加到文件中。
** ①、优势**
(1)AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。
(2)AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。
(3)AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。
(4)AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据
** ②、劣势**
(1)对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大
(2)AOF开启后,支持的写QPS会比RDB支持的写QPS低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的
(3)以前AOF发生过bug,就是通过AOF记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。
Spring
IOC
是什么? Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。 在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。
AOP
什么是AOP?
AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
两大容器
BeanFactory和ApplicationContext
BeanFactory只提供了基本的DI功能。
ApplicationContext 继承BeanFactory后派生而来的,应用上下文。
他们是Spring的两大核心接口,都可以当做Spring的容器。
这个问题的答案再稍微补充一下
Springmvc
这一块老师就问了springmvc的执行流程,多准备一些更好,主要就问这张图
SpringMVC执行流程:
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)。
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
11.DispatcherServlet响应用户。