知识点回顾
准备好好开始,回顾自己所学的东西了,学的好多都忘记了,或许是看的东西太多了吧,现在要找回遗忘的知识点。
1.0 java的集合
集合分为值value[collection],key-value[map]. 存储值的分为list,和set。list是线性表,包括循序表和链表,所以有序,可以重复。 set是集合,是无序的,不能重复。重复性质根据,equals和hashcode,如果对象要存储在set中,必须重写equals和hashcode.
list有分为ArrayList和LinkedList. ArrayList底层使用的是数组,LinkedList使用的是链表。对于ArrayList查询速度快,因为有索引,但是增删比较慢。LinkedList是链表增删比较快,查找比较慢。
HashMap和HashTable都是key-value形,HashMap可以key,value为NULL,线程不安全,效率更高.而HashTable是不行的,线程安全,效率低。
想线程安全,有效率高ConcurrentHashMap<K,V>,理解为大的HashMap分成多个HashTable
拷贝文件使用字节流,还是字符流?
我们拷贝的文件不仅仅包含字符流,有可能有字节流(图片,声音,图像),为考虑通用性使用字节流。
线程池
通过4种静态方法,创建4种线程池
image.png
线程池的作用?
1.0 限定线程的个数,不会导致线程过多,导致系统运行缓慢或者崩溃。
2.0 线程池不需要每次都创建和销毁,节约了资源,响应时间更快。
连接池也是一样。
设计模式
经过无数前人,无数次实践总结出的,在设计过程中可以反复使用的设计方法。
单列设计模式,工厂模式,代理模式,包装模式。
spring的ioc就是使用了工厂模式,对象的创建交给一个工厂去创建。
aop就是使用了动态代理模式。jdk,cglib二种。
单列模式,分为饱汉模式(一出来就创建),饥汉模式(需要的时候才创建)。
1.0 构造方法私有法,让处自己的类可以创建,其它地方都不行。
2.0 提供一个方法,获取实列对象(饥汉模式创建需要方法同步)。
//饱汉模式
public class PersonFaction{
private PersonFaction() //私有构造函数
{
}
private PersonFaction instance=new PersonFaction()
public static PersonFaction getPersonInstance()
{
return instance;
}
}
饥汉模式
public class PersonFaction{
private PersonFaction() //私有构造函数
{
}
private PersonFaction instance;
public synchronized static PersonFaction getPersonInstance()
{
if(instance==null)
{
instance=new PersonFaction()
}
return instance;
}
}
范式,范式就是规范。
第一范式:数据库中的 每一列都不可分割的基本数据项。即实体某个属性不能有多个值,或不能有重复的值。
第二范式:表中每一行都可被唯一区分,为实现区分通常需要表中加一列,以存储实列的唯一标识(主键)
第三范式:一个数据库中不包含已在其它表中已包含的非主关键字(外键)
反3范式,有的时候,需要效率,可以设置重复的字段。订单(总价)和订单项(单价)
事务:并发控制的单位,是用户定义的一个操作序列。这些操作,要么都做,要么都不做,是一个不可分割的工作单位。
比如转账,必须A账号扣钱成功,B账号加钱成功,才是真正的转账。
ACDI
原子性:表示操作事务内操作不可分割,要么都成功,要么都失败。
一致性:要么都成功,要么都失败,后面的失败了,要对前面的操作进行回滚。
隔离性:一个事务开始后,不能受其它事务干扰。
持久性:事务开始了,就不可终止。
mysql
为什么需要分页,很多数据时,不可能完全显示数据,需要进行分段显示。mysql使用limit进行分页的limit offset,size表示从多少索引去多少位。
select * from student order by id limit " + pageSize*(pageNum-1)+","+pageSize;
触发器,需要有触发条件,当满足条件以后做什么操作。有after,instead of 2中触发器。
存储过程,自在创建时编译,以后每次执行都不需要重新编译。不许每执行一次就编译,大大的提高了数据库的效率。创建一次重复执行,安全性高。
jdbc调用存储过程。
加载驱动,获取链接,设置参数,执行,释放链接。
PreparedStatement相比Statement的好处
1.0 PreparedStatement是预编译的,比Statement速度快。
2.0 代码可读性,和可维护性,PreparedStatement比Statement高许多档次。
3.0 安全性PreparedStatement比Statement好,PreparedStatement高许多档次。
ajax,是异步加载的JavaScript和xml,作用通过ajax与服务器进行数据交换,ajax可以实现局部更新。通过XmlHttpRequest对象。
jquery选择器
1.0 id选择器
2.0 class选择器
3.0 标签选择器
4.0 通用选择器(*),获取所有元素
5.0 层次选择器。儿子选择器[>], 后代选择器,空格,获取下面的后代。
6.0 属性选择器 ,Tag[attrName="test"],<input type="checkbox" name="body"/>
使用 input[name="body"],获取属性名为name,并且name属性值为body的所有input元素。
spring 是j2ee应用程序框架,是轻量级的ioc和AOP的容器框架,主要针对javabean的生命周期进行管理的轻量级容器。
ioc控制反转, 原来:我的service需要调用Dao,service就需要创建dao。
现在:spring发现你的service依赖dao,就给你注入。
核心原理:配置文件+反射(工厂)+容器。
AOP:面向切面编程
核心原理:在使用动态代理的设计模式在执行方法前后或出现异常做出相关的逻辑。
主要使用aop来做:
事务处理,执行方法前开启事务,执行完成后关闭事务, 出现异常时后滚事务。
权限判断,在执行方法前,判断是否具有权限
日志处理,在执行前进行日志。
spring事务的传播特性
propagation_required,如果存在一个事务,就支持当前事务,如果没有事务则开启。
propagation_supports:如果存在一个事务,就支持当前事务,如果没有事务,则非事务执行。
propagation_mandatory:如果存在一个事务,就支持当前事务,如果没有事务,则抛出异常。
ORM(object Relational Mapping)对象关系映射模式,是一种为了解决面向对象与数据库存在的互不匹配的技术。
Hibernate映射对象状态
临时状态/瞬时状态:刚刚new语句创建,没有被持久化。不处于session中(没有使用session的方法去操作临时状态)
持久化状态/托管状态:已经被持久化,加入到session的缓存中,session是没有关闭该状态的对象为持久化对象。
游离状态/托管准态:已经被持久化,但是不处于session中。
删除状态:对象有关联id,并且在session管理下,但是已经计划删除。
Hibernate为什么需要缓存?
提高访问速度,把磁盘或者数据库的访问变成内存的访问
一级缓存:session的缓存,session缓存内置不能被卸载,session的缓存是事务范围的缓存(session对象的生命周期通常对应一个数据库的事务或者一个应用事务。)
二级缓存:SessionFactory的缓存,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此hibernate的二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题。因此需要采用适当的并发策略。该缓存策略为被缓存的数据提供了事务的隔离级别。
第2级缓存是可以选择的,是一个可以配置的插件,默认下SessionFactory不会启动这个插件
面试
Hibernate中的缓存分为一级缓存和二级缓存
一级缓存就是Session级别的缓存,在事务的范围内是有效的不能被卸载。二级缓存是SesionFactory级别的缓存,从应用启动到应用介绍有效果。是可以选择的,默认没有2级缓存,需要手动开启。
什么样的数据适合放到2级缓存中?
1.0 很少被修改的数据。帖子回复的时间
2.0 经常被查询的数据。电商的地址
3.0 不会被并发访问的数据。
hibernate的二级缓存默认是不支持分布式的,使用memcahe,redis等中央缓存代替2级缓存。