1. 集合类

  1. AbstractCollection 实现了Collection 类中的部分方法,具体的集合类就可以实现AbstractCollection 类了(它实现了例如contains,toString等方法),如图一所示

<center>图1. 集合框架中的类</center>

  1. Java 中的链表,LinkedList

    1. Java中的链表都是双向链表
    2. LinkedList.add只会将元素添加在表尾,如果需要在任意位置添加元素,需要使用ListIterator接口,例如:

      ListIterator<String> iter = tmpList.listIterator();
      // 遍历迭代器到指定位置,然后执行插入
      for(int i=0;i<n;i++)
          iter.next();
      iter.add("inster string");    

    3. 迭代器在操作同一个集合是可能会出现异常,即,一个迭代器删除了一个元素,另一个迭代器执行next方法希望返回这个被删除的元素,则会抛出ConcurrentModificationException 。解决方案是:第一,关联集合的所有迭代器只读,或者只有一个迭代器可以修改;第二,集合有一个操作次数,每个迭代器有一个操作次数,当迭代器本身的操作次数和集合的操作次数不相等,则抛出异常。
    4. LinkedList.get方法当索引大鱼n//2时,从列表尾端开始访问,注意这并不是随机访问,链表不支持随机访问。
  2. 数组列表

    1. ArrayList封装了一个动态再分配的对象数据。
    2. 散列表(hash table)

    其实就是使用链式法解决冲突,注意,在Java8之后,当桶满的时候,链表会变为平衡二叉树,以提高性能。 (桶数时开始指定的,搜集具有相同散列码的数目)。

    1. 另外,当装填因子大于0.75,就会再散列,即丢弃原来的散列表,将所有元素插入新表,新表的桶数是原来的两倍。
  3. TreeSet(有序集合)

    1. 底层排序使用的是红黑树,必须实现了Comparable接口或者必须提供Comparator。
  4. 队列与双端队列,底层是堆,队头总是最小的元素
  5. 映射

    1. HashMap(无序)
    2. TreeMap(有序)
  6. 弱散列映射(WeakHashMap)

    1. 假定程序中的任何部分不会再引用这个键,因此,无法从映射中删除这个键值对。WeakHashMap即就是解决这个问题的。当对键的唯一引用来自算列表本身时,(外部没有任何地方再引用这个键),WeakHashMap则会删除这个键值对。实现原理,

  7. LinkedHashSet和LinkedHashMap会记住插入顺序,而上文所提到的有序 指的是,数据结构会根据元素本身对元素经行排序。LInkedHashMap还可以根据访问顺序排列,即调用get和put时,将当前元素删除放到尾部。
  8. IdentityHashMap的散列码不是使用hashCode函数计算得到的,而是根据对象的内存地址计算得到的,因此,IdentityHashMap对象的比较使用== 而不是equals

2. 视图与包装器

  1. 小集合,Java9引入了给定元素,生成对应集合列表,map的方式,例如,

    List.of(x,y,z)
    Map.of()
  2. 视图,其实就很类似python中的切片,获得某个区间的元素,一般是左闭右开的,但是NavigableSet 可以更详细的定义左右两个端点是否包含。
  3. 不可修改视图

  4. 同步视图(Synchronized Views)

    对于普通的集合,如果一个线程准备读,一个线程准备再散列,将会引起异常,为此,Collections.synchronizedMap 即保证了线程安全,也就是它保证了一个线程操作完毕之后,其它线程才能继续操作。

  5. Checked views

    其实就是Collections.checkedList(list,String.class) 用来检测Collection 中的所有元素是否符合第二个参数的类型,用来避免泛型编程中出现类型不统一的错误,例如刚才提到的就会检测list中的元素是否都是String类型。


Francis_Hui
1 声望0 粉丝