Java集合部分总结

集合基础

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值