一.数据库四个特性
ACID
1.原子性 Atomicity
要么全部成功,要么全部失败
2.一致性 Consistency
执行之前和执行之后都必须处于一致的状态
ex:A账户+B账户=100 不管两个人怎么转账 都还是100
3.隔离性 Isolation
同一时间,只允许一个事物请求同一数据,多并发事物之间要隔离 以下4种隔离级别
1)串行化(最高级别)
加锁 保证事物一个一个进行
2)可重复读
对事物涉及到的数据上锁 但是无法阻止insert
3)读已提交(默认)
4)读未提交(最低级别)
4.持久性 Durability
事物一但被提交,则对数据库中数据的改变就是永久的
可以通过sql语句SELECT @@tx_isolation查找隔离
通过sql语句 set session transaction isolation level设置隔离
二.异常
运行时异常不需要捕获 但是检查型异常需要 比如IOException
三.sql优化
1.select * from t 用具体字段代替 *
2.避免select id from t where name is null where会进行全表扫描
3.varchar代替char节省空间 char是固定长度 varchar是随着存储长度变化而变化的
4.能使用数字型字段就不要用字符型 因为字符型在查询时会比较串里的每个字符 但是数字比较一次就可以了
5.where 和 order by 字段考虑建立索引
四.自动拆装箱
原始类型与其封装类的转换
int - Integer 装箱
Integer - int 拆箱
五.线程局部变量
线程内共享 线程间互斥
只属于当前调用他的线程 值不会因其他线程变化
Java线程学习笔记之线程局部变量_薛小强Forever-CSDN博客
六.JDK JRE JVM
包含关系
七.可变参数
可以调用n个参数 是指定类型就好
public Object sum(int ... numbers){
//numbers当数组处理
numbers.length;
}
//调用
sum(1)
sum(1,2)
sum(1,2,3)
八.Redis
redis把数据保存在内存中,定期把数据从内存转移到硬盘中 在redis.conf中配置 通过save命令 存储到dump.rdb文件
九.内部类
成员内部类相当于外部类的一个成员 成员内部类依附外部类而存在,创建成员内部类的对象前提是必须存在一个外部类对象
ex:
声明时
public class Outer{
class Inner{
}
}
Outer out = new Outer();
Inner inner = out.new Inner();
除外,还有局部内部类,静态内部类
匿名内部类 其实是我们最常用到的内部类 我们都把里边的方法实现了 但是没给实现类取名字
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}){
}.start();
new Comparable<Object>() {
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
};
new Thread() {
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(Thread.currentThread().getName() + "--"
+ x);
}
}
}.start();
十.内存优化/配置
-Xms1024M java堆空间最小值
-Xmx2048M java堆空间最大值
-XX:PermSize=1024m 持久代堆空间最小值
-XX:MaxPermSize=2048m 持久代堆空间最大值
十一.垃圾回收算法
深入JVM垃圾回收算法_Floating Cat-CSDN博客
1.标记-清除算法
顾名思义 先标记 再清除
2.标记-复制算法
空间一分为二 回收时存活的对象被复制到另一区域 原先的区域被重置
3.标记-整理算法
让存活的对象往另一端移动
4.分代收集算法
根据年代特点采取不同算法
新生代:标记-复制算法不用按1:1划分
老年代(一个对象存活时间足够长,会被复制到老年代):标记-清除,标记-整理算法
5.增量收集算法
先标记着,不清除
十二.关于锁
死锁:互相持有对方资源并且都不主动释放会产生死锁 比如递归方法在方法声明上用synchronized
下边链接里那个堵车的图就特别形象
什么是死锁以及避免死锁 - hadoop_dev - 博客园
乐观锁:数据库加个字段(version),每次更新,version会随之递增,若更新时,发现和当前version不一致,则不更新
也可以用时间戳
CAS也是乐观锁 compare and set(compare and swap)
有一些原子类型的类,比如 AtomicInteger AtomicBoolean 有compareAndSet的类
第一个参数,比较当前的值和第一个参数是否一致
第二个参数,如果当前值和第一个参数一致,就把当前值设置为第二个参数
悲观锁:synchronized
十三.线程池队列已满再添加任务会发生什么
如 Executors.newFixedThreadPool(10) 底层是LinkedBlockingQueue 无界限那就等线程池已有任务执行完再执行他
如果是有界限的 那就不会执行新添加进来的任务
十四.类加载
1)隐式:new时 隐式调用类加载器加载对应的类到jvm
2)显示:class.forname
Java类加载器ClassLoader总结 - 时间朋友 - 博客园
十五.值传递和引用传递
值传递:基本类型 以及基本类型的封装类 和String s="123"
引用传递:操作的直接是源数据
十六.接口能否继承
类不能继承,但接口能继承
如 dao层继承jpa
@Repository
public interface AlertRuleRepository
extends PagingAndSortingRepository<AlertRule, String>, JpaSpecificationExecutor<AlertRule>,JpaRepository<AlertRule, String> {}
十七.fail-fast
常见 但是我刚知道
fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件
两个线程遍历一个collection 一个使之发生结构变化 比如在remove 另一个就会抛异常
十八.面向切面和过滤器
面向切面是在某个方法执行前后进行业务处理 比如定义一个自定义注解 通过@Pointcut @Before @After @Around执行业务
过滤器通常是在WEB.XMl配置后拦截url请求 进行权限校验
十九.Hibernate的get和load
都是根据Id进行单条查询
get方法被调用时立即执行sql
User user = session.get(User.class,"1");
load在获取除id外的属性时才执行sql
User user = session.load(User.class,"1");
user.getId();//不执行
user.getName();//执行
二十.@Autowired
消除get/set方法,不用再xml中配property属性
二十一.跳出多层循环
public static void main(String[] args){
a:for(int i=0;i<3;i++){
b:for(int j=0;j<3;j++){
if(j==1){
break a;
}
}
}
}
如果不加标签,break跳出当前这层循环,continue跳出本次循环,return直接连下边的方法都不走了