本帖最后由 彭卫红 于 2014-8-27 23:48 编辑
6)Collection接口下的Iterator 接口 //如果要创建Iterator对象,则必须有一个被迭代的集合。 //当使用Iterator迭代访问集合元素时,只有通过Iterator的remove方法删除上一次next方法返回集合元素才可以改变集合。 7)Set集合 1. Set与Collection方法一致,只是Set不允许包含重复元素。 2. Set集合不允许包含相同的元素,如果把两个相同的元素加入一个Set集合,则添加失败。 3. Set集合中的对象是无序的,对集合中成员的访问和操作是通过对象的引用进行的,所以集中不能有重复对象。 4.加入Set的Object必须定义equals方法,确保元素唯一。 8)HashSet类 (1)HashSet是Set接口的实现。数据结构是:哈希表。 (2)HashSet:如何保证元素唯一性的呢? 通过元素的两个方法:hashCode(),equals(); 判断元素是否相同,先要判断元素的hashCode(注:hashCodea()返回值为int 型)值是否一致, 只有在该值一致的情况下,才会去判断equals()方法。 (3)复写hashCode()方法时,尽量依据元素的判断相同的条件来定义每一个元素的哈希值。 10)LinkedHashSet:该子类基于哈希表又融入了链表。可以对Set集合进行增删提高效率。 LinkedHashSet可以按元素的添加顺序来访问集合里的元素。但仍然不允许集合元素重复。 11)TreeSet:数据结构是:二叉树。 1. 如何保证元素唯一性的呢? 通过比较方法的return 0来判断元素是否相同。 2. treeSet可以对Set集合中的元素进行排序。 4. 排序的两种方式: 一,让元素自身具备比较性。也就是元素需要实现Comparable接口,覆盖compareTo方法。 二,让容器自身具备比较性,自定义比较器。 在覆盖compareTo方法,或者compare方法时,必须要明确比较的主要条件相等时,需要参阅次要条件。 12) 技巧: 如何判断这些容器的数据结构? 通过每一个容器的名称即可明确其数据结构: ArrayList: 数组 array。 LinkedList: 链表:link。 HashSet: 哈希表:hash。 TreeSet: 二叉树:tree。 HashMap: 哈希表。hash。 TreeMap: 二叉树。tree。 看到array,就要想到角标。 看到link,就要想到first,last。 看到hash,就要想到hashCode,equals. 看到tree,就要想到两个接口。Comparable,Comparator。 12)EnumSet类 EnumSet是一个专为枚举类设计的集合类,其中的所有元素都必须是指定枚举类型的枚举值。 EnumSet类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的static方法来创建EnumSet对象。 13)总结:Set 成员不 能重复 1)【HashSet】 外部无序地遍历成员。 成员可为任意Object子类 的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。 2)【TreeSet】 外部有序地遍历成员; 附加实现了SortedSet, 支持子集等要求顺序的操作 成员要求实现Comparable接口,或者使用Comparator构造TreeSet。成员一般为 同一类型。 3)【LinkedHashSet】 按外部成员的插入顺序遍历成员 ,成员与HashSet成员类似。 在更多情况下,会使用 HashSet 存储重复自由的集合。同时LinkedHashSet也是采用了Hash算法的方式进行存取对象元素的。所以添加到 LinkedHashSet 的对象对应的类也需要采用恰当方式来实现 hashCode() 方法。 4)EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。 14)List 集合:按添入顺序排序,允许重复。实现了所有可选列表操作,并允许包括 null 在内的所有元素 |--Vector: 底层是数组数据结构,线程是同步的,现的ArrayList替代,因为效率低。 | Vector:支持枚举取值,枚举和迭代器的功能是一致的。因为其功能方法名称过长,被迭代器取代。 |--ArrayList:底层是数组数据结构,线程是不同步的。查询的速度快。 |--LinkedList:底层是链表数据结构,线程是不同步的。增删的速度很快。 可以使用该集合去模拟出队列(先进先出) 或者堆栈(后进先出) 数据结构。 16) ArrayList a)ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组。 b)使用ArrayList.add()方法增加元素,如果增加的元素个数超过10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。当新数组无法容纳增加的元素时,重复该过程。 c)对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价高。 17) LinkedList 1. 底层是链表数据结构,线程是不同步的。增删的速度很快 可以使用该集合去模拟出队列(先进先出) 或者堆栈(后进先出) 数据结构。 18) Vector1. 底层是数组数据结构,线程是同步的,2. Stack 类Stack继承自Vector,实现一个后进先出的堆栈。 19)ArrayList与LinkedList的比较分析: 1)ArrayList底层采用数组实现,LinkedList底层采用双向链表实现。 2)如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度, Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%, 3)当执行插入或删除操作时,采用LinkedList比较好。 当执行搜索操作时,采用ArrayList比较好。 20)List 总结: 按存入顺序排放,元素可重复。 1.【ArrayList】: 元素单个,不同步,效率高,多用于查询,ArrayList是实现了基于动态数组的数据结构 2.【Vector】: 元素单个,同步线程安全,多用于查询,(实现动态数组) Stack(实现堆栈)不安全。不建议使用 3.【LinkedList】:元素单个,多用于插入和删除,LinkedList基于链表的数据结构。 21)ListIterator 接口继承 Iterator 接口以支持添加或更改底层集合中的元素,还支持双向访问。 21)Map<K,V>从不重复的键到值的映射。 22)Map结构 1,Map: |--Hashtable:底层是哈希表数据结构,线程是同步的,不可以存入null键,null值。效率较低,被HashMap替代。 | 要保证键的唯一性,需要覆盖hashCode方法,和equals方法。 |--HashMap:最常用 底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。 | | 要保证键的唯一性,需要覆盖hashCode方法,和equals方法。 | |_____LinkedHashMap增删用基于hash表和双向链表实现。按存入顺序排序。可以Map集合进行增删提高效率。 |--TreeMap:排序用底层是二叉树数据结构。可以对map集合中的键进行排序。 | 需要使用Comparable或者Comparator进行比较排序。return 0,来判断键的唯一性。 |--IdentityHashMap比较键(和值)时使用引用相等性代替对象相等性。当且仅当 (k1==k2) 时,才认为两个键 k1 和 k2 相等
其实set集合,底层使用的就是map集合。 注意:Map集合中有一个特殊的对象是可以和IO对象相结合的:Properties。它是Hashtable的子类。 该集合对象不存在泛型,键和值都是字符串。 什么时候使用map集合?当对象之间存在着映射关系时,就要先想到map集合。 五个最常用的集合类 1.ArrayList: 元素单个,效率高,多用于查询 2.Vector: 元素单个,线程安全,多用于查询 3.LinkedList:元素单个,多用于插入和删除 4.HashMap: 元素成对,元素可为空 5.HashTable: 元素成对,线程安全,元素不可为空 |