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

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)对象可以重复,排序方式为按照自身内部的规则。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值