JSP内置参数:
request封装了由客户端生成的HTTP请求的所有细节cookie、response响应客户请求、重定向、session保存会话、application存所有应用中的共有数据、out向客户端浏览器输出信息print()、pageContext获取其他对象、config配置文件、page和exception。
四大作用域:pagecontext,request,session,application
Mybatis整合入spring
在Mybatis中,一个接口去执行sql,调用方法来执行某个指定的sql,将执行sql封装
把某个Mapper的代理对象作为一个bean放入Spring容器中,使得能够像使用一个普通bean一样去使用这个代理对象.
Spring启动过程中,大致会经过如下步骤去生成bean
- 扫描指定的包路径下的class文件
- 根据class信息生成对应的BeanDefinition
- 在此处,程序员可以利用某些机制去修改BeanDefinition
- 根据BeanDefinition生成bean实例
- 把生成的bean实例放入Spring容器中
要做的 - 定义一个LubanFactoryBean
- 定义一个LubanImportBeanDefinitionRegistrar
- 在AppConfig上添加一个注解@Import(LubanImportBeanDefinitionRegistrar.class)
什么是死锁,产生死锁的原因及必要条件
死锁,是指多个进程在运行过程中因争夺资源没有外力无法推进,环路,互斥,请求与保持不剥夺
预防死锁:
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
线程池拒绝策略:
CallerRunsPolicy - 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大
AbortPolicy - 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。
DiscardPolicy - 直接丢弃,其他啥都没有
DiscardOldestPolicy - 当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入
链表和数组的区别:连续不连续,固定动态,随机访问顺序访问
"值传递"和"引用传递"的区别:传递值得拷贝,传递后不相关,传递地址,前后都是一个地址
1、ArrayList是基于数组实现的,线程不安全效率高;LinkedList是基于链表实现的,线程安全效率低;
2、ArrayList随机查询速度快;LinkedList插入和删除速度快;
Hashmap是hashtable的非线程安全实现,hashmap允许空kv
String中有final关键字,定长不可改。Stringbuffer与StringBuilder是可变数组append方法,拼接用这个。Builder线程不安全,buffer安全(缩)
Java集合value与key-value.存储值分为List有序,可重复与Set无序,不可重复根据equals与hashcode判断。即一个对象如果存储在set要重写equals与hashcode方法
存储key-value为map
1、ArrayList是基于数组实现的;LinkedList是基于双向链表实现的;elementdata数组
2、ArrayList随机查询速度快;LinkedList插入和删除速度快;
Hashmap是hashtable的非线程安全实现,hashmap允许空kv。concurrentHashmap可以安全效率高
拷贝文件用字节流还是字符流通用性要用字节流(图,声)
线程实现方式:继承Thread(单接口),实现Runnable接口,启动thread.start,执行的是run方法。区分线程:setname方法
线程并发库:创建线程池:Executors的四个静态方法作用:限定个数,防止系统奔溃,不用创建销毁
IOC:控制反转,代理模式,依赖注入,工厂模式
AOP:面向切面业务与逻辑分离,代理模式事务、日志和安全
Get,post区别:get会在地址栏显,有限,获取查询
post不会,再HTTP包体中,安全,更新
servlet:java服务器端程序,实现servlet接口的程序。生命周期:servlet启动,被服务器实例化容器运行init方法,然后server方法,doget\dopost
加载servletclass->实例化——>调用init->doget/dopost->关闭
Session与cookies都是会话跟踪,cookies是在客户端记录,不安全大小限制,session是在服务器端,占用服务器
Jdbc理解 javadatabaseconnection,数据库很多,每个数据库命令不一样,定义接口,让数据库厂商自己实现接口(mysql+mysql驱动+jdbc)
类、抽象类、接口的区别:
抽象类:有抽象方法的就是抽象类,但是抽象类也不一定都是抽象方法,不可创建对象,一个类继承抽象类必须实现父类抽象方法,如果没有实现,则必须将子类定义为抽象类,一个类只能继承一个抽象类
接口:接口中的方法必须是抽象方法,比抽象类更抽象。一个类实现一个接口,要实现接口中的所有抽象方法。接口中的成员变量只能是public static final,一个类可以实现多个接口
抽象类一般是子类父类,是一种模板,接口是一种规范,具有普遍性
Object有哪些方法:
clone方法getClass方法toString方法equals方法hashCode方法wait方法notify方法
wait() :等待锁
notify():唤醒锁
具体使用场景
wait()或notify()的任何调用都在同步的代码区域内(wait()和notify()调用在同一对象上同步)
sleep和wait的区别:sleep时Thread类的,wait时object方法,sleep不会释放对象锁,wait进入等待池和notify()一同使用。
==和equals有什么区别
==是比较地址,equals是比较值
volatile变量对线程可见,且不保证原子性
在每个写操作之后,都会加入一条store内存屏障命令,此命令强制工作内存将此变量的最新值保存至主内存;在每个读操作之前,都会加入一条load内存屏障命令,此命令强制工作内存从主内存中加载此变量的最新值至工作内存。
LinkedHashMap 访问顺序方式遍历
LinkedHashMap 的accessOrder参数控制的,true为访问顺序遍历,false为插入顺序遍历
重载和重写
overwrite,重写父类或者接口方法,权限修饰符不小于父类
overload,同名方法,参数,返回值可能不同
synchronized与lock区别
1、lock是一个接口,而synchronized是java的一个关键字。2、synchronized在发生异常时会自动释放占有的锁,因此不会出现死锁;而lock发生异常时,不会主动释放占有的锁,必须手动来释放锁,可能引起死锁的发生。
项目中,如何应对高并发流量
计数器是一种比较简单的限流算法,用途比较广泛,在接口层面,很多地方使用这种方式限流。在一段时间内,进行计数,与阀值进行比较,到了时间临界点,将计数器清0。
http长连接和短链接
HTTP/1.0中默认使用短连接,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接
HTTP/1.1起,默认使用长连接,在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,
谈谈工厂模式:
1.简单工厂
抽象产品类下分各种产品,然后由工厂产出某个产品,根据放的参数的不同判断是创建那个类,dataformat就是一个工厂类型,根据参数判断是什么类型
创建使用分离,创建交给工厂,客户端只管使用,缺点就是新增那就只能修改工厂类
2.工厂模式
抽象商品与抽象工厂,collection类就用的工厂模式,迭代器,arraylist也有迭代器
3.抽象工厂模式:
有了多个产品体系,但是还是要修改产品类和工厂类,没咋用过