java集合类总结

说明:本文结合其他文章以及自己的一些实例写成

一、总体结构

下图可以很清楚的说明

 

二、常用集合类对比和说明

list、set、map 的区别就不说了,直接相同类型具体类的比较

  • ArrayList、LinkedList、Vector、CopyOnWriteArrayList

ArrayList、LinkedList:实现分别是数组和链表,所以区别就是数组和链表的区别。多搜索用ArrayList,多增删用LinkedList

Vector: 底层也是采用 数组 来存储数据,和 ArrayList 一样(准确说是 ArrayList 与 Vector 一样,毕竟是先有 Vector 后有 ArrayList)。区别是:Vector 是线程安全的,对外提供的读写方法,都是 synchronized 方法,有个别 非 synchronized 方法,其实它内部也是 synchronized 的

CopyOnWriteArrayList:提供一个 线程安全并且 高效的 List。Copy-on-Write,也就是“写时复制”,当有 写类型的操作作用到 CopyOnWriteArrayList 对象的时候,它们都会先获取锁,然后复制一份当前数据作为副本,然后在当前的数据副本上做修改,最后把修改提交,然后释放锁(所以在数据量大且写多读少的时候要谨慎使用CopyOnWriteArrayList)。Array-List,也就是底层是使用数组(顺序表)来进行数据存储,大体实现机制和 ArrayList 差不多

CopyOnWriteArrayList 比 Vector 高效,主要有以下 2 个原因

        1、Vector 中,读写操作都被加锁了,而 CopyOnWriteArrayList 中,只有写操作才被加锁,而读操作没有进行加锁。这样,当 读 线程数量远大于 写 线程数量的时候,CopyOnWriteArrayList 尤为高效。

        2、Vector 中,使用的是 内置锁(内置锁参考:Java内置锁的简单认识),而 CopyOnWriteArrayList 中,使用的是 jdk 1.5 引入的 ReentrantLock ,相比于 内置锁,ReentrantLock 的性能还是有所提升的。

  • HashSet、LinkedHashSet、TreeSet

LinkedHashSet:有序set

TreeSet:可排序set

直接看例子:

import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;

public class Test2 {

	public static void main(String[] args) throws Exception {
		Set set = new HashSet<>();
		setSet(set);
		printSet(set);
		
		set = new LinkedHashSet<>();
		setSet(set);
		printSet(set);
		
		set = new TreeSet<>(new Comparator() {
			@Override
			public int compare(String o1, String o2) {
				// TODO Auto-generated method stub
				return o2.compareTo(o1);
			}
		});
		setSet(set);
		printSet(set);
	}
	
	public static void setSet(Set set){
		set.add("b");
		set.add("d");
		set.add("c");
		set.add("a");
		set.add("e");
	}
	
	public static void printSet(Set set){
		Iterator iterator = set.iterator();
		while(iterator.hasNext()){
			System.out.print(iterator.next());
			System.out.print(" ");
		}
		System.out.println();
	}
	
}

执行结果:

d e b c a 
b d c a e 
e d c b a 
  • HashMap、LinkedHashMap、TreeMap、HashTable、ConcurrentHashMap

HashMap、LinkedHashMap、TreeMap:区别类似于 Set,不再多说

HashTable:线程安全。类似于HashMap,但是不允许NULL键和NULL值,比HashMap慢,因为它是同步的。HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占。

ConcurrentHashMap:线程安全,性能更好。允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的Hashtable,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

你可能感兴趣的:(java基础)