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):随机置换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算法来实现同 步问题,但其底层还是“数组+链表->红黑树”的实现。
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
