选D。
A选项中,ConcurrentHashMap 使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全。
B中,HashMap定义规则如下:
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
A: 这个选项吧,没有给出具体环境,现在jdk1.8及以后的版本 ConcurrentHashmap是采用CAS+synchronized关键字来保证线程安全性,在jdk1.7及之前的版本是采用分段锁机制来保证线程安全性。这种选项具体纠结其实没太大意义,可能就是能区分出来看没看过源码的人吧。
B: 这个经常有人弄混,给大家看个Java Collections Framewor的UML图
从图中可以看出,Map接口也属于Java Collections Framework,因为Map这种映射的结构比较特殊,所以Map接口是单独的,而Set、Queue、List都是继承于Collection接口。这个选项是考察大家对Java集合框架的熟悉情况。
C: 看下源码就知道了
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> More ...asList(T... a) {
return new ArrayList<>(a);
}
可以看到Array的asList方法确实是返回一个ArrayList类型的值,但是当我们点进去这个ArrayList,会发现,这其实是Array的一个内部类,继承自AbstractList。而并非返回的java.util.ArrayList对象。
private static class More ...ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
More ...ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
// ......
}
还是考察,看!没!看!过!源!码!
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, SerializableC.当时这个选项很迷惑我,不是很清楚,后来了解了下,这个返回的是Arrays的内部类Arrays.ArratList,不是java.util.ArrayList类
SimpleDateFormat是线程不安全的原因:在多线程环境下,当多个线程同时使用相同的SimpleDateFormat对象(如static修饰)的话,如调用format方法时,多个线程会同时调用calender.setTime方法,导致time被别的线程修改,因此线程是不安全的。
D. SimpleDateFormat是线程不安全的。
这个说法是正确的。SimpleDateFormat 是线程不安全的类。它在多线程环境下使用可能导致并发问题,包括解析错误的日期和时间、格式化输出的不一致等。如果需要在多线程环境中处理日期和时间,可以考虑使用线程安全的替代类,如 java.time 包下的 DateTimeFormatter 类。
A. ConcurrentHashMap使用synchronized关键字保证线程安全。
这个说法是错误的。ConcurrentHashMap 并不是通过 synchronized 关键字来实现线程安全的。它使用了一种不同于传统的加锁方式来提供更好的并发性能。ConcurrentHashMap 使用分段锁(Segment)来控制并发访问,不同的段可以被不同的线程同时访问,从而提高并发性能。
B. HashMap实现了Collection接口。
这个说法是错误的。HashMap 类并没有实现 Collection 接口。它实现了 Map 接口,用于存储键值对的映射关系。Collection 接口是用于表示一组对象的接口,而在 HashMap 中,键和值是成对存在的。
C. Arrays.asList 方法返回 java.util.ArrayList 对象。
这个说法是错误的。Arrays.asList 方法返回的是一个 java.util.Arrays.ArrayList 对象,而不是常规的 java.util.ArrayList 类。java.util.Arrays.ArrayList 是一个固定大小的数组,它是在对数组进行操作时的一个便利接口。如果需要可变大小的 ArrayList 对象,应该使用 new ArrayList<>(Arrays.asList(...)) 的方式来创建。