五)集合类
集合类用于存储一些不确定的内容,即可随意更改内容;集合类都位于导包java.util中。
根据内容的存储方式,集合可分为单列集合Collection,和双列集合Map;
1、Collection是单列集合类的根接口,用于存储一些符合规则的元素,两个主要的子接口:
list,有序,内容可重复;主要实现类有LinkedlList和ArrayList;
set,无序,内容不可重复;主要实现类有HashSet和TreeSet;
2、Map是双列集合类的根接口,用于存储具有键值映射关系的元素;主要实现类有HashMap和TreeMap
Collection是所有单列集合的父接口,下面是list和set实现类通用的一些子接口:
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() | 获取该集合元素个数 |
list接口:
list集合的一些特有方法:
void add(int index,Object element) | 将元素element 插入在List集合的index处 |
boolean addAll(int index,Collection c) | 将集合c所包含的所有元素插入到List集合的index处 |
Object get(int index) | 返回集合索引ndex处的元素 |
Object remove(int index) | 删除index索引处的元素 |
Object set(intindex,Object element) | 将索引index处元素替换成element对象,并将替换后的元素返回 |
int indexOf(Object o) | 返回对象o在List集合中出现的位置索引 |
int lastindexOf(Object o) | 返回对象o在List集合中最后一次出现的位置素引 |
List subList(int fromlindex,int tolndex) | 返回从素引fromindex(包括)到tolndex(不包括)处所有元素集合组成的子集合 |
习惯将实现了List接口的对象称为List集合,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
ArrayList接口:
ArrayList内部封装一个长度可变的数组对象,如何创建ArrayList集合:
ArrayList list = new ArrayList();
ArrayList 集合的底层是使用一个数组来保存元素的,在增加或删除指定位置的元素时,会导致创建新的数组,效率比较低,因此不适合做大量的增删操作。但这种数组的结构允许程序通过索引的方式来访问元素,因此使用ArrayList集合查找元素很便捷。
LinkedList接口:
LinkedList集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时,只需要修改元素之间的这种引用关系即可,删除一个节点也是如此。LinkedList集合对于元素的增删操作具有很高的效率。
void add(int index,E element) | 在此列表中指定的位置插入指定的元素 |
void addFirst(Obiecto) | 将指定元素插入此列表的开头 |
void addLast(Object o) | 将指定元素添加到此列表的结尾 |
Object getFirst() | 返回此列表的第一个元素 |
Object getLast() | 返回此列表的最后一个元素 |
Object removeFirst() | 移除并返回此列表的第一个元素 |
Object removeLast() | 移除并返回此列表的最后一个元素 |
Iterator
Iterator是Java集合中的一员,但是它和Collection、Map接口的存储元素功能不一样,Iterator用于迭代访问Collecion中的元素。Iterator对象称为迭代器。
当通过迭代器获取ArrayList集合中的元素时,都会将这些元素当作Object类型来看待,如果想得到特定类型的元素,则需要进行强制类型转换。
Iterator it = list.Iterator();
while(it.hasNext()){
Object obj = it.next();
//删除list元素
it.remove();
}
Foreach循环
是一种更简洁的for循环,也称增强for循环。用于遍历数组和集合中的元素。
foreach(容器中的元素类型 临时变量 :容器变量){}
set接口
与List接口不同的是,Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
Set接口主要有两个实现类,分别是HashSet和TreeSet。
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。
(当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来计算对象的哈希值,从而确定元素的存储位置,如果此时哈希值相同,再调用对象的equals()方法来确保该位置没有重复元素。)
TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。
Map接口
Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。
void put(Object key,Object value) | 将指定的值与此映射中的指定键关联(可选操作) |
Object get(Object key) | 返回指定键所映射的值:如果此映射不包含该键的映射关系,则返回null |
boolean containsKey(Object key) | 如果此映射包含指定键的映射关系,则返回true |
boolean containsValue(Object value) | 如果比映射将不或多个键映射到指定值,则返回true |
Set keySet() | 返回此映射中包含的键的Set视图 |
Collection<V> values() | 返回此映射中包含的值的Collection视图 |
Set <Map.Entry<K,V>>entrySet() | 返回此映射中包含的映射关系的Set 视图 |
// 创建一个HashMap
HashMap<String, Integer> numbers = new HashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("HashMap: " + numbers);
// 访问 HashMap 中的每一个映射项
System.out.print("Entries: ");
// entrySet()返回了 HashMap 中所有映射项的一个 set 集合视图
// for-each loop 在该视图中访问了每一映射项
for(Entry<String, Integer> entry: numbers.entrySet()) {
System.out.print(entry);
System.out.print(", ");
}
输出:
HashMap: {One=1, Two=2, Three=3}
Entries: One=1, Two=2, Three=3,
Map接口中有一个实现类Hashtable,它和HashMap十分相似,区别在于Hashtable是线程安全的。Hashtable存取元素时速度很慢。
Hashtable的一个子类Properties主要用来存储字符串类型的键和值,在实际开发中,经常使用Properties集合来存取应用的配置项。
Properties类中,针对字符串的存取提供了两个专用的方法:setProperty()和getProperty()。setProperty()方法用于将配置项的键和值添加到Properties集合当中。通过调用Properties的propertyNames()方法得到一个包含所有键的Enumeration对象,然后在遍历所有的键时,通过调用getProperty()方法获得键所对应的值。
泛型
集合可以存储任何类型的对象, 但目标对象一旦存入集合,那么这个对象的编译类型就变成了Object类型。
泛型可以限定方法操作的数据类型,在定义集合类时,使用“<参数化类型>”的方式指定该类中方法操作的数据类型。
ArrayList<参数化类型> list = new ArrayList<参数化类型>();