一
- java中的锁机制:JUC包中的lock类,先说了这个包下的ConcurrentHashMap,锁分离机制,完全并发读和一定程序的并发写,HashMap线程不安全,如何体现的?多个线程同时调用put方法新增key-value对,可能会覆盖?
- lock:
- 内部实现原理:http://www.cnblogs.com/chenssy/p/4742221.html 锁有状态,获得锁后修改状态,记录了当前拥有该锁的线程,公平锁和非公平锁;
- 可重入性:Synchronized java的内置锁机制是可重入的,注意他和ReentrantLock的区别:lock有trylock、lockInterruptily方法,可以放弃申请锁,可以响应中断,lock还可以实现公平锁,而且,lock可以创建多个condition,实现线程间通信,Synchronized 只能有一对wait、notify。可参考http://blog.youkuaiyun.com/ohehehou/article/details/12883139
- 编程实现去掉.java文件中的注释
二
- 自己设计实现一个线程池:
- 写堆排序
- 设计类时什么情况使用private:一个成员属性只在本类内部使用,但可提供public的get和set方法,供其他类访问和赋值,当然也可以只提供get方法,从而其他用户不能直接修改该变量的值;
- 问题是:提供set方法和把变量设置为public的区别:set方法内部可增加对用户输入的预处理控制,避免无效赋值,例如,用户传入-1来set age属性,那么set方法内部可以抛出异常,设age=0;也就是通过提供接口增加了访问控制;
三
- 现在我们有一个int数组,请你找出数组中每个元素的下一个比它大的元素。给定一个int数组A及数组的大小n,请返回一个int数组,代表每个元素比他大的下一个元素,若不存在则为-1。保证数组中元素均为正整数。时间复杂度为O(n),即只能遍历一遍数组;
- 用栈:
/*找到下一个比他大的元素,没有为-1 *要求只遍历一遍数组:用栈,从后向前找,栈顶元素为当前元素的目标元素 *初始值,栈中压入-1,因为最后一个元素对应的目标值就为-1*/ public int[] findNext(int[] A, int n) { int[] rst = new int[n]; Stack<Integer> stack = new Stack<Integer>(); stack.push(-1); for(int i=n-1;i>=0;i--){ int top = stack.peek(); while(top != -1 && A[i] >= top){ stack.pop(); top = stack.peek(); } //否则,找到了目标值,肯定是栈顶元素,为-1或者数组中的值 rst[i] = top; stack.push(A[i]); } return rst; }
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。参考:http://blog.chinaunix.net/uid-26456800-id-3363899.html http://www.cnblogs.com/beanmoon/p/3689107.html
- 数组中的数分为两组,让给出一个算法,使得两个组的和的差的绝对值最小,数组中的数的取值范围是0<x<100,元素个数也是大于0, 小于100 。
比如a[]={2,4,5,6,7},得出的两组数{2,4,6}和{5,7},abs(sum(a1)-sum(a2))=0;
比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1,所以得出的两组数分别为{2,10}和{5,6}。
- http://blog.youkuaiyun.com/pegasuswang_/article/details/25081783