java学习记录(三)集合

来源:互联网 发布:图案设计软件 编辑:程序博客网 时间:2024/05/29 08:45
1.集合框架

Collection
--List
  --ArrayList 查询快,增删慢
  --LinkedList 增删慢,查询快 
  --Vector 查询快, 增删慢, 由于是线程安全,所以比 ArrayList 性能差
--Set 元素不可重复,无索引
  --HashSet
  --TreeSet

Map(不是继承自 Collection)
--HashMap
--TreeMap

Hashtable
--Properties 一般用于配置文件,key 和 value 均为 String 类型 

2.迭代器 Iterator 
  1) Iterator 迭代器对象是内部类
  2) List 中,在 Iterator 操作的时候,不能用集合的方法(例如add())方法再操作元素,否则会抛出并发操作异常
     这时如果要修改添加元素,需要 ListIterator .
  3) Vector 有一个elements()方法,返回一个 Enumeration<E>对象,可以操作Vector元素  
 
3)泛型
  1> 静态方法不可以访问类上定义的泛型,static要放在泛型前边
  2> 泛型限定 ? 通配符
     ? extends E  接收E或者E的子类 
     ? super E    接收E或者E的父类

4.List
 1)  ArrayList 和 LinkedList 是线程不安全的,实现的时候没有锁
 2)  Vector 是线程安全的,synchronized 同步函数实现
 3)  Vector 和 ArrayList 是数组结构,数组默认初始大小是10;LinkedList是双向链表结构
 4)  List 集合的contains()方法调用的是元素对象的equals()方法。
      如果有特殊要求,可以覆写equals()方法。
      比如要按对象属性的值判断是否存在,则必须要覆写equals()方法,因为初始的equals方法比较的是地址值


5) 扩容:
   1> ArrayList: 
           默认 int newCapacity = oldCapacity + (oldCapacity >> 1) 增加%50,
           或者增加显示指定的大小 ensureCapacity(int minCapacity), 取两者较大的值
    2> Vector:
          默认 int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
         或者增加显示指定的大小ensureCapacity(int minCapacity), 取两者较大的值
         其中 capacityIncrement 为容量增量,在构造时可以显示指定,默认为0
         也就是说,通常情况下,Vector是增加原始容量的1倍,而ArrayList是增加50%。
   3> LinkedList:
      因为是链表结构,需要的时候增加节点即可

 4. Set
 
 1) HashSet 和 TreeSet 都不是线程同步的
      HashSet 无序, TreeSet 有序
      HashSet 允许 null, TreeSet 不允许 null

 2)HashSet 是基于 HashMap 实现的,底层是哈希表,默认初始容量是16,加载因子0.75. 
   
   1> HashSet 和 HashMap 容量都是2的N次方。即使显示指定的容量大小不是2的N次方,
        也会设定为2的N次方。
        int capacity = 1;
    while (capacity < initialCapacity)
                      capacity <<= 1;
        因为取模运算在包括Java在内的大多数语言中的效率都十分低下,而当除数为2的N次方时,取模运算将退化为最简单的位运算,其效率明显提升

   2> HashMap 当元素数量大于现有容量和加载因子的成绩,就进行扩容,容量增加一倍
         threshold = (int)Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);
          if ((size >= threshold) && (null != table[bucketIndex])) {
                        resize(2 * table.length);
   
        由于容量是变的,所以不保证元素的顺序是不变的。
   
   3> HashSet 存储对象的时候,先比较hashcode()值,如果相同,再比较equals(), 所以 HashSet 在存储自定义对象的时候通常需要重写hashcode()和equals()


 3)TreeSet 是有序的,所以在存储自定义对象的时候需要让对象具有比较性
   
   1> 在定义类的时候实现Comparable接口,覆盖compareTo()方法
   2> 可以让TreeSet本身具备比较性, 实现Comparator接口,覆盖Compare方法,然后在定义 TreeSet 的时候传递给 TreeSet,优先级高于实现Comparable接口 
   3> TreeSet 是基于TreeMap实现的,底层是红黑树。

5. Map
  
 1)  Hashtable 是线程同步的,不支持 null 值和键,效率低, Hashtable 默认初始容量传递的是11 
       HashMap 是非线程同步的,支持 null 键和值,效率高,取消了contains()方法,
       除此之外 HashMap 和 Hashtable 基本相同
      TreeMap 非线程同步,底层是红黑树,不支持 null 键,支持 null 值
 
 2)  HashMap 扩容方式和 HashSet 相同
      Hashtable 扩容时候也是增加一倍  int newCapacity = (oldCapacity << 1) + 1; 

 3) 在自定义对象的时候,通常覆写hashcode()和equals()方法,以及实现Comparable接口比较好

6. Collections  工具类

   1) sort(..)可以对 List 进行排序
   2) binarySearch(...) 二分查找

7. Arrays 工具类
0 0
原创粉丝点击