面试准备
2016-07-10 13:38
274 查看
事务隔离级别
[1] 脏读:
所谓脏读,就是读了未提交的数据。举个例子:B事务读取了A事务尚未commit的数据,不巧的是,之后A事务rollback了,这就叫脏读。
[2] 不可重复读:
所谓不可重复读,就是一个事务多次读取某一行,但是这一行在多次读取之中的值不一致(这个事务并为对这行作任何修改操作)。举例:A事务多次读取某一行,在它多次读取操作之间,B事务修改了这一行,这就是不可重复读。
[3] 幻像:
所谓幻像,在一个尚未提交的事务的读取的行的范围中插入新行或删除现有行。举例:B事务对A事务读取的行范围内插入新行或删除行,而A事务之后还会访问这些行(即操作会受到这些行的影响),这样A事务中就发生了幻像。
有序集合合并
快排
冒泡
常见异常
ArithmeticException(算术异常)
ClassCastException (类转换异常)
IllegalArgumentException (非法参数异常)
IndexOutOfBoundsException (下表越界异常)
NullPointerException (空指针异常)
String的编码转换
String s1 = "你好";
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");
递归实现字符串反转
类的初始化顺序
1.先初始化静态成员,
2.然后调用父类构造器,
3.再初始化非静态成员,
4.最后调用自身构造器。
序列化
用处:实现深度克隆、实现对象持久化、实现对象网络流传输
持久化到文件的例子:
深度克隆的例子:
序列化ID的用处
1、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
2、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
设计模式的六大原则
总原则:开闭原则。
对扩展开放,对修改关闭。
单一职责原则。类的职责应该是单一的。
里氏替换原则。子类可以随时随地替换父类。
依赖倒置原则。面向接口编程。依赖于抽象而不依赖于具体。
接口隔离原则。每个接口中不存在子类用不到却必须实现的方法。
合成复用原则。尽量用关联而不是继承。
迪米特法则。一个类对自己依赖的类知道的越少越好。
静态内部类版本的单例模式:
原型模式 就是复制原型对象。
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
浅复制的原型模式:
装饰模式(Decorator)
顾名思义,装饰模式就是给一个对象增加一些新的功能,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,
适配器模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
类的适配器模式是:继承原类,实现目标接口。
对象的适配器模式是:持有原对象(关联关系),实现目标接口。
接口的适配器模式是:通过抽象类实现接口,类只实现抽象类中需要的方法就好。
享元模式-共享池-数据库连接池
观察者模式
具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
[1] 脏读:
所谓脏读,就是读了未提交的数据。举个例子:B事务读取了A事务尚未commit的数据,不巧的是,之后A事务rollback了,这就叫脏读。
[2] 不可重复读:
所谓不可重复读,就是一个事务多次读取某一行,但是这一行在多次读取之中的值不一致(这个事务并为对这行作任何修改操作)。举例:A事务多次读取某一行,在它多次读取操作之间,B事务修改了这一行,这就是不可重复读。
[3] 幻像:
所谓幻像,在一个尚未提交的事务的读取的行的范围中插入新行或删除现有行。举例:B事务对A事务读取的行范围内插入新行或删除行,而A事务之后还会访问这些行(即操作会受到这些行的影响),这样A事务中就发生了幻像。
有序集合合并
//有序集合合并 int i=0,j=0,k=0; c = new int[a.length+b.length]; while(i<a.length&&j<b.length){ if(a[i]<b[j]){ c[k++] = a[i++]; }else{ c[k++] = b[j++]; } } while(i<a.length){ c[k++] = a[i++]; } while(j<b.length){ c[k++] = b[j++]; }
快排
<span style="font-size:12px;">/* * 1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。 * * 2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。 * * 3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。 * * 4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中 */ public static void quickSort(int[] arr, int l, int h) { int lx = l; int hx = h; int x = arr[lx];// 基数 while (lx < hx) { while (hx > lx && arr[hx] > x) hx--; if (hx > lx) { arr[lx] = arr[hx]; hx--; } while (lx < hx && arr[lx] < x) lx++; if (lx < hx) { arr[lx] = arr[hx]; lx++; } ; } arr[lx] = x; quickSort(arr, l, lx - 1); quickSort(arr, hx, h); };</span>
冒泡
<span style="font-size:12px;">/* * 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 * * 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 * * 3.针对所有的元素重复以上的步骤,除了最后一个。 * * 4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 */ public static void bubbleSort(int[] arr) { for (int j = arr.length - 1; j > 0; j--) for (int i = 0; i < j; i++) { if (arr[i] > arr[i + 1]) { int temp; temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } for(int i: arr){ System.out.print(i+"\t"); } }</span>
常见异常
ArithmeticException(算术异常)
ClassCastException (类转换异常)
IllegalArgumentException (非法参数异常)
IndexOutOfBoundsException (下表越界异常)
NullPointerException (空指针异常)
String的编码转换
String s1 = "你好";
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");
递归实现字符串反转
public static String reverse(String originStr) { 02. if(originStr == null || originStr.length() <= 1) 03. return originStr; 04. return reverse(originStr.substring(1)) + originStr.charAt(0); 05. }
类的初始化顺序
1.先初始化静态成员,
2.然后调用父类构造器,
3.再初始化非静态成员,
4.最后调用自身构造器。
序列化
用处:实现深度克隆、实现对象持久化、实现对象网络流传输
持久化到文件的例子:
Customer customer = new Customer("gacl",25); // ObjectOutputStream 对象输出流 ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream( new File("E:/Customer.txt"))); oo.writeObject(customer); System.out.println("Customer对象序列化成功!"); oo.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream( new File("E:/Customer.txt"))); Customer customer = (Customer) ois.readObject(); System.out.println("Customer对象反序列化成功!"); return customer;
深度克隆的例子:
ByteArrayOutputStream bout = new ByteArrayOutputStream(); 16. ObjectOutputStream oos = new ObjectOutputStream(bout); 17. oos.writeObject(obj); 18. 19. ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); 20. ObjectInputStream ois = new ObjectInputStream(bin); 21. return (T) ois.readObject();
序列化ID的用处
1、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
2、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
设计模式的六大原则
总原则:开闭原则。
对扩展开放,对修改关闭。
单一职责原则。类的职责应该是单一的。
里氏替换原则。子类可以随时随地替换父类。
依赖倒置原则。面向接口编程。依赖于抽象而不依赖于具体。
接口隔离原则。每个接口中不存在子类用不到却必须实现的方法。
合成复用原则。尽量用关联而不是继承。
迪米特法则。一个类对自己依赖的类知道的越少越好。
静态内部类版本的单例模式:
<span style="font-size:12px;color:#000000;">public class Singleton { 2. 3. /* 私有构造方法,防止被实例化 */ 4. private Singleton() { 5. } 6. 7. /* 此处使用一个内部类来维护单例 */ 8. private static class SingletonFactory { 9. private static Singleton instance = new Singleton(); 10. } 11. 12. /* 获取实例 */ 13. public static Singleton getInstance() { 14. return SingletonFactory.instance; 15. } 16. 17. /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */ 18. public Object readResolve() { 19. return getInstance(); 20. } 21. } </span>
原型模式 就是复制原型对象。
浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。
浅复制的原型模式:
<span style="font-size:12px;color:#000000;">public class Prototype implements Cloneable { 2. 3. public Object clone() throws CloneNotSupportedException { 4. Prototype proto = (Prototype) super.clone(); 5. return proto; 6. } 7. } </span>
装饰模式(Decorator)
顾名思义,装饰模式就是给一个对象增加一些新的功能,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,
适配器模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
类的适配器模式是:继承原类,实现目标接口。
对象的适配器模式是:持有原对象(关联关系),实现目标接口。
接口的适配器模式是:通过抽象类实现接口,类只实现抽象类中需要的方法就好。
享元模式-共享池-数据库连接池
观察者模式
抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。
相关文章推荐
- 文件编码方式的分析与理解
- 《剑指Offer》面试题55:字符流中第一个不重复的字符
- 华为机试题【12】-关灯泡
- 华为机试题【12】-关灯泡
- 面试题一帖汇总
- OSChina 周日乱弹 ——致程序员的老婆们
- 最厉害的面试技巧都有哪些?
- 苦逼程序员:半数加班(转)
- 2016腾讯IEG实习面试
- 成为Java顶尖程序员 ,看这11本书就够了
- 剑指offer面试题6:重建二叉树
- 面试题笔记
- 程序员旅游之吐糟途牛——第一天
- 华为机试题【11】-报数删除人
- 剑指offer面试题12 使用BigInteger来实现 打印1到最大的n位数
- 并查集(求朋友圈的个数)
- 《剑指Offer》面试题57:删除链表中重复的节点
- 第140课: Spark面试经典系列之数据倾斜解决之并行度的深度使用
- 中小企业监控体系构建_知识分享【面试总结】
- 《剑指Offer》面试题56:链表中环的入口节点