Java 中提供了丰富的集合接口和类,它们来自于 java.util 包。如同 15-1 所示是 Java 主要的集合接口和类,从图中可见 Java 集合类型分为:Collection 和 Map,Collection 子 接口有:Set、Queue 和 List 等接口。每一种集合接口描述了一种数据结构。 本章重点介绍 List、Set 和 Map 接口,因此图 15-1 中只列出了这三个接口的具体实现 类,事实上 Queue 也有具体实现类,由于很少使用,这里不再赘述,读者感兴趣可以自 己查询 API 文档。
提示 学习Java中的集合,首先从两大接口入手,重点掌握List、Set和Map三个接口,熟悉 这些接口中提供的方法。然后再熟悉这些接口的实现类,并了解不同实现类之间的区 别。
List 集合中的元素是有序的,可以重复出现。图 15-2 是一个班级集合数组,这个集合 中有一些学生,这些学生是有序的,顺序是他们被放到集合中的顺序,可以通过序号访问 他们。这就像老师给进入班级的人分配学号,第一个报到的是“张三”,老师给他分配的 是 0,第二个报到的是“李四”,老师给他分配的是 1,以此类推,最后一个序号应该是 “学生人数-1”。
提示 List集合关心的元素是否有序,而不关心是否重复,请大家记住这个原则。例如,图152所示的班级集合中就有两个“张三”。
List 接口的实现类有:ArrayList 和 LinkedList。ArrayList 是基于动态数组数据结构的实 现,LinkedList 是基于链表数据结构的实现。ArrayList 访问元素速优于 LinkedList,LinkedList 占用的内存空间比较大,但 LinkedList 在批量插入或删除数据时优于 ArrayList。 不同的结构对应于不同的算法,有的考虑节省占用空间,有的考虑提高运行效率,对 于程序员而言,它们就像是“熊掌”和“鱼肉”,不可兼得!提高运行速度往往是以牺牲 空间为代价的,而节省占用空间往往是以牺牲运行速度为代价的。
List 接口继承自 Collection 接口,List 接口中的很多方法都继承自 Collection 接口的。 List 接口中常用方法如下。
操作元素
get(int index):返回 List 集合中指定位置的元素。
set(int index, Object element):用指定元素替换 List 集合中指定位置的元素。
add(Object element):在 List 集合的尾部添加指定的元素。该方法是从 Collection 集合继承过了的。
add(int index, Object element):在 List 集合的指定位置插入指定元素。
remove(int index):移除 List 集合中指定位置的元素。
remove(Object element):如果 List 集合中存在指定元素,则从 List 集合中移除第 一次出现的指定元素。该方法是从 Collection 集合继承过了的。
clear():从 List 集合中移除所有元素。该方法是从 Collection 集合继承过了的。
判断元素
isEmpty():判断 List 集合中是否有元素,没有返回 true,有返回 false。该方法是 从 Collection 集合继承过了的。
查询元素
indexOf(Object o):从前往后查找 List 集合元素,返回第一次出现指定元素的索 引,如果此列表不包含该元素,则返回-1。
lastIndexOf(Object o):从后往前查找 List 集合元素,返回第一次出现指定元素的 索引,如果此列表不包含该元素,则返回-1。
其他
iterator():返回迭代器(Iterator)对象,迭代器对象用于遍历集合。该方法是从 Collection 集合继承下来的。
size():返回 List 集合中的元素数,返回值是 int 类型。该方法是从 Collection 集 合继承下来的。
subList(int fromIndex, int toIndex):返回 List 集合中指定的 fromIndex(包括 )和 toIndex(不包括)之间的元素集合,返回值 List 集合。
注意:在Java中任何集合中存放的都是对象,即引用数据类型,为什么我们在集合框架当中能够存入基本数据类型,因为在存入数据和取出数据的时候,基本数据类型存在一个自动的装箱和解装箱的过程
集合最常用的操作之一是遍历,遍历就是将集合中的每一个元素取出来,进行操作或 计算。List 集合遍历有三种方法:
使用 for 循环遍历:List 集合可以使用 for 循环进行遍历,for 循环中有循环变量, 通过循环变量可以访问 List 集合中的元素。
使用 for-each 循环遍历:for-each 循环是针对遍历各种类型集合而推出的,笔者 推荐使用这种遍历方法。
使用迭代器遍历:Java提供了多种迭代器,List集合可以使用Iterator和 ListIterator 迭代器。
( 1Interator it = list.iterator() 2.when(it.hasnext()){ Object item = it.next();} )
Set 集合是由一串无序的,不能重复的相同类型元素构成的集合。图 15-3 是一个班级 的 Set 集合。这个 Set 集合中有一些学生,这些学生是无序的,不能通过类似于 List 集合 的序号访问,而且不能有重复的同学。
提示 List集合中的元素是有序的、可重复的,而Set集合中的元素是无序的、不能重复的。 List集合强调的是有序,Set集合强调的是不重复。当不考虑顺序,且没有重复元素时, Set集合和List集合可以互相替换的。
Set 接口也继承自 Collection 接口,Set 接口中大部分都是继承自 Collection 接口,这 些方法如下
操作元素
add(Object element):在 Set 集合的尾部添加指定的元素。该方法是从 Collection 集合继承过了的。
remove(Object element):如果 Set 集合中存在指定元素,该方法是从 Collection 集合继承过了的。
clear():从 Set 集合中移除所有元素。该方法是从 Collection 集合继承过了的。
判断元素
isEmpty():判断 Set 集合中是否有元素,没有返回 true,有返回 false。该方法是 从 Collection 集合继承过了的。
contains(Object element):判断 Set 集合中是否包含指定元素,包含返回 true, 不包含返回 false。该方法是从 Collection 集合继承过了的。
其他
iterator():返回迭代器(Iterator)对象,迭代器对象用于遍历集合。该方法是从 Collection 集合继承下来的。
size():返回 Set 集合中的元素数,返回值是 int 类型。该方法是从 Collection 集 合继承下来的。
Set 集合中的元素由于没有序号,所以不能使用 for 循环进行遍历,但可以使用 foreach 循环和迭代器进行遍历。事实上这两种遍历方法也是继承自 Collection 集合,也就是 说所有的 Collection 集合类型都有这两种遍历方式。
foreach
Iterator
Map(映射)集合表示一种非常复杂的集合,允许按照某个键来访问元素。Map 集合 是由两个集合构成的,一个是键(key)集合,一个是值(value)集合。键集合是 Set 类 型,因此不能有重复的元素。而值集合是 Collection 类型,可以有重复的元素。Map 集合 中的键和值是成对出现的。 图 15-4 所示是 Map 类型的“国家代号”集合。键是国家代号集合,不能重复。值是 国家集合,可以重复。
Map 接口直接实现类主要是 HashMap,HashMap 是基散列表数据结构的实现
Map 集合中包含两个集合(键和值),所以操作起来比较麻烦,Map 接口提供很多方 法用来管理和操作集合。主要的方法如下。
操作元素
get(Object key):返回指定键所对于的值;如果 Map 集合中不包含该键值对,则 返回 null。
put(Object key, Object value):指定键值对添加到集合中。
remove(Object key):移除键值对。
clear():移除 Map 集合中所有键值对。
判断元素
isEmpty():判断 Map 集合中是否有键值对,没有返回 true,有返回 false。
containsKey(Object key):判断键集合中是否包含指定元素,包含返回 true,不包 含返回 false。
containsValue(Object value):判断值集合中是否包含指定元素,包含返回 true, 不包含返回 false
查看集合
keySet():返回 Map 中的所有键集合,返回值是 Set 类型。
values():返回 Map 中的所有值集合,返回值是 Collection 类型。
size():返回 Map 集合中键值对数。
Map 集合遍历与 List 和 Set 集合不同,Map 有两个集合,因此遍历过程可以只遍历 值的集合,也可以只遍历键的集合,也可以同时遍历。这些遍历过程都可以使用 for-each 循环和迭代器进行遍历。
public class TestMap { public static void main(String[] args) { Map map = new HashMap(); map.put(102, "张三"); map.put(105, "李四"); map.put(109, "王五"); map.put(110, "董六"); map.put(111, "李四"); // 1.使用for-each循环遍历 System.out.println("--1.使用for-each循环遍历--"); // 获得键集合 Set keys = map.keySet(); for (Object key : keys) { int ikey = (Integer) key; // 自动拆箱 String value = (String) map.get(ikey); // 自动装箱 System.out.printf("key=%d - value=%s \n", ikey, value); } // 2.使用迭代器遍历 System.out.println("--2.使用迭代器遍历--"); // 获得值集合 Collection values = map.values(); // 遍历值集合 Iterator it = values.iterator(); while (it.hasNext()) { Object item = it.next(); String s = (String) item; System.out.println("值集合元素: " + s); } } }
?
//--1.使用for-each循环遍历--
//key=102 - value=张三
//key=105 - value=李四
//key=109 - value=王五
//key=110 - value=董六
//key=111 - value=李四
//--2.使用迭代器遍历--
//值集合元素: 张三
//值集合元素: 李四
//值集合元素: 王五
//值集合元素: 董六
//值集合元素: 李四
?
原文:https://www.cnblogs.com/qianshen-bolg/p/13346367.html