本人第一次发文,有意见请大家绕道!
众所周知,java中vector与hashtable是线程安全的,主要是java对两者的操作都加上了synchronized,也就是上锁了。因此在vector与hashtable的操作是不会出现问题。但是有一种情况:就是将一个hashtable copy到另一个hashtable时,假如使用putAll方法的花,会抛出一个java.util.ConcurrentModificationException异常。先上代码:
TestSync.java
public class TestSync
{
/**
* main(这里用一句话描述这个方法的作用)
* (这里描述这个方法适用条件 – 可选)
* @param args
* @return void
* @exception
* @since 1.0.0
*/
public static void main(String[] args)
{
Map<Integer,User> list = new Hashtable<Integer, User>();
List<User> vec = new Vector<User>();
TestThread thread = new TestThread();
thread.start();
int i = 0;
while(i<1000)
{
i++;
System.out.println("iiiiiiiiii=------------" + i);
list.clear();
vec.clear();
//vector与hashtable是线程安全的 ,putAll方法中两个集合实现不一样
vec.addAll(Constans.USERVEC);
// synchronized (Constans.USERLIST)
// {
list.putAll(Constans.USERLIST);
// }
System.out.println("--------" + list.size());
System.out.println("--------" + vec.size());
}
System.out.println("Over---------------------------------------------");
}
}
class Constans
{
public static Map<Integer,User> USERLIST = new Hashtable<Integer, User>();
public static List<User> USERVEC = new Vector<User>();
}
class TestThread extends Thread
{
@Override
public void run()
{
for(int i=0;i<100000;i++)
{
User user = new User();
user.setId(i);
user.setName("name" + i);
if(!Constans.USERLIST.containsKey(i))
{
Constans.USERLIST.put(i,user);
Constans.USERVEC.add(user);
}
}
System.out.println("线程结束------------");
}
}
当我们将
//synchronized (Constans.USERLIST)
// {
list.putAll(Constans.USERLIST);
// }
不使用同步时,就回抛出异常。是由于Constans.USERLIST不同步,而不是putAll方法不安全。
而Vector与Hashtable不同的是Vector的addAll方法不使用同步也可以正常运行,那是由于Vector的addAll与Hashtable的putAll方法不同,Vector的addAll会将参数先copy一份,因此不会参数异常。
User.java
public class User
{
private int id;
private String name;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
写的不好,大家原谅。
分享到:
相关推荐
在Java编程语言中,`Vector`和`Hashtable`都是古老且线程安全的集合类,它们在多线程环境中提供了一种同步访问机制。这两个类分别继承自`AbstractList`和`Dictionary`,并实现了`List`和`Map`接口。由于它们内部的...
在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...
- `Hashtable` 是Java早期版本中提供的容器,它继承自Dictionary类,历史较为悠久。而`HashMap` 是在Java 1.2中引入的,它是Map接口的一个实现,设计更为现代且高效。 2. **同步性**: - 同样,Hashtable也是...
Vector与ArrayList类似,但它提供了一种线程安全的实现,这意味着在多线程环境中,多个线程可以同时访问和修改Vector,而不会导致数据不一致。然而,由于其同步机制,Vector的性能通常低于ArrayList。 3. Map接口与...
Java容器类List、ArrayList、Vector及map、HashTable应用 List、ArrayList、Vector及map、HashTable是Java中常用的容器类,它们都继承自Collection接口,并提供了不同的实现方式和特点。在实际开发中,选择合适的...
在Java编程语言中,ArrayList、Hashtable和Vector是三种常见的数据结构,它们都用于存储和管理对象,但各有特点和适用场景。以下是对这三个容器的详细解释: ArrayList是Java集合框架中的一部分,它实现了List接口...
【JSON解析为Hashtable在J2ME环境中的应用】 在Java ME(J2ME)环境中,由于资源限制,我们不能直接使用Java SE中的HashMap或ArrayList。在这种情况下,使用Hashtable和Vector作为数据容器是理想的选择,因为它们是...
List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List和ArrayList的区别。List是一个接口,而ArrayList是一个实现了...
Java中的`Hashtable`是`Dictionary`类的一个实现,它提供了一个基于哈希表的数据结构,允许我们通过键(key)来快速查找和操作值(value)。`Hashtable`类是线程安全的,因此可以在多线程环境中使用而无需额外的同步...
集合框架是Java中处理一组对象的标准库,包括接口(如`Collection`、`List`、`Set`等)、接口的实现(如`ArrayList`、`LinkedList`、`HashSet`等)和算法(如排序、搜索等操作)。`Collection`是最基础的接口,所有...
本文将详细解释标题和描述中提到的Java代码片段,主要涉及List、Set、Map等核心数据结构,以及ArrayList、Vector、LinkedList、HashMap和HashTable的区别,并介绍如何遍历Collection和从字符串中提取数字的方法。...
### 区别与联系:List、Map、Set、Vector #### List List 是 Java 集合框架中的一个接口,它允许元素重复,并且每个元素都有一个特定的顺序位置。这意味着可以通过索引来访问 List 中的元素。List 提供了多种实现...
- **并发处理**:某些容器(如Vector和Hashtable)提供了内置的线程安全性,但在高性能、高并发的环境下,推荐使用Java并发包中的`ConcurrentHashMap`等并发容器。 - **工厂方法**:Java SDK提供了`Collections`工具...
本篇文章将深入探讨Java中的几个主要对象集合:Hashtable、Vector、LinkedList以及数组和集合的基本概念。 首先,让我们来看Java中的`Hashtable`。Hashtable是Java早期版本中的一个同步容器类,它继承自Dictionary...
### Hashtable与HashMap的区别详解 #### 一、基本概念与历史背景 在Java编程语言中,`Hashtable` 和 `HashMap` 都是用来存储键值对的数据结构。这两种数据结构虽然相似,但是在实现细节上存在显著差异。 1. **...
在Java中,`List`接口是`java.util`包的一部分,它定义了用于存储和操作有序元素集合的方法。`List`的一个主要特点是它可以包含重复元素,并且元素按插入顺序排序。Java标准库提供了几种实现`List`接口的类,如`...
本文将深入探讨Java中常用的两种数据结构类——Vector和Hashtable。 首先,我们来看Vector类。Vector是Java集合框架的一部分,它类似于数组,但提供了动态扩容和更丰富的操作功能。与普通数组相比,Vector的主要...
Java 集合类是 Java 语言中的一种重要组件,用于存储和操作数据。下面总结了 Java 集合类的一些常见问题和答案。 HashMap 和 Hashtable 的区别 HashMap 和 Hashtable 都是 Java 中的散列表实现,但它们有所不同。...