1.SQLserver数据库数据复制方式数据复制方式 有4种:快照发布、事务性发布、具有可更新订阅的事务性发布、合并发布。
2.Java中的深拷贝和浅拷贝浅拷贝与深拷贝 浅拷贝:浅拷贝:创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。 Object 类提供的 clone 是只能实现 浅拷贝的。 深拷贝:深拷贝:创建一个新对象,然后将当前对象的非静态字段复制到该新对象,无论该字段是值类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容。
要实现深拷贝: ①、让每个引用类型属性内部都重写clone() 方法 ②、利用序列化
3.http和https的区别添加链接描述
4.内存泄漏
5.CAS的底层实现
6.异或 任何数与0进行异或,为它本身,两个相同的数进行异或运算,会得到0。
7优先队列PriorityQueue 先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序, 可以放基本数据类型的包装类(如:Integer,Long等)或自定义的类 对于基本数据类型的包装器类,优先队列中元素默认排列顺序是升序排列 但对于自己定义的类来说,需要自己定义比较器 peek()//返回队首元素 poll()//返回队首元素,队首元素出队列 add()//添加元素 size()//返回队列元素个数 isEmpty()//判断队列是否为空,为空返回true,不空返回false Java的优先队列是小根堆(堆顶的元素为最小元素),是根据自然排序来进行优先级的判断,所以自定义的类想要加进优先队列中必须先实现Comparable接口,编写compareTo的方法,方可以使用!
8AtomicInteger原子类原理原子类原理 利用CAS+volatile+native方法(unsafe.getAndAddInt()方法)实现的, 底层还是通过compareAndSwapInt这个CAS机制来完成的增加操作, 第一个参数var1表示的是当前对象,也就是a。 第二个参数var2表示的是地址偏移量 第三个参数var3表示的是我们要增加的值,这里表示为1 对于AtomicInteger的原理就是这,主要是通过Usafe的方式来完成的。
9数据库索引的数据结构 1)哈希表: 只能支持精确匹配索引列 不支持范围查询,select * from xx where id > 23; 这时就没办法索引了 不支持排序order by 数据量大的时候哈希冲突也会增加 2)B+树:
1001背包问题 01背包问题详细解答
11java8抽象类和接口的区别 相同点: 1)都是抽象类型; 2)都可以有实现方法(以前接口不行); 3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)
不同点: 1)抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承); 2)抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系; 3)接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
12.hashmap多线程产生环链造成死锁的原因 HashMap是非线程安全,死锁一般都是产生于并发情况下。我们假设有二个进程T1、T2,HashMap容量为2,T1线程放入key A、B、C、D、E。在T1线程中A、B、C Hash值相同,于是形成一个链接,假设为A->C->B,而D、E Hash值不同,于是容量不足,需要新建一个更大尺寸的hash表,然后把数据从老的Hash表中 迁移到新的Hash表中(refresh)。这时T2进程闯进来了,T1暂时挂起,T2进程也准备放入新的key,这时也 发现容量不足,也refresh一把。refresh之后原来的链表结构假设为C->A,之后T1进程继续执行,链接结构 为A->C,这时就形成A.next=B,B.next=A的环形链表。一旦取值进入这个环形链表就会陷入死循环。
13.Java对象投的组成结构
14.spring的核心组件都有什么?springMVC的核心组件都有什么?