1.java加载顺序父类静态变量,父类静态代码块–》子类静态变量,子类静态代码块-
-》父类非静态变量,父类非静态变量–》父类构造函数–》子类非静态变量,子类非静态代码块-
-》子类构造函数
2.值传递和引用传递
List <List<String>> father= new ArrayList <List<String>> ();
List <String> child= new ArrayList<String>();
child.add("before add child list");
father.add(child);
child.add("after add child list");
System.out.println(father.toString());
//[[before add child list, after add child list]]
3.集合
Set不可重复
List有序
Map键值对
SortSet/SortMap
4.Map实现原理
每一个k,v 都是一个Entry对象,每往Map中放入时先对k进行hash根据运算结果将Entry放入指定节点
如果新的Entry映射到已有的Entry时会进行头插法,插入指定节点的首部,与旧Entry组成链表
hashMap的初始长度是16每次扩容时是2的幂,因为进行hash时是进行与运算,index=HashCode(key)&(Length-1)
如key的hash值为1001 Map的长度为16 hash结果为 1001&1111->1001 ,如果长度不为2的幂,比如长度为10,
会造成某一值过多 1011&1001->1001 ,1001&1001->1001
5.异常
运行时异常和编译时异常,运行时异常可以使spring事务回滚
6.finally
public static int test(){
int a = 0;
try {
System.out.println("try ");
return a+=1;
} catch (Exception e) {
// TODO: handle exception
}finally {
System.out.println("finally ");
if(a>0){
System.out.println("a>0 a:"+a);
}
return a;
}
}
运行结果
try
finally
a>0 a:1
1
先执行return 在执行finally 最后执行return;
6.线程安全
①synchronized 同步锁
public static void main(String[] args) {
Thread t1 = new Thread(new a(),”t1”);
Thread t2 = new Thread(new a(),”t2”);
t1.start();
t2.start();
}
}
class a implements Runnable{
static int a=0;
static void add(){
a++;
}
@Override
public void run() {
for(int i=0;i<10000;i++){
add();
System.out.println(Thread.currentThread().getName()+":"+a);
}
}
最终结果会出现不为20000的结果
需要在add()方法上添加synchronized关键字,这样线程每次执行该方法时会去持有锁再执行
②volatile
Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。
如果在a变量上添加该关键字依然会出现不为20000的结果
③ReentrantLock
可重入锁,默认为非公平锁(允许插队)设置为true公平锁(不允许插队,先申请先执行)
static ReentrantLock look = new ReentrantLock();
look.lock();
look.unlock();
ThredLocal为每个线程维护一个变量副本,用空间换时间
7.hibernate,mybatis
hibernate一级缓存(内置session缓存)二级缓存(可装配SessionFactory缓存),二级缓存会引起并发问题
hibernate 延迟加载原理
get load sava persist savaOrUpdate 方法区别
session重建了关联关系却没有同数据库进行同步和更新
session关联关系:detached对象,persistent对象
spring bean作用域 Singleton ,prototype,request,session, global session
bean 生命周期 :1.实例化 -》2.设置属性值-》3.调用BeanNameAware的setBeanName()方法-》4.调用BeanFactoryAware的setBeanFactory()方法-
-》5.BeanPostProcessors初始化方法-》6.调用InItializingBean的afterPropertiesSet方法-》7.调用定制的初始化方法-》8.调用BeanPostProcessor的后初始化方法
-》9Bean可以使用了 |||| 容器关闭-》调用DisposavleBean的destory方法 -》调用定制的销毁方法
spring AOP
关注点、切面Aspect、切入点pointcut、连接点joinpoint、通知adivce、织入weave、引入introduction
支持五种类型通知,MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice、MethodInterceptor、IntroductionInterceptor
实现方式基于代理AOP、基于@Aspect注解切面、纯POJO切面、注入式Aspect切面
事务传播属性 PROPAGATION_REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务
PROPAGATION_SUPPORTS 支持当前事务,如果没有当前事务就以非事务方式执行
PROPAGTION_MANDATORY 支持当前事务,如果当前没有事务就抛出异常
PROPAGTION_REQUIRES_NEW 新建事务,如果当前存在事务就把当前事务挂起
PROPAGTION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务就把事务挂起
PROPAGTION_NEVER 以非事务方式执行操作,如果当前存在事务,则抛出异常
事务隔离级别
ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别,另外四个与JDBC的隔离界别相对应
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,允许另外一个事务可以看到这个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻想读
ISOLATION_READ_COMMITTED保证一个事务修改的数据提交后太能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读是可以出现幻象读,他除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻象读
web.xml加载顺序 listener-》filter-》servlet、
Interceptor 可以实现HandlerInterceptor接口自定义拦截器
hadoop hdfs(分布式文件存储,有masterdata, filedata 1个数据保存3份) mapReduce(先进行map k,v 再归并 )
activeMQ (主题模式(多个消费者消费同一主题) ,订阅模式(多个 消费者获取相同订阅))
Redis(1.字符串,2.map(k,hashk,hashvalue),3.list(有序列表),4.set(不允许重复值),5sorted-set(有序不允许重复值) )(1rdb 指定时间存储 2aof每次操作存储)(多数据库)
SpringMVC 单例 Restful接口
struts2 多实例
spring ioc aop ,事务3种(1.注解@Transactional 2,.一次配置永久生效3.ProxyFactoryBean+XML)
hibernate(2级缓存,游离态,持久态,瞬时态)
mybatis 接口+XML
springboot (spring-boot-starter-parent)(yml,properties配置)(表单验证@Valid,在原bean上添加注解@Min等)(统一异常处理@ExceptionHandler)
slf4j(日志接口底层logback)
junit(4.x注解)
okhttp(发送get,post)
wsdl2java webservice接口
jsoup 解析html
dom(逐行),sax(全部加载)解析
quartz定时调度
poi excel报表
Ilog规则流
gson,xstream 解析json和xml
protostuff序列化
序列化
RuntimeSchema<XXX> schema = RuntimeSchema.createFrom(XXX.class);
byte [] bytes = ProtostuffIOUtil.toByteArray(xxx, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
返序列化
XXX xxx = schema.newMessage();
ProtostuffIOUtil.mergeFrom(bytes, xxx, schema);
mysql(索引,分区,分表,存储过程)
图像比较(平均哈希(将整张图片转换成灰度,计算平均值,每位上的灰度与平均值相减,组合得到图片指纹),感知哈希(与之前相同只是在转换灰度与计算平均值之前进行DCT转换[离散余弦变换]))
aes对称加密 公钥私钥 sha1 md5 base64非对称加密
时间复杂度i<n j<n循环 O(n^2) i<n j<i n^2/2 不考虑系数,所以也是O(n^2)
html,js,jquery,vue,canvas
id(.) ,class(#),name,标签选择器
base64 比原图片体积大
使用canvas重绘图片
var image = new Image(),
canvas = document.createElement("canvas");
ctx = canvas.getContext('2d');
image.src=src;
image.onload = function() {
var w = image.naturalWidth,
h = image.naturalHeight;
canvas.width = w;
canvas.height = h;
ctx.drawImage(image, 0, 0, w, h, 0, 0, w, h);
}
var base64 = canvas.toDataURL("image/jpeg");
vue MVVM 数据绑定
id=app
var app = new Vue({
el: '#app',
data: {
tabs: [],
isShow : true
},
filters: {
xxxfilter: function (value) {
}
},
methods:{
xxx:function(xx){
}
});
v-show 是否显示
v-for=”(tab,index) in tabs” 循环 {{index}}下标
v-on:click=”xxx()”
{{xxx|xxxfilter}}