Java集合(七)
7.1Java集合概述
1.Java集合就像一种容器,可以把多个对象的引用放入容器中。
2.Java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组。
3.Java集合可分为Set、List和Map三种体系
---Set:无序、不可重复的集合
---List:有序、可重复的集合
---Map:具有映射关系的集合
4.在Java5之前,Java集合会丢失容器中所有对象的数据类型,把所有对象都当成Object类型处理;从Java5增加了泛型之后,Java集合可以记住容器中对象的数据类型。
7.2Collection接口
Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法即可用于操作Set集合,也可用于操作List和Queue集合:
7.3Iterator接口
1.使用Iterator接口遍历集合元素
1)Iterator接口主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。
2)Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口。
3)Iterator仅用于遍历集合,Iterator本身并不提供承装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。
2.使用foreach循环遍历集合元素
Java 5 提供了 foreach 循环迭代访问 Collection
7.4Set(HashSet,LinkedHashSet,TreeSet)
1.Set集合
1)Set集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set集合中,则添加操作失败。
2)Set判断两个对象是否相同不是使用==运算符,而是根据equals方法。
2.HashSet
1)HashSet 是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类。
2)HashSet 按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
3)HashSet 具有以下特点:
---不能保证元素的排列顺序
---HashSet 不是线程安全的
---集合元素可以是null
4)当向HashSet 集合中存入一个元素时,HashSet 会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet 中的存储位置。
5)如果两个元素的equals()方法返回true,但它们的hashCode()返回值不相等,HashSet 会把它们存储在不同的位置,但依然可以添加成功。
3.hashCode()方法
1)HashSet 集合判断两个元素相等的标准:两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。
2)如果两个对象通过equals()方法返回true,这两个对象的hashCode值也应该相同。
3)重写hashCode()方法的基本原则
---在程序运行时,同一个对象多次调用hashCode()方法应该返回相同的值
---当两个对象的equals()方法比较返回true时,这两个对象的hashCode()方法的返回值也应相等
---对象中用作equals()方法比较的Field,都应该用来计算hashCode值
4.LinkedHashSet
1)LinkedHashSet 是HashSet的子类。
2)LinkedHashSet 集合根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
3)LinkedHashSet 性能插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。
4)LinkedHashSet 不允许集合元素重复。
5.TreeSet
1)TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。
- Comparator comparator()
- Object first()
- Object last()
- Object lower(Object e)
- Object higher(Object e)
- SortedSet subSet(fromElement, toElement)
- SortedSet headSet(toElement)
- SortedSet tailSet(fromElement)
2)TreeSet支持两种排序排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序。
6.自然排序
1)排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列。
2)如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable 接口。
3)实现Comparable 的类必须实现compareTo(Object obj)方法,两个对象即通过compareTo(Object obj)方法的返回值来比较大小。
4)Comparable 的典型实现:
---BigDecimal、BigInteger以及所有的数值型对应的包装类:按它们对应的数值大小进行比较。
---Character:按字符的UNICODE值来进行比较。
---Boolean:true对应的包装类实例大于false对应的包装类实例
---String:按字符串中字符的UNICODE值进行比较
---Date、Time:后面的时间、日期比前面的时间、日期大
5)因为只有相同类的两个实例才会比较大小,所以向TreeSet 中添加的应该是同一个类的对象
6)当需要把一个对象放入TreeSet 中,重写该对象对应的equals()方法时,应保证该方法与compareTo(Object obj) 方法有一致的结果:如果两个对象通过equals()方法比较返回true,则通过compareTo(Object obj) 方法比较应返回0
7.定制排序
如果需要实现定制排序,则需要在创建TreeSet 集合对象时,提供一个Comparator 接口的实现类对象。由该Comparator 对象负责集合元素的排序逻辑。
7.5List
1.List
1)List代表一个元素有序、且可重复的集合,集合中的每个元素都有其对应的顺序索引
2)List允许使用重复元素,可以通过索引来访问指定位置的集合元素。
3)List默认按元素的添加顺序设置元素的索引。
4)List集合里添加了一些根据索引来操作集合元素的方法
- void add(int index, Object ele)
- boolean addAll(int index, Collection eles)
- Object get(int index)
- int indexOf(Object obj)
- int lastIndexOf(Object obj)
- Object remove(int index)
- Object set(int index, Object ele)
- List subList(int fromIndex, int toIndex)
2.ListIterator
List额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法:
- boolean hasPrevious()
- Object previous()
- void add()
3.ArrayList 和 Vector
1)ArrayList 和 Vector是List接口的两个典型实现
2)区别:
- 是一个古老的集合,通常建议使用ArrayList
- ArrayList是线程不安全的,而Vector 是线程安全的
- 即使为保证List集合线程安全,也不推荐使用Vector
3)Arrays.asList(…) 方法返回的List集合既不是ArrayList 实例,也不是Vector实例。
Arrays.asList(…)返回值是一个固定长度的List集合。
7.6Map
1.Map
1)Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的Key,另外一组用于保存Map里的Value.
2)Map中的key和value都可以是任何引用类型的数据
3)Map中的key不允许重复,即同一个Map对象的任何两个Key通过equals方法比较中返回false
4)Key 和 Value之间存在单向一对一关系,即通过指定的Key总能找到唯一的,确定的Value。
5)Map常用方法
2.HashMap & Hashtable
1)HashMap 和 Hashtable是Map接口的两个典型实现类
2)区别:
- Hashtable是一个古老的Map实现类,不建议使用
- Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的
- Hashtable不允许使用null作为key和value,而 HashMap 可以
3)与HashSet集合不能保证元素的顺序一样,Hashtable 、HashMap也不能保证其中key-value对的顺序
4)Hashtable 、HashMap判断两个Key值相等的标准是:两个Key通过equals方法返回true,hashCode值也相等。
5)Hashtable 、HashMap判断两个Value相等的标准是:两个Value通过equals方法返回true
3.LinkedHashMap
1)LinkedHashMap是HashMap的子类
2)LinkedHashMap可以维护Map的迭代顺序:迭代顺序与Key-Value对的插入顺序一致。
4.Properties
1)Properties类是Hashtable 的子类,该对象用于处理属性文件。
2)由于属性文件里的key、value都是字符串类型,所以properties里的Key和Value都是字符串类型的。
5.TreeMap
1)TreeMap存储Key-Value对时,需要根据Key对Key-Value对进行排序。TreeMap可以保证所有的Key-Value对处于有序状态。
2)TreeMap的Key的排序:
---自然排序:TreeMap的所有的Key必须实现Comparable 接口,并且所有的Key应该是同一个类的对象,否则将会抛出ClasssCastException
7.7Collections 工具类
1.操作集合的工具类:Collections
1)Collections是一个操作Set、List和Map等集合的工具类
2)Collections中提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。
3)排序操作:
---reverse(List):反转List中元素的顺序
---shuffle(List):对List集合元素进行随机排序
---sort(List):根据元素的自然顺序对指定List集合元素按升降排序
---sort(List,Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序
---swap(List,int, int):将指定list集合中的i处元素和j处元素进行交换
2.查找、替换
1)Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
2)Object max(Collection,Comparator):根据Comparator 指定的顺序,返回给定集合中的最大元素
3)Object min(Collection)
4)Object min(Collection,Comparator)
5)int frequency(Collection,Object):返回指定集合中指定元素的出现次数
6)boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值
3.同步控制
Collections 类中提供了多个synchronizedXxx()方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题
7.8Enumeration
Enumeration接口是Iterator迭代器的“古老版本”