什么是事务?
在数据库操作中,一项事务是指由一条或多条对数据库更新的sql语句所组成的一个不可分割的工作单元。只有当事务中的所有操作都正常完成了,整个事务才能被提交到数据库,如果有一项操作没有完成,就必须撤消整个事务。
事务除了事务提交和事务回滚还有什么
还有ACID
ACID(事务)分别表示(数据库事务正确执行的四个基本要素的缩写)
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
Final,finally,finilize的区别
1.final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承
内部类要访问局部变量,局部变量必须定义成final类型。
2.Finaly是异常处理语句结构中的一部分,表示总是执行
3.Finalize是Object类中的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,
可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用。
Tcp得到理解
3次握手 1:客户端首先要请求服务端准备创建连接
2: 服务端接收到后,要告诉客户端:我接受到了
3:理论上这时就创建连接成功了,但是要防止意外,所以客户端要再发一个消息给服务端确认一下
4次挥手 1:当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口,发送给b请求
2: 主机B收到A发送的FIN,表示收到了,就会发送ACK回复
3:但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。
4:A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。
三次握手:
A:“喂,你听得到吗?”A->SYN_SEND
B:“我听得到呀,你听得到我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED
A:“我能听到你,今天balabala……”B->ESTABLISHED
四次挥手:
A:“喂,我不说了。”A->FIN_WAIT1
B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2
B:”好了,说完了,我也不说了。”B->LAST_ACK
A:”我知道了。”A->TIME_WAIT | B->CLOSED
A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED
http和https的区别
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
Java中static是什么意思,有什么用?
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
重载和覆盖(重写)的区别
同一个类中,方法名相同,参数列表不同(参数个数、类型、顺序),与方法返回值、修饰符无关叫重载。
在一个子类包含与父类同名方法的现象称为方法重写
多态和抽象类的区别
抽象
如果一个类中,只有方法定义,没有方法的具体实现,那么该方法就称为抽象方法。而拥有抽象方法的类叫做抽象类,使用关键字static定义,抽象类并不能直接实例化,如果想要实例化抽象类,那么需要抽象类变量指向其子类对象。
在抽象类中可以定义抽象方法,也可以定义具体方法,如果一个类继承抽象类,那么必须重写抽象类中定义的所有抽象方法。
抽象方法定义的意义在于,使用父类变量指向子类对象时,可以对抽象方法进行调用。
多态
①使用父类类型的引用指向子类的对象;
②该引用只能调用父类中定义的方法,不能调用子类中独有的方法;
③如果子类中重写了父类中的一个方法,那么在调用该方法的时候,将会调用子类中的这个方法;
④在多态中,子类可以调用父类中的所有方法;
⑤多态主要体现为方法重载和方法重写,相同的行为,不同的实现方式;
⑥多态的主要应用是多态参数和多态集合
⑦如果一个方法中有父类作为参数类型,就意味着可以给该方法传递任何一个子类对象。
数组和链表的区别
综述:数组是线性结构,可以直接索引,即要去第i个元素,a[i]即可。链表也是线性结构,要取第i个元素,只需用指针往后遍历i次就可。貌似链表比数组还要麻烦些,而且效率低些。
数组在内存中连续,链表不连续;
数组元素在栈区,链表元素在堆区
(1)数组的优点:
i:随机访问性强
ii:查询速度快
(2)数组的缺点:
i:增删速度慢
ii:可能浪费内存
iii:内存空间要求高,必须有足够大的连续内存存储空间。
iiii:数组的大小固定,不能动态扩展。
(3)链表的优点
i:插入删除速度快
ii:大小不固定,可以动态扩展。
iii:内存利用率高,不会浪费内存
(4)链表的缺点:
i:不能随机查找,必须从第一个开始遍历,查找效率低
get和post的区别
get提交的数据最大是2k
post理论上没有限制。实际上IIS4中最大量为80KB,IIS5中为100KB。
GET产生一个TCP数据包
POST产生两个TCP数据包
GET使用URL或Cookie传参
POST将数据放在BODY中
GET的URL会有长度上的限制
POST的数据则可以非常大
POST比GET安全,因为数据在地址栏上不可见
内连接和外链接的区别
内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接
左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。
右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。
全外连接:左外连接 union 右外连接。
你常见的异常都有哪些
ClassCastException - 类型转换异常
NullPointerException - 空指针异常
NumberFormatException - 数据格式异常
NoClassDefFoundException - JAVA运行时系统找不到所引用的类
IllegalArgumentException - 非法参数异常
SecurityException - 安全异常
IndexOutOfBoundsException -下标越界异常
session和cookie的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
HashMap的底层原理
在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。
在JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
简单说下HashMap的实现原理:
首先有一个每个元素都是链表(可能表述不准确)的数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率。
当链表数组的容量超过初始容量的0.75时,再散列将链表数组扩大2倍,把原链表数组的搬移到新的数组中
什么是乐观锁什么是悲观锁
乐观锁是在应用层枷锁,而悲观锁是在数据层加锁(for update)
乐观锁顾名思义就是操作时很乐观,这数据只有我在用,我先尽管用,最后发现不行时就回滚。
悲观锁在操作时很悲观,生怕数据被其他人更新掉,我就先将其锁住,让别人用不了,我操作完成后再释放掉。
悲观锁需要数据库级别上的实现,程序是做不到的,如果在长事务环境中,数据会一直被锁住,导致并发性能大大降低。
一般来说如果并发量很高的话,建议使用悲观锁,否则的话就使用乐观锁。
如果并发量很高时使用乐观锁的话,会导致很多的并发事务回滚、操作失败。
总之,冲突几率大用悲观,小就用乐观。