LU
1 消息机制
2 数据库索引
3 死锁
4 秒杀系统
5 sleep和wait的区别
Thread.sleep(1000);
try{
obj.wait();//suspend thread until obj.notify() is called
}
catch(InterrputedException e) {
}
sleep和wait的区别有:
1,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4, sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
6 合并已排序好的linkedlist,允许有重复的元素
Java 的 Iterator 在访问节点的时候,调用 next() 方法,会自动前进一位。ListIterator.previous方法,有回到上一个节点的作用
public List<Integer> merge(LinkedList<Integer> list1, LinkedList<Integer> list2) {
if (list1 == null) {
return list2 == null ? Collections.emptyList() : new LinkedList(list2);
}
if (list2 == null) {
return new LinkedList(list1);
}
ListIterator<Integer> iter1 = list1.listIterator();
ListIterator<Integer> iter2 = list1.listIterator();
LinkedList<Integer> result = new LinkedList<>();
while(iter1.hasNext() || iter2.hasNext()) {
if(iter1.hasNext() && iter2.hasNext()) {
Integer val1 = iter1.next(); //这里next默认前进了一位
Integer val2 = iter2.next();
if (val1 < val2) {
result.add(val1);
iter2.previous();
} else {
result.add(val2);
iter1.previous();
}
} else if (!iter1.hasNext()) {
Integer val = iter2.next();
result.add(val);
} else {
Integer val = iter1.next();
result.add(val);
}
}
return result;
}
7 排列组合、赛马问题
赛马是7
排列组合10个球,用6块挡板分隔有9选6种方法,84种
youzu
1 java中基本数据类型所占字节
int 4, short 2, long 8,float 4, double 8, char 2
2 java移位运算符以及位运算符
“>>” 右移,相当于除以2
“>>>” 无符号右移,忽略符号位,空位都以0补齐
&与 |或 ~非 ^异或(相同为0,不同为1)
3 求这个数的类型
(short)10/10.2 * 3 好像是double
4 生成0到1之间的随机数
Math.random()
5 逆序输出一个字符串
这里注意,数组的长度是length,数组的遍历可以用foreach这种
6 判断list和String的修改
@Test
public void testString(){
List<String> list = new ArrayList<>();
String a = "a";
change(list, a); //point
for (String item : list){
System.out.println(item);
}
System.out.println(a);
}
public List<String> change(List<String> list, String a){
list.add("b");
list = new ArrayList<>(); //point
list.add("c");
a.replace("a","c"); //point
return list;
}
以上的写法,结果为b和a
@Test
public void testString(){
List<String> list = new ArrayList<>();
String a = "a";
a = change(list, a); //这里替换为给String赋值,打印结果仍为b和a,如果改为 //给list赋值,结果为c和a
for (String item : list){
System.out.println(item);
}
System.out.println(a);
}
public String change(List<String> list, String a){
list.add("b");
list = new ArrayList<>();
list.add("c");
a.replace("a","c");
return a;
}
这里还有别的写法,不过要注意LinkedList是不能在初始化时指定大小的,如下:
public List<Integer> merge(LinkedList<Integer> list1, LinkedList<Integer> list2) {
if (list1 == null) {
return list2 == null ? Collections.emptyList() : new LinkedList(list2);
}
if (list2 == null) {
return new LinkedList(list1);
}
List<Integer> result = new LinkedList();
for(Integer i : list1) {
for(Integer j : list2) {
if (i >= j) {
result.add(j);
} else {
result.add(i);
break;
}
}
}
return result;
}
7 用Runnable方式实现一个线程,每3秒打印出当前时间
public static void main(String[] args) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(3000);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println(df.format(new Date()));// new Date()为获取当前系统时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.start();
}
8 $(document).ready(function(){})和window.onload的区别
首先要注意一点, (function())和 (document).ready(function(){})是等效的,区别仅是前者属于简写。再者,这两者是在dom加载完之后执行的,而wimdow.onload是在dom和所有文件加载完成之后执行的。还有一点是,window.onload只会执行一个,即如果写了多个,但是实际只会执行一个的,但是另一者可以执行多个。
9 产生0到1之间的随机数
Random rand = new Random();
double num = rand.nextDouble();