1.下面哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换:
byte[] src,dst;
- dst=String.fromBytes(src,“GBK”).getBytes(“UTF-8”)
- dst=new String(src,“GBK”).getBytes(“UTF-8”)
- dst=new String(“GBK”,src).getBytes()
- dst=String.encode(String.decode(src,“GBK”)),“UTF-8” )
解析:
String(byte[]bytes,Charset charset):通过指定的charset解码指定的byte数组,构成一个新的String。
getBytes(Charset charset):使用给定的charset将此String编码到byte序列,并返回新的byte数组。
2.下列关于java并发的说法中正确的是:
- copyonwritearraylist适用于写多读少的并发场景
- readwritelock适用于读多写少的并发场景
- concurrenthashmap的写操作不需要加锁,读操作需要加锁
- 只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候 就是线程安全的
解析:
CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。
ReadWriteLock 当写操作时,其他线程无法读取或写入数据,而当读操作时,其它线程无法写入数据,但却可以读取数据 。适用于读取远远大于写入的操作。
ConcurrentHashMap是一个线程安全的HashTable,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。
volatite只保证线程在“加载数据阶段”加载的数据是最新的,并不能保证线程安全。
3.关于sleep和wait,以下描述错误的是
- sleep是线程类的方法,wait是object的方法
- sleep不释放对象锁,wait放弃对象锁
- sleep暂停线程,但监控状态依然保持,结束后会自动恢复
- wait进入等待锁定池,只有针对此对象发出notify方法获得对象锁进入运行状态
创建线程对象并调用start()方法,线程处于就绪状态,当线程获得CPU的青睐时,线程进入运行状态,此时,如果出现IO阻塞、等待通知(wait())等,线程失去CPU会进入阻塞状态,当完成IO操作、线程被通知(notify()),这时线程重新获得了CPU的眷顾,再次进入运行状态。答案不言自明,D项错在调用notify()方法之后进入运行态,应该是处于就绪态。
4.下列代码的输出结果是:false
boolean b=true?false:true==true?false:true; System.out.println(b);
boolean b=true?false:true==true?false:true;
true?false:(true==true)?false:true;
true?false:((true==true)?false:true);
false
编程题1:
A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息: A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数. 现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。
//A-B = Y1 A = (Y1+Y3)/2
//B-C = Y2————> B = Y3-A
//A+B = Y3 C = Y4-B
//B+C = Y4
public static void main(String[] args){
int y1,y2,y3,y4;
int a,b,c;
Scanner in = new Scanner(System.in);
while(in.hasNextInt()){
y1 = in.nextInt();
y2 = in.nextInt();
y3 = in.nextInt();
y4 = in.nextInt();
if((y1+y3)%2!=0){
System.out.println("No");
}else{
a=(y1+y3)/2;
b=y3-a;
c=y4-b;
if(a<0||b<0||c<0){
System.out.println("No");
}else{
System.out.print(a+" "+b+" "+c);
}
}
}
}
}
编程题2:
n个数里出现次数大于等于n/2的数
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
List<Integer> list = new ArrayList<>();
while(in.hasNextInt()){
list.add(in.nextInt());
}
Collections.sort(list);
System.out.println(list.get(list.size()/2-1));
}
}