您的位置:首页 > 编程语言 > Java开发

Java集合部分总结

2017-07-11 21:25 411 查看

集合基础

Collection:

List:总体有序,元素可以重复

ArrayList 数组(查询快,增删慢)

LinkedList 链表(查询慢,增删快)

Vector

Stack 用两个栈实现一个对列 进栈出栈进栈

出栈

Set:元素不可以重复

HashSet HashMap

LinkedHashSet 链表+哈希表

TreeSet TreeMap

Map:双列集合

HashMap 允许null值和null键,不保证映射顺序 初始容量:哈希表创建时的容量 加载因子:自动加载的尺度.

HashTable Dictionary(抽象类)子类,不允许null,同步 其他同上 ConcurrentHashMap

特点:效率比Hashtable高,并发性比HashMap好。

TreeMap 红黑树实现 键的自然排序 比较器排序 (注意要重写equals()和hashCode())

迭代器的快速失败行为应该仅用于检测程序错误。

线程安全:Vector Stack HashTable

1 集合的基本操作

修改(添加 移除) 判断(包含) 返回(get()) 遍历(迭代器 for 嵌套遍历)这些都是基本操作要回.

Map接口的两种遍历方式 keyset() 和entrySet()

集合嵌套 如HashMap嵌套ArrayList

2自然排序和比较器排序

自然排序:实现Comparable接口 重写compareTo()

public int compareTo(Student s) { //27年龄作为根节点
//主要条件:比较年龄:从小到大进行比较
//年龄相减:如果为0:说明两个人的年龄一样
//      int num = this.age - s.age ;
int num = s.age - this.age ;
//年龄相同,不一定姓名的内容相同:String : 比较两个姓名:
int num2 = num==0? this.name.compareTo(s.name) : num ;

return num2;


比较器排序:匿名内部类实现Compartor接口

3针对集合进行操作的工具类:Collections

API没有构造方法,所有里面的方法静态修饰

常用的几个方法:

public static  void sort(List<T> list)根据元素的自然顺序 对指定列表按升序进行排序
public static  T max(Collection<? extends T> coll):求最大值
public static <T> int binarySearch(List<> list, T key):参数1:表示list集合,参数2:表示要查找的集合中的元素
public static void shuffle(List<?> list):随机置换


ConcurrentHashMap

jdk 1.6版:

ConcurrenHashMap

ConcurrentHashMap是线程安全的HashTable,ConcurrentHashMap是采用分离锁的方式,它并没有对整个hash表进行锁定,而是局部锁定,

也就是说当一个线程占有这个局部锁时,不影响其他线程对hash表其他地方的访问。具体实现: ConcurrentHashMap内部有一个Segment数组,

该Segment对象可以充当锁。Segment对象内部有一个HashEntry数组,于是每个Segment可以守护若干个桶(HashEntry),

每个桶又有可能是一个HashEntry连接起来的链表,存储发生碰撞的元素。每个ConcurrentHashMap在默认并发级下会创建包含16个Segment对象的数组,

每个数组有若干个桶,当我们进行put方法时,通过hash方法对key进行计算,得到hash值,找到对应的segment,然后对该segment进行加锁,

然后调用segment的put方法进行存储操作,此时其他线程就不能访问当前的segment,但可以访问其他的segment对象,不会发生阻塞等待。

Hashtable是通过对hash表结构进行锁定,是阻塞式的,当一个线程占有这个锁时,其他线程必须阻塞等待其释放锁。


jdk 1.8版

ConcurrentHashMap不再使用Segment分离锁,而是采用一种乐观锁CAS算法来实现同

步问题,但其底层还是“数组+链表->红黑树”的实现。

fail-fast与fail-safe

1)什么是同步修改?

当一个或多个线程正在遍历一个集合Collection,此时另一个线程修改了这个集合的内容(添加,删除或者修改)。这就是并发修改

2)什么是 fail-fast 机制?

fail-fast机制在遍历一个集合时,当集合结构被修改,会抛出Concurrent Modification Exception。

fail-fast会在以下两种情况下抛出ConcurrentModificationException.

(1)单线程环境

集合被创建后,在遍历它的过程中修改了结构。

注意 remove()方法会让expectModcount和modcount 相等,所以是不会抛出这个异常。拍桌子重点

(2)多线程环境

当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改。

ListIterator 可以再迭代时对集合进行 add、set、remove 操作,而 Iterator 迭代器只能在迭代时对集合进行 remove 操作

3)fast-safe机制?

fail-safe任何对集合结构的修改都会在一个复制的集合上进行修改,因此不会抛出ConcurrentModificationException

fail-safe机制有两个问题

(1)需要复制集合,产生大量的无效对象,开销大

(2)无法保证读取的数据是目前原始数据结构中的数据

Java.util包中的所有集合类都被设计为fail->fast的,而java.util.concurrent中的集合类都为fail-safe的。

当检测到正在遍历的集合的结构被改变时,Fail-fast迭代器抛出ConcurrentModificationException,

而fail-safe迭代器从不抛出ConcurrentModificationException
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: