本章内容Java集合概述Collection接口Iterator接口SetListMapCollections工具类Enumeration本章内容Java集合概述Collection接口Iterator接口SetListMapCollections工具类EnumerationJava集合概述•Java集合就像一种容器,可以把多个对象的引用放入容器中。•Java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组•Java集合可分为Set、List和Map三种体系–Set:无序、不可重复的集合–List:有序,可重复的集合–Map:具有映射关系的集合•在Java5之前,Java集合会丢失容器中所有对象的数据类型,把所有对象都当成Object类型处理;从Java5增加了泛型以后,Java集合可以记住容器中对象的数据类型Java集合概述Collection接口•Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集合:hasNext()next()hasNext()使用Iterator接口遍历集合元素•Iterator接口主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器•Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口•Iterator仅用于遍历集合,Iterator本身并不提供承装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。使用foreach循环遍历集合元素•Java5提供了foreach循环迭代访问Collection本章内容Java集合概述Collection接口Iterator接口SetHashSetLinkedHashSetTreeSetListMapCollections工具类EnumerationSet集合•Set集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set集合中,则添加操作失败。•Set判断两个对象是否相同不是使用==运算符,而是根据equals方法HashSet•HashSet是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类。•HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。•HashSet具有以下特点:–不能保证元素的排列顺序–HashSet不是线程安全的–集合元素可以使null•当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的存储位置。•如果两个元素的equals()方法返回true,但它们的hashCode()返回值不相等,hashSet将会把它们存储在不同的位置,但依然可以添加成功。hashCode()方法•HashSet集合判断两个元素相等的标准:两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。•如果两个对象通过equals()方法返回true,这两个对象的hashCode值也应该相同。•重写hashCode()方法的基本原则–在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值–当两个对象的equals()方法比较返回true时,这两个对象的hashCode()方法的返回值也应相等–对象中用作equals()方法比较的Field,都应该用来计算hashCode值LinkedHashSet•LinkedHashSet是HashSet的子类•LinkedHashSet集合根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。•LinkedHashSet性能插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。•LinkedHashSet不允许集合元素重复。本章内容Java集合概述Collection接口Iterator接口SetHashSetLinkedHashSetTreeSetListMapCollections工具类EnumerationTreeSet•TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。–Comparatorcomparator()–Objectfirst()–Objectlast()–Objectlower(Objecte)–Objecthigher(Objecte)–SortedSetsubSet(fromElement,toElement)–SortedSetheadSet(toElement)–SortedSettailSet(fromElement)•TreeSet支持两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序。自然排序•排序:TreeSet会调用集合元素的compareTo(Objectobj)方法来比较元素之间的大小关系,然后将集合元素按升序排列•如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口。•实现Comparable的类必须实现compareTo(Objectobj)方法,两个对象即通过compareTo(Objectobj)方法的返回值来比较大小。•Comparable的典型实现:–BigDecimal、BigInteger以及所有的数值型对应的包装类:按它们对应的数值大小进行比较–Character:按字符的UNICODE值来进行比较–Boolean:true对应的包装类实例大于false对应的包装类实例–String:按字符串中字符的UNICODE值进行比较–Date、Time:后边的时间、日期比前面的时间、日期大自然排序•因为只有相同类的两个实例才会比较大小,所以向TreeSet中添加的应该是同一个类的对象•当需要把一个对象放入TreeSet中,重写该对象对应的equals()方法时,应保证该方法与compareTo(Objectobj)方法有一致的结果:如果两个对象通过equals()方法比较返回true,则通过compareTo(Objectobj)方法比较应返回0定制排序•如果需要实现定制排序,则需要在创建TreeSet集合对象时,提供一个Comparator接口的实现类对象。由该Comparator对象负责集合元素的排序逻辑本章内容Java集合概述Collection接口Iterator接口SetListArrayListVectorMapCollections工具类EnumerationList•List代表一个元素有序、且可重复的集合,集合中的每个元素都有其对应的顺序索引•List允许使用重复元素,可以通过索引来访问指定位置的集合元素。•List默认按元素的添加顺序设置元素的索引。•List集合里添加了一些根据索引来操作集合元素的方法–voidadd(intindex,Objectele)–booleanaddAll(intindex,Collectioneles)–Objectget(intindex)–intindexOf(Objectobj)–intlastIndexOf(Objectobj)–Objectremove(intindex)–Objectset(intindex,Objectele)–ListsubList(intfromIndex,inttoIndex)OX1122OX22330X98760X98760X984501234Person1Person2Person3Person4Person5ListIterator•List额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法:–booleanhasPrevious()–Objectprevious()–voidadd()ArrayList和Vector•ArrayList和Vector是List接口的两个典型实现•区别:–是一个古老的集合,通常建议使用ArrayList–ArrayList是线程不安全的,而Vector是线程安全的。–即使为保证List集合线程安全,也不推荐使用Vector•Arrays.asList(…)方法返回的List集合即不是ArrayList实例,也不是Vector实例。Arrays.asList(…)返回值是一个固定长度的List集合。本章内容Java集合概述Collection接口Iterator接口SetListMapHashMapHashtableLinkedHashMapTreeMapPropertiesCollections工具类EnumerationMap•Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的Key,另外一组用于保存Map里的Value•Map中的key和value都可以是任何引用类型的数据•Map中的Key不允许重复,即同一个Map对象的任何两个Key通过equals方法比较中返回false•Key和Value之间存在单向一对一关系,即通过指定的Key总能找到唯一的,确定的Value。AABBCCDDperson1person2person4person3AABBCCDDperson1person2person3Map常用方法HashMap&Hashtable•HashMap和Hashtable是Map接口的两个典型实现类•区别:–Hashtable是一个古老的Map实现类,不建议使用–Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的。–Hashtable不允许使用null作为key和value,而HashMap可以•与HashSet集合不能保证元素的顺序的顺序一样,Hashtable、HashMap也不能保证其中key-value对的顺序•Hashtable、HashMap判断两个Key相等的标准是:两个Key通过equals方法返回true,hashCode值也相等。•Hashtable、HashMap判断两个Value相等的标准是:两个Value通过equals方法返回trueLinkedHashMap•LinkedHashMap是HashMap的子类•LinkedHashMap可以维护Map的迭代顺序:迭代顺序与Key-Value对的插入顺序一致Properties•Properties类是Hashtable的子类,该对象用于处理属性文件•由于属性文件里的key、value都是字符串类型,所以properties里的Key和Value都是字符串类型的TreeMap•TreeMap存储Key-Value对时,需要根据Key对key-value对进行排序。TreeMap可以保证所有的Key-Value对处于有序状态。•TreeMap的Key的排序:–自然排序:TreeMap的所有的Key必须实现Comparable接口,而且所有的Key应该是同一个类的对象,否则将会抛出ClasssCastException–定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。此时不需要Map的Key实现Comparable接口本章内容Java集合概述Collection接口Iterator接口SetListCollections工具类Enumeration操作集合的工具类:Collections•Collections是一个操作