java vector实例_java中vector与hashtable操作实例分享

java中vector与hashtable操作实例,有需要的朋友可以参考一下

众所周知,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 list  = new Hashtable();

List vec = new Vector();

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 USERLIST  = new Hashtable();

public static List USERVEC = new Vector();

}

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;

}

}

写的不好,大家原谅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值