final修饰的变量会指向一块固定的内存, 这块内存中的值不能改变.
存储过程
禁止使用存储过程,存储过程难以调试和扩展,更没有移植性
count()
count(*)会统计为NULL的行,count(列名)不会统计此列为NULL值的行
count(distinct col) 计算该列除NULL之外的不重复行数
当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL,
避免NPE问题,select IFNULL(SUM(colum),0) from table;
泛型:是一种把明确类型的工作推迟到创建对象或调用方法的时候才去明确的特殊类型
多态
父类引用指向子类对象,调用方法时会调用子类的实现而不是父类的实现。多态的实现的关键在于“动态绑定”
transient
transient 关键字只能修饰变量,而不能修饰类,方法
被transient修饰的变量不能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化
一个变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问,也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通成员变量一样被初始化
素数 合数
指数又称为素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数,2,3,5,7,11,13,17
合数:只自然数除了能被1和本身整除外,还能被其他数(0除外)整除的数
HashSet是基于HashMap来实现的,更像是对HashMap的封装
301 302
301 redirect : 永久性转移,搜索引擎在抓取新内容的同时也将旧网址交换为重定向之后的网址
302 redirect:暂时性转移,搜索引擎会抓取新内容保留旧网址
#{} ${}
{} 是经过预编译,${}未经过预编译,仅仅是取变量的值,是非安全的,存在SQL注入
并发 并行
并行:逻辑上同时发生,指在同一时间内同时运行多个程序
并发:物理上同时发生,指在同一时间点同时运行多个程序
守护线程:在没有用户线程服务时会自动离开,有用户线程,一直在
sleep() wait()
sleep() wait()
- Thread.sleep() Object.wait()
- sleep() 在任何地方使用,wait()方法只能在同步方法或同步块中使用
- sleep() 让出了cpu,并不会释放同步资源锁
wait() 会释放锁,等待nofity()/notifyAll()唤醒指定的线程
线程池状态
running: 线程池一旦被创建,就出入running状态,任务数为0,能接受新任务,对已排队的任务进行处理
shutDown: 不接受新任务,但能处理已排队的任务。
stop: 不接受新任务,不处理已排队的任务,并会中断正在处理的任务。
tidying:
teminated: 线程池彻底终止。线程池在tidying状态执行完terminated()方法就会由tidying转变为terminated状态
避免死锁
- 尽量使用tryLock,设置超时时间
- 尽量使用concurrent 并发类代替自己手写锁
- 尽量降低锁的使用颗粒度,尽量不要几个功能用同一把锁
- 尽量减少同步代码块
ThreadLocal为每个使用该变量的线程提供独立的变量副本。
Synchronized
synchronized底层实现原理
jvm基于进入和退出monitor对象来实现方法同步和代码块同步
synchronized 是可重入的,所以不会自己把自己锁死
synchronized 锁一旦被一个线程持有,其他试图获取该锁的线程将被阻塞
乐观锁 悲观锁
悲观锁:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁
共享资源每次只给一个线程使用,其他线程阻塞,用完后再把资源转让给其他线程
乐观锁:
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间有没有去更新这个数据,可以使用版本号和CAS算法实现。
乐观锁适用于多读的应用类型,这样可以提供吞吐量
乐观锁:缺点
1.ABA
2.循环时间长开销大
自旋CAS(也就是不成功就一直循环执行直到成功),如果长时间不成功,会给CPU带来非常大的执行开销。
- 只能保证一个共享变量的原子操作
反射:就是通过class文件对象,去使用该文件中的成员变量、构造方法、成员方法。
序列化、反序列化
序列化:将java对象转换成字节流的过程
反序列化:将字节流转换成java对象的过程
当java对象需要在网络传输或者持久化存储到文件中时,就需要对java对象进行序列化处理
声明为static、transient的成员变量,不能被序列化
BIO NIO AIO
BIO(同步阻塞):客户端在请求数据的过程中,保持一个连接,不能做其他事情。
NIO(同步非阻塞):客户端在请求数据的过程中,不用保持一个连接,不能做其他事情。(不用保持一个连接,而是用许多个小连接,也就是轮询)
AIO(异步非阻塞):客户端在请求数据的过程中,不用保持一个连接,可以做其他事情。(客户端做其他事情,数据来了等服务端来通知。)
权限修饰符
private 、 默认 、protected 、public
本类、同一包下 、不同包下的子类、不同包下的无关类
Java克隆
相对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆,Java语言中克隆针对的是类的实例
浅拷贝:
浅拷贝只是复制了对象的引用地址,两个对象指向同一内存地址,所以修改其中任意的值,另一个值都会随着变化,这就是浅拷贝
深拷贝:
深拷贝是将对象及其值复制过来,两个对象修改其中任意的值,另一值不会改变,这就是深拷贝
实现对象克隆:
- 实现Cloneable接口并重写Object类中的clone()方法。
- 实现Serializable接口,通过对对象的序列化和反序列化实现克隆,可以实现真正的深度克隆
throw throws
throw 方式体中,后面跟异常对象,只能有一个,说明这里肯定有一个异常对象产生
throws 方式声明上,后面跟的是异常类名,可以是多个,说明这里可能会产生异常
TCP UDP
UDP 是一种无连接的协议
TCP 是一种面向连接的保证可靠的协议
区别:
把数据打包
数据有限制
不建立连接
速度快
不可靠
建立连接通道
数据无限制
速度慢
可靠
Class类是Java反射机制的起源和入口,用于获取与类相关的各种信息,提供了获取类信息的相关方法。
字符串拼接
- 直接使用+
- 使用String的concat方法
- StringBuilder . append
Servlet 中实现页面跳转两种方式
在Servlet中实现页面跳转的两种方式:转发和重定向
转发:由服务器端进行的页面跳转
- 地址栏不会发生改变
- 请求1次
- 请求域中的数据不会丢失
重定向:由浏览器进行的页面跳转
- 地址栏显示新的地址
- 请求2次
- 请求域中的数据会丢失
Session Cookie
session和cookie
1 . session在服务端,cookie在客户端
- session的运行依赖于sessionId,而sessionId是存在cookie中的,也就是说,如果浏览器禁用了cookie,同时session也会失效
(但是可以通过其他方式实现,比如在url中传递sessionId)
session 原理
浏览器第一次访问服务器时,服务器会生成session,并把sessionId返回客户端,通过set-cookie
客户端收到sessionId会将它保存在cookie中,当客户端在此访问会带着这个sessionId
cookie : 由服务端生成,可以设置失效时间,默认关闭后失效 4kb
localStorage: 除非永久清楚,否则永久保存 5mb
sessionStorage: 仅在当前会话有效,关闭页面或者浏览器被清除 5mb
CSRF CORS
CSRF 是跨站请求伪造,Cross-site request forgery,
防范
- 检查Referer字段
- 添加效验token
CORS 跨域请求 Cross-orgin requests
XSS
XSS 是跨站脚本攻击 Cross Site Scripting,代码注入
恶意攻击者往Web页面里面插入恶意Script代码,当用户浏览该页的时候,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
防范手段
- 首先是过滤,对诸如