首页 > 试题广场 >

在java7中,下列哪个说法是正确的:

[单选题]
在java7中,下列哪个说法是正确的:
  • ConcurrentHashMap使用synchronized关键字保证线程安全
  • HashMap实现了Collection接口
  • Arrays.asList方法返回java.util.ArrayList对象
  • SimpleDateFormat对象是线程不安全的
Arrays.asList()
将一个数组转化为一个List对象,这个方***返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的静态内部类!用这个对象对列表进行添加删除更新操作,就会报UnsupportedOperationException异常。
发表于 2015-10-27 11:46:37 回复(53)
hashMap在单线程中使用大大提高效率,在多线程的情况下使用hashTable来确保安全。hashTable中使用synchronized关键字来实现安全机制,但是synchronized是对整张hash表进行锁定即让线程独享整张hash表,在安全同时造成了浪费。concurrentHashMap采用分段加锁的机制来确保安全
发表于 2016-03-18 11:02:54 回复(25)
ConcurrentHashMap使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全。
发表于 2015-11-12 10:25:44 回复(31)
Arrays.asList方法返回的 这个List的实现类是java.util.Arrays.ArrayList这个类(而不是java.util.ArrayList)。
编辑于 2015-10-16 16:09:14 回复(9)
D.SimpleDateFormat对象是线程不安全的
正确:
public abstract class DateFormat extends Format 
public abstract class Format extends Object implements SerializableCloneable
public class SimpleDateFormat extends DateFormat
再查其方法api,也没见到说 SimpleDateFormat有实现同步的方法。(一般要是一个类是线程同步的,第一句话应该就会说了)

C. Arrays.asList方法返回java.uti.ArrayList对象
楼上大神说过了

B. HashMap实现了Collection接口
public class HashMap<K,V> extends AbstractMap <K,V>  implements Map <K,V>, Cloneable , Serializable
A.ConcurrentHashMap使用synchronized关键字保证线程安全
不是,用的是1.5的特性Lock锁。。
内部类segment类继承 ReentrantLock类 作为锁,锁住(以 HashEntry内部类维护的键值)组成的桶,。这个锁segment默认有16个,那么 ConcurrentHashMap最多可以支持16的并发访问。
详见:https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/
编辑于 2016-03-17 19:21:23 回复(5)
HashMap实现的是Map接口,Map和Collection是同一级别的
发表于 2016-08-14 11:10:31 回复(2)

ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。

从ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。

在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中
http://blog.csdn.net/xuefeng0707/article/details/40834595
编辑于 2016-03-24 15:36:29 回复(2)
A.ConcurrentHashMap使用的是Segement(继承自 ReentrantLock )分段锁的技术来保证同步的, 使用synchronized关键字保证线程安全的是HashTable;
B。 HashMap实现的是Map接口
c。 Arrays.asList方法返回List列表, public static <T> List <T> asList (T... a)
d。 SimpleDateFormat查看Java源码可以看到,它的方法都不是Synchronized的,也没有采用其他的同步措施

固,选择D
发表于 2017-02-20 08:43:51 回复(1)
选D
A、ConcurrentHashMap在JDK1.7的时候,使用Segment这个数据结构,利用锁分段技术保证了线程安全,JDK1.8的时候,Segment这个数据结构就废了,开始使用Synchronized+CAS保证线程安全。
注意:解释一下CAS(Compare and Swap),CAS(V,E,N),一旦得到的数据和预期值一样,数据变成新值N,否则还是旧值E。
B、HashMap,没有实现Collection,其实Map和Collection是集合框架中独立的两大接口。
C、Arrays.asList返回的也是ArrayList,不过这是个Arrays中的内部类,实现了List接口,继承了AbstractList,但是内部类中并没有重写涉及结构性变化的方法,所以一旦调用结构性变换的函数,例如add,会出现运行时异常UnsupportedOperationException
D、DateFormat这个接口的实现类都是不安全的。
编辑于 2018-07-02 15:55:32 回复(6)
D正确。SimpleDateFormal类原文复制:Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.
发表于 2015-10-31 13:24:07 回复(0)
大家看源码,这是Arrays类的asList()方法:
这是该方法所返回的ArrayList<>对象:


注意那个java.util.Arrays$ArrayList,说明该方法返回的ArrayList是一个Arrays类的内部类
发表于 2015-12-25 20:04:38 回复(1)
HashTable是线程安全,b为什么不对呢?HashMap实现的接口有:Serializable, Cloneable, Map<K,V> ,没有实现Cllection接口。
编辑于 2015-10-23 10:50:45 回复(2)
1.在多线程的情况下使用hashTable来确保安全,hashTable用synchronized关键字来保证线程安全;而ConcurrentHashMap使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全
2.HashMap和HashTabel实现的是Map接口,Set和List实现的是Connection接口
3.ArrayList.asList方法返回Arrays的静态内部类对象

发表于 2022-03-15 23:30:25 回复(0)
A:ConcurrentHahsMap使用的是Seqement分段锁来保证同步,而使用synchronized关键字来保证同步的是HashTable
B:HashMap实现了Serializable, Cloneable, 和Map接口,并没有实现collection接口
C:Arrays.asList方法返回的List是实现java.util.Arrays.ArrayList这个类,而不是java.util.ArrayList这个类
D:SimpleDateFormat并没有实现线程同步,是线程不安全的

发表于 2017-12-04 18:47:05 回复(0)
HashMap:键值对类型存储数据<K,V>的集合,每一个存储的键值对在HashMap中又称为Entry,多个键值对形成多个Entry,这些Entry存储在一个数组中,这个数组就是HashMap的主干,数组中每一个元素的初始值是null。HashMap中有两个关键方法(put get)
                                                  
put方法:
例:hashMap.put("apple","0")
通过index=Hash(“apple”),找到对应的index(假设为2)。
                                                   
当插入的值越来越多时,难免会产生冲突,也就是得到的index值一样,这时就会以这个index为头节点,生成一个链表(学过数据结构课程的同学应该会有印象)。
                                                
                                                                  当得到的index都为2的时候
                                                   
有同学看到这就会产生疑问?为什么不是Entry6在Entry1的尾部呢?为什么是头插法呢?讲到get方法的时候再来讨论这个问题。
get方法:
hashMap.get("apple")
首先会进行一次hash:index=Hash(“apple”);
我们找的是key为apple的Entry,前面说了因为结点太多,会产生链表的结构,所以查找的时候难免也会找到index相同的Entry,这时就要顺着这个链表一个一个找:
                                                 

之所以采用头插法吗,是因为HashMap的开发者认为后插入的元素更容易被访问

注意:
在Entry数组中找到index插入并不是我们常规的 数据长度%数组长度 取模的方法,而是采用位运算,之所以采用位运算是为了保证每一个index的公平性,也就是有相同的几率命中。

关于位运算,详见即将更新的博客

发表于 2019-01-03 16:04:40 回复(1)
发表于 2018-04-06 20:09:58 回复(0)
发表于 2017-02-19 18:03:07 回复(1)
Arrays.asList() 产生的List是一个固定长度的数组,只支持不改变长度的操作,任何试图改变其底层数据结构长度的操作(如,增加,删除等操作)都会抛出UnsupportedOperationException异常。
public abstract class AbstractList{
public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
}

为了使Arrays.asList()方法产生的List集合长度可变,可以将其作为集合容器的构造方法参数,如:

Set set = new HashSet(Arrays.asList(1,2,3));

或者将其作为Collections.addAll()方法的参数,如:

Collections.addAll(Arrays.asList(1,2,3));

发表于 2016-06-10 17:12:10 回复(2)
1.7中使用的CAS+ReentrantLock
1.8中使用的CAS+Synchronized
发表于 2022-08-10 16:03:35 回复(0)
concurrenthashmap使用了分段锁机制
发表于 2022-03-19 00:48:36 回复(0)