概述
集合可以看作一个容器;集合中的每个对象,可以很容易取出存放,还可以按照一定的顺序摆放
提到容器,不难想到数组,集合类和数组的不同之处是,数组的长度是固定的,集合的长度是可变
的,数组用来存放基本类型,数据集合用来存放对象的引用
关于集合类的继承关系如下图
collection接口
collection接口是层次结构中的根接口,构成collection的单位称为元素,collection接口通常不能直
接使用,但该接口提供了添加元素,删除元素,管理数据的方法,由于list接口和set接口都继承了
collection接口,因此这些方法对list集合和set集合是通用的
常用方法如下
collection接口的常用方法 | |
方法 | 功能 |
add(E e) | 将指定的对象添加到该集合中 |
remove(Object o) | 将指定的对象从该集合中移除 |
isEmpty() | 返回 boolean 值,用于判断当前集合是否为空 |
iterator() | 返回在此 Collection 的元素上进行迭代的迭代器。用于遍历集合中的对象 |
size() | 返回 int 型值,获取该集合中元素的个数 |
遍历集合中的元素,通过迭代器(Iterator)实现
例题1
package yi;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Shnagpin {
public static void main(String[] args) {
Collection<String>list=new ArrayList<>();
list.add("《Java从入门到精通》");
list.add("《零基础学Java》");
list.add("《java精彩编程200例》");
Iterator<String>it=list.iterator();//创建迭代器
while(it.hasNext()) {//判断是否有下一个元素
System.out.println(it.next());
}
}
}
List集合
List接口
list接口继承了collection因此包含collection接口中的所有方法。此外,它本身还定义了两个非常重要的方法
get():获得指定索引位置的元素
set():将集合中指定索引位置的对象修改为指定的对象
List接口的实现类
ArrayList:实现了可变的数组,允许保存所有元素,包括空元素;
可以根据索引位置进行快速的查找
缺点是向指定的索引位置插入对象或删除对象的速度较慢
LinkedList:采用链表结构保存对象;
这种结构的优点是便于向集合中插入和删除对象
但是使用查找的话会较慢
声明如下
List<E>list=new ArrayList<>();
List<E>list=new LinkedList<>();
E是合法的Java数据类型
常用方法
add:添加元素
size:获取长度
remove:删除元素
get:获得元素
例题2
更改代码
通过代码我们可以知道,数组下标越界在集合中也适用
除了用for循环的遍历集合,我们还可以使用foreach循环遍历集合,会更加简单简洁
foreach循环语法如下
还可以使用迭代器遍历集合
也和简洁,根据自己需要选择
set集合
Set集合中的对象不按特定的方式排序,不能包含重复对象
Set构造有一个约束条件,传入的collection,必须小心操作可变对象
Set接口常用的实现类有HashSet和TreeSet
HashSet:由哈希表支持(实际上是一个HashSet实例),不保证迭代顺序,不保证该顺序永恒不变,允许使用null元素。
TreeSet:实现java.util.SortedSet接口,因此TreeSet类实现Set集合时可以按照自然顺序(升序)排序,也可以按照比较器的递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序
TreeSet类增加的方法 | |
方法 | 功能 |
first() | 返回此Set集合中当前第一个(最低)元素 |
last() | 返回此Set集合中当前最后一个(最高)元素 |
comparator() | 返回对此Set集合中的元素进行排序的比较器。如果此Set集合使用自然顺序,则返回null |
headSet(E toElement) | 返回一个新的Set集合,新集合是toElement对象(不包含)之前的所以对象 |
subSet(E fromElement,E fromElement) | 返回一个新的Set集合,是fromElement对象(包含)与fromElement(不包含)之间的所有对象 |
tailSet(E fromElement) | 返回一个新的Set集合,新集合包含fromElement对象(包含)之后的所有对象 |
例题3
我们可以发现使用TreeSet类是可以实现自然排序(升序),也就是从小到大排序。不会管你添加元素的顺序。
如果我们使用HashSet类进行排序,会怎么样呢?
我们可以看到使用HashSet类就好像没有顺序,其实是HashSet类是按照哈希表排列的
Map集合
map没有继承Collection接口,提供key到value的映射,不能包含相同的key,key还决定了映射的存储位置,是由一种“散列技术”进行的
map接口
提供了key映射到值的对象,一个映射不能包含重复的key,每个key最多只能映射到一个值
map接口中除集合常用方法外的特殊方法 | |
方法 | 功能 |
put(K key,V value) | 向集合添加指定key与value的映射关系 |
containsKey(Object key) | 如果此映射包含指定key的映射关系,则返回true |
containsValue(Object value) | 如果此映射将一个或多个key映射到指定值,则返回true |
get(Object key) | 如果存在指定的key对象,则返回该对象对应的值,,则返回null |
keySet() | 返回该集合中的所有key对象形成的Set集合 |
value() | 返回该集合中所有值对象形成的collection集合 |
Map接口的实现类
HashSet:基于哈希表的Map接口的实现,允许使用null值和null键,但必须保证键的唯一性;
不保证映射顺序,不保证该顺序恒久不变
TreeSet :集合中的映射关系有一定的顺序,但在添加、输出、定位映射关系时。TreeMap比HashMap类性能要差,因为是按一定顺序排序的,所以不允许使用null值
建议使用HashMap类实现Map集合,因为它在添加和删除映射关系时效率更高
可以通过HashMap类创建Map集合,当需要顺序输出的时候,在创建一个完成相同映射关系的TreeMap类实例。
例题4
输出Map集合中的书号(键)和书名(值)
我们一般全部打印都不会这样输出。不够直观,我们可以修改一下代码,使得是我们日常使用的样子
这样的输出直观,也是日常生活中的一样