Java 集合类 List Set Map 线程安全

Posted 朝北教室的风筝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 集合类 List Set Map 线程安全相关的知识,希望对你有一定的参考价值。

Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。
(1)List的实现类主要有ArrayList,LinkedList,Vector
(2)Set的实现类主要有HashSet和TreeSet
(3)Map的实现类主要有HashMap和TreeMap,HashTable;
解释:
(1)List,Set都是继承自Collection接口,Map则不是

(2)List中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,如通过list.get(i)方式来获得List集合中的元素。

   (3)Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对象按特定方式排序,例如TreeSet类,它可以按照默认排序,也可以通过实现java.util.Comparator<Type>接口来自定义排序方式。
  
  (4) Map中的每一个元素包含一个键对象和值对象,它们成对出现。键对象不能重复,值对象可以重复。

 

线程安全类

在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类:

vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

statck:堆栈类,先进后出

hashtable:就比hashmap多了个线程安全

enumeration:枚举,相当于迭代器

除了这些之外,其他的都是非线程安全的类和接口。

线程安全的类其方法是同步的,每次只能一个访问。是重量级对象,效率较低。

其他:

1. hashtable跟hashmap的区别

hashtable是线程安全的,即hashtable的方法都提供了同步机制;hashmap不是线程安全的,即不提供同步机制 ;hashtable不允许插入空值,hashmap允许!

2. 多线程并发修改一 个 集合 怎么办

用老的Vector/Hashtable类

 

StringBuffer是线程安全,而StringBuilder是线程不安全的。对于安全与不安全没有深入的理解情况下,易造成这样的错觉,如果对于StringBuffer的操作均是线程安全的,然而,Java给你的保证的线程安全,是说它的方法是执行是排它的,而不是对这个对象本身的多次调用情况下,还是安全的。看看下边的例子,在StringBufferTest中有一个数据成员contents它是用来扩展的,它的每一次append是线程安全的,但众多次append的组合并不是线程安全的,这个输出结果不是太可控的,但如果对于log和getContest方法加关键字synchronized,那么结果就会变得非常条理,如果换成StringBuider甚至是append到一半,它也会让位于其它在此基础上操作的线程:

最后,写一个Set 的例子:

		
		Set set =new HashSet();
		String s1=new String("hello");
		String s2=s1;
		String s3=new String("world");
		
		set.add(s1);
		set.add(s2);
		set.add(s3); 
		System.out.println(set.size());

  结果是:

2

  set中不允许有重复的元素存在,因此是2,

     map的 key 集合和 set集合都不允许有重复的元素存在,list可以有重复的元素存在

 

以上是关于Java 集合类 List Set Map 线程安全的主要内容,如果未能解决你的问题,请参考以下文章

【集合】List、Map、Set部分实现类是不是线程安全

Java集合框架要点概括(Core Knowledge of Java Collection)

list、set、map 之间的区别是啥?

转:java多线程--同步容器

java 中如何声明线程安全的集合 set, map 和list

Java集合类 List Set Map