第七章:集合类

7.1集合概述

类可以存储任意类型的对象,并且长度可变,统称为集合。这些类都位于java.util包中。

集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map,这两种集合的特点具体如下。

Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是list和set。其中,list的特点是元素有序、元素可重复。set的特点是元素无序并且不可重复。list接口的主要实现类有ArrayList和LinkedList,set接口的主要实现类有HashSet和TreeSet。

Map:双列集合类的根接口,用于存储具有键(Key)、值(Value)映射关系的元素,每个元素都包含一对键值,在使用Map集合时可以通过指定的Key找到对应的value,例如根据一个学生的学号就可以找到对应的学生。Map接口的主要实现类有HashMap和TreeMap。

7.2 Collection接口

Collection是所有单列集合的父接口。

Collection接口的方法

Boolean add(Object o):向集合中添加一个元素

Boolean addAll(Collection c):将指定Collection中的所有元素添加到该集合中

Void clear():删除该集合中的所有元素

Boolean remove(Object o):删除该集合中指定的元素

Boolean removeAll(Collection c):删除指定集合中的所有元素

Boolean isEmpty():判断该集合是否为空

Boolean contains(Object o):判断该集合中是否包含某个元素

Boolean containsAll(Collection c):判断该集合中是否包含指定集合中的所有元素

Iterator iterator():返回在该集合的元素上进行迭代的迭代器(Iterator)、用于遍历集合所有元素

Int size():获取该集合元素个数

7.3 List接口

7.3.1 List接口简介

List接口继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合。在List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。

List集合常用方法表

Void add(int indx,Object element):将元素element插入在List集合的index处

Boolean addAll(int index,Collection c):将集合c所包含的所有元素插入到List集合的index处

Object get(int index):返回集合索引index处的元素

Object remove(int index):删除index索引处的元素

Object set(int index,Object element):将索引index处元素替换成element对象,并将替换后的元素返回

Int indexOf(Object o):返回对象o在List集合中出现的位置索引

Int lastindexOf(Object o):返回对象o在list集合中最后一次出现的位置索引

List subList(int formIndex,int toIndex):返回从索引fromIndex(包括)到toIndex(不包括)处所有元素集合组成的子集合

7.3.2 ArrayList集合

ArrayList是List接口的一个实现类,它是程序中常见的一种集合。在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。

ArrayList集合中大部分方法都是从父类Collection和List继承过来的,其中Add()方法和get()方法用于实现元素的存取。

由于ArrayList集合的底层是使用一个数组来保存元素,再增加或删除指定位置的元素时,会导致创建新的数组,效率比较低,因此不适合做大量的增删操作。但这种数组的结构允许程序通过索引的方式来访问元素,因此使用ArrayList集合查找元素很便捷。

7.3.3 LinkedList集合

ArrayList集合在查询元素时速度很快,但在增删元素时效率较低,为了克服这种局限性,可以使用List接口的另一个实现类LinkedList。该集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来,当插入一个新元素时,只需要修改元素之间的这种引用关系即可,删除一个节点也是如此。正因为这样的存储结构,所有LinkedList集合对于元素的增删操作具有很高的效率。

LinkedList中定义的方法

Void add(int index,E element):在此列表中指定的位置插入指定的元素。

Void addFirst(Object o):将指定元素插入此列表的开头。

Void addLast(Object o):将指定元素添加到此列表的结尾。

Object getFirst():返回此列表的第一个元素。

Object getLast():返回此列表的最后一个元素。

Object removeFirst():移除并返回此列表的第一个元素。

Object removeLast():移除并返回此列表的最后一个元素。

7.3.4 Iterator接口

经常需要遍历集合中的所有元素。提供了一个接口Iterator。而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。

在调用Iterator的next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next()方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当在此调用next()方法时,迭代器的索引会指向第二个元素并将元素返回,以此类推,直到hasNext()方法返回fales,表示到达了集合的末尾,终止对元素的遍历。

当通过迭代器获取ArrayList集合中的元素时,都会将这些元素当作Object类型来看待,如果想得到特定类型的元素,则需要进行强制类型转换。

7.3.5 JDK5.0新特性—foreach循环

Foreach循环用于遍历数组或集合中的元素,其具体语法格式如下:

for(容器中元素类型 临时变量:容器变量) {
执行语句
}

从上面的格式可以看出,与for循环相比,foreach循环不需要获得容器的长度,也不需要根据索引访问容器中的元素,但它会自动遍历容器中的每个元素。

foreach循环在遍历集合时语法非常简洁,没有循环条件,也没有迭代语句,所有这些工作都交给虚拟机去执行了。foreach循环的次数都是由容器中元素的个数决定的,每次循环时,foreach中通过变量将当前循环的元素记住,从而将集合中的元素分别打印出来。

注意:

foreach循环虽然书写起来很简单,但在使用时也存在一定的局限性。当使用foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其他的元素进行修改。

在使用Iterator迭代器对中的元素进行迭代时,如果调用了集合对象的remove()方法去删除元素,会出现异常。

7.4Set接口

7.4.1Set接口简介

Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是此Collection接口更加严格了。与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

Set接口主要有两个实现类,分别是HashSet和TreeSet。其中,HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。TreeSet则是以二叉树的方法来存储元素,它可以实现对集合中的元素进行排序,接下来围绕Set集合的这两个实现类详细地进行讲解。

7.4.2 HashSet集合

HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当问HashSet集合中 添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后在调用对象的equals()方法来确保该对象没有重复元素。Set集合与List集合存取元素的方式都一样。

HashSet集合之所以能确保不出现重复的元素,是因为它再存入元素时做了很多工作。当调用HashSet集合的add()方法存入元素时,首先调用当前存入对象的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍弃。

7.4.3 TreeSet集合

TreeSet是Set接口的另一个实现类,它内部采用自平衡的排序二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,并且可以对元素进行排序。

7.5Map接口

7.5.1Map接口简介

Map接口是一种双列集合,它的每个元素都包含一个键对象Key和一个值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合中访问元素时,只要指定了Key,就能找到对应的Value。

Map集合常用方法表

Void put(Object key,Object value):将指定的值与此映射中的指定键关联(可选操作)

Object get(Object key):返回指定键所映射的值,如果此映射不包含该键的映射关系,则返回null

Boolean containsKey(Object key):如果此映射包含指定键的映射关系,则返回true

Boolean containsValue(Object value):如果此映射将一个或多个键映射到指定值,则返回True

Set keySet():返回此映射中包含的键的Set试图

Collectionvalues():返回此映射中包含的值的Collection视图

Set<Map,Entry<K,V>>entrySet():返回此映射中包含的映射关系的Set视图

Put(Object key,Object value)和get(Object key)方法分别用于向Map中存入元素和取出元素。

7.5.2 HashMap 集合

HashMap集合是Map接口的一个现实类,它用于存储键值映射关系,但必须保证不出现重复的键。

7.5.3 TreeMap集合

TreeMap集合是用来存储键值映射关系的,其中不允许出现重复的键。在TreeMap中是通过二叉树的原理来保证键的唯一性,这与TreeSet集合存储的原理一样,因此TreeMap中所有的键是按照某种顺序排列的。

在使用TreeMap集合时,也可以通过自定义比较器的方式对所有的键进行排序。

7.5.4 Properties集合

Map接口中还有一个实现类Hashtable,它和HashMap十分相似,区别在于Hashtable是线程安全的。Hashtable存储元素时速度很慢,目前基本上被HashMap类所取代,但Hashtable类有一个子类Properties在实际应用中非常重要,Properties主要用来存储字符串类型的键和值,在实际开发中,经常使用Properties集合来存取应用的配置项。

7.7Collections工具类

Collections常用方法表

StaticBoolean
addAll(Collection<?superT>c,T,elements):将所有指定元素添加到指定的Collection中

Static void reverse(List list):反转指定list集合中元素的顺序

Static void shuffle(List list):对list集合中的元素进行随机排序(模拟玩扑克中的“洗牌”)

Static void sort(List list):根据元素的自然顺序对List集合中的元素进行排序

Static void swap(List list,int i,int j):将指定List集合中i处元素和j处元素进行交换

Collections常用方法表

Static int binarySearch(List list,Object
key):使用二分法搜索指定对象在list集合中的索引,查找的List集合中的元素必须有序的

Static Object max(Collection col):根据元素的自然顺序,返回给定集合中最大的元素

Static Object min(Collection col):根据元素的自然顺序,返回给定集合中最小的元素

Static boolean replaceAll(List list,Object
oldVal,Object newVal):用一个新的newVal替换List集合中所有的旧值oldVal

7.8Arrays工具类

1.使用Arrays的sort()方法排序
要想对数组进行排序就需要自定义一个排序方法,其实也可以使用Arrays工具类中的静态方法sort()来实现这个功能。

2.使用Arrays的binarySearch(Object[]a,Object key)方法查找元素binarySearch(Object[]a,Object key)用于查找元素

3.使用Arrays的copyOfRange(int[]original,int from,int to)方法拷贝元素。在程序开发中,经常需要在不破坏原数组的情况下使用数组中的部分元素,这时可以使用Arrays工具类的copyOfRange(int[]original,int from,int to)方法将数组中指定范围的元素复制到一个新的数组中,该方法中参数original表示被复制的数组,from表示被复制元素的初始索引(包括),to表示被复制的最后索引(不包括)。

4.使用Arrays的toString(int[]arr)方法把数组转换为字符串

数组以字符串的形式输出,这时就可以使用Arrays工具类的另一个方法toString(int[]arr).需要注意的是,该方法并不是对Object类toString()方法的重写,只是用于返回指定数组的字符串形式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值