解析:B
解决哈希冲突的方法有三种,分别是:
开放地址法:寻找下一个为空的数组下标,而后将冲突元素存储
再散列法(二次哈希法):再次使用一个不同的哈希算法再计算一次 (第一次%16换另一个数进行%运算)
链地址法(拉链法):将所有冲突元素按照链表存储,冲突后时间复杂度变为O(1+n)n为冲突元素个数)[hashMap就是用这种方法]
解析:D
解析:A
CopyOnWriteArrayList适用于写少读多的并发场景。
ReadWriteLock即为读写锁,他要求:
写与写之间互斥,读与写之间互斥,读与读之间可以并发执行。
在读多写少的情况下可以提高效率。
ConcurrentHashMap是采用分段锁机制,写操作加锁,读操作不加锁。
volatile只保证多线程操作的可见性,不保证原子性。
解析:D
Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。
共同点:
1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
不同点:
1.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。 sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
2.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
3.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
4.sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
5.wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
编程题:
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数(数值为0或者字符串不是一个合法的数值则返回0)。
输入描述 :输入一个字符串, 包括数字字母符号, 可以为空
输出描述 :如果是合法的数值表达则返回该数字,否则返回0
输入例子 :
+2147483647
1a33
输出例子 :
2147483647
0
public static int StrToInt(String str){
//str.length() == 0和str.equals("")是一个东西,用来判断字符串是否为空值;
//(1)首先要判断字符串是否为空,然后将字符串转换成字符数组;
//(2)字符'0'对应的ASCII码值是48(转化为int类型),而字符'9'对应的ASCII码值是57,考虑是否溢出;
//(3)把读出的每一个数字累加,为最后的结果
if (str.length() == 0 || str.equals("")){
return 0;
}
char[] arr = str.toCharArray();
boolean flag = true;
int start = 0 ;
if (arr[0] == '+' || arr[0] =='-'){
start = 1 ;
if ( arr[0] == '-'){
flag = false;
}
}
int sum = 0;
for (int i = start; i < arr.length; i ++){
if (arr[i]<48 || arr[i]>57){
return 0;
}
sum = sum*10 + (arr[i]-'0');
}
return flag ? sum:sum*(-1);
}
Java中三目运算符:
三目运算的基本表达式:条件表达式=b?x:y。
如下图所示:表达的意思是如果b为true,则计算x的值,如果b为false,则计算y的值;
如果flag为true,返回值为sum,如果flag为false返回值为sum*(-1);