您的位置:首页 > 编程语言 > Java开发

搜狗2015java工程师笔试题总结

2017-07-30 09:11 288 查看

1.下列关于Java并发的说法中正确的是()

A.CopyOnWriteArrayList适用于写多读少的并发场景
B.ReadWriteLock适用于读多写少的并发场景
C.ConcurrentHashMap的写操作不需要加锁,读操作需要加锁
D.只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了


正确答案为B。

A,CopyOnWriteArrayList适用于写少读多的并发场景

B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥, 读与读之间可以并发执行。在读多写少的情况下可以提高效率

C,ConcurrentHashMap是同步的HashMap,读写都加锁

D,volatile只保证多线程操作的可见性,不保证原子性

2.下面哪段代码实现了GBK编码字节流到UTF-8编码字节流的转换

byte[] src,dst;

A.dst=String.fromBytes(src,"GBK").getBytes("UTF-8")
B.dst=new String(src,"GBK").getBytes("UTF-8")
C.dst=new String("GBK",src).getBytes()
D.dst=String.encode(String.decode(src,"GBK")),"UTF-8" )


正确答案为B。

操作步骤就是先编码再解码。先通过new String(src, “gbk”)解码得到字符串,然后再通过getBytes(“utf-8”)来得到UTF-8编码字节数组

A/D错误原因:String类并没有fromBytes/encode/decode方法

C错误原因:getBytes()没有指定编码格式

3.如下代码,执行test()函数后,屏幕打印结果为()

public class Test2
{
public void add(Byte b)
{
b = b++;
}
public void test()
{
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + "");
}
}


执行结果为:-128 127

b=b++并不会改变b的值

而a在进行add之前便进行了自增++a,byte类型的数据范围是: -128, 127之间,因此a=127进行了越界,其值变成了-128

4.以下哪些类是线程安全的()

Vector
HashMap
ArrayList
StringBuffer
Properties


正确结果为:Vector/StringBuffer/Properties

所谓线程安全就是线程同步,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问。

线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

Vector类的许多操作都是加了synchronized修饰的,用于保证线程的安全,比如他的写入元素的操作方法

public synchronized void addElement(E obj) {  modCount++;
ensureCapacityHelper(elementCount + 1);  elementData[elementCount++] = obj;
}


而HashMap的许多操作都是没有添加synchronized修饰的,比如他的写入put方法:

public V put(K key, V value) {
if (key == null)
return
putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for(Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash &&((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return
oldValue;    }
}
modCount++;
addEntry(hash, key, value, i);
return null;
}


ArrayList也是线程不安全的

public boolean add(E e) {
ensureCapacity(size + 1);  // Increments modCount!!
elementData[size++] = e;
return true;
}


StringBuffer类是线程安全的

public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}


Properties类也是线程安全的

public synchronized
Object setProperty(String key, String value) {
return
put(key, value);
}


5.Collection接口的原型链/h4>




在java.util包中提供了一些集合类,常用的有List、Set和Map类,其中List类和Set类继承了Collection接口。这些集合类又称为容器,长度是可变的,数组用来存放基本数据类型的数据,集合用来存放类对象的引用。
List接口、Set接口、Map接口以及Collection接口的主要特征如下:
Collection接口是List接口和Set接口的父接口,通常情况下不被直接使用。
List接口继承了Collection接口,List接口允许存放重复的对象,排序方式为按照对象的插入顺序。
Set接口继承了Collection接口,Set接口不允许存放重复的对象,排序方式为按照自身内部的排序规则。
Map接口以键值对(key—value)的形式存放对象,其中键(key)对象不可以重复,值(value)对象可以重复,排序方式为按照自身内部的规则。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: