Java.util包中提供了一些集合类,这些集合类又被称为容器。集合类与数组不同之处是:数组长度是固定的,集合长度是可变的;数组存放基本的数据类型,集合来存放对象的引用。
常用的集合有List集合、Set集合、Map集合,其中List集合与Set集合继承了Collection接口。上述集合类的继承关系如下:
一、Collection接口
Collection接口是层次结构中的根接口,构成Collection的单位称为元素。Collection接口通常不直接使用,但该接口提供了添加、删除、管理数据的方法,由于List与Set接口都继承Collection接口,所以这些方法对于List集合与Set集合是通用的。
Collection接口常用的方法如下:
对于集合的遍历,都通过迭代器(Iterator)来实现。
例1、使用Collection接口创建一个集合对象,并添加元素
package cn;
import java.util.*;
public class Collection {
public static void main(String args[])
{
//实例化集合对象Collection
java.util.Collection<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
//创建迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext())
{
String str = (String)iterator.next();
System.out.println(str);
}
}
}
这里使用Collection接口创建对象,并通过迭代器访问集合元素,需要注意的是。这与之前(继承2)中的泛型数据类型很相似,但不同点是该例子中创建的是Collection接口对象,访问只能通过蝶迭代器,而泛型数据类型所创建的对象是ArraysList,访问可以通过get访问。
二、List集合
(1)、List接口
List集合中的元素允许重复,可以通过索引访问集合中的元素。
List接口继承了Collection接口,因此包含Collection接口中的所有方法。
(2)、List接口实现类
List接口实现类有ArrayList类、LinkedList类
- ArrayList类实现了可变数组,允许保存所有元素,包括null,可以通过索引位置来对集合的快速访问,缺点是执行效率慢
- LinkedList类采用链表保存对象,优点是便于向集合插入和删除元素,但对于随机访问,使用LinkedList效率要比List集合低
语法格式:
List<E> list = new ArrayList<>();
List<E> list = new LinkedList<>();
其中E为对象
例1、使用List创建一个ArrayList集合对象,并添加元素
public static void List()
{
List<String> list = new ArrayList<>();
String str[] = {"aa","bb","cc"};
for (String element:str)
list.add(element);
for (String element:list)
System.out.println(element);
for (int i = 0;i< list.size();i++)
System.out.println(list.get(i));
}
三、Set集合
Set集合中的对象不按特定的方式排序,Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成,Set接口继承了Collection接口,故包含Collection接口中的所有方法。
(2)、Set接口实现类
Set接口实现类有HashSet类与TreeSet类。
- HashSet类实现了Set接口,由哈希表支持。它不保证Set集合的迭代顺序,特别的它不保证该顺序恒久不变。此类允许使用null元素
- TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,所以TreeSet类实现的Set集合在遍历结合时按照自然方式递增排序。
例1、使用TreeSet类创建一个Set类对象,并用迭代器遍历输出
package cn;
import java.util.TreeSet;
public class Set {
public static void main(String[] args)
{
java.util.Set<Integer> set = new TreeSet<>();
set.add(1);
set.add(-1);
set.add(3);
java.util.Iterator<Integer> iterator = set.iterator();
while(iterator.hasNext())
System.out.println(iterator.next());
}
}
//result: -1 1 3
例2、使用TreeSet类创建TreeSet对象,并测试TreeSet类中的方法
四、Map集合
Map集合没有继承Collection接口,其提供的是“键值对”的映射,Map集合中不能包含相同的key,每个key只能映射一个value。key决定了存储对象在映射中的存储位置,但不是由key本身所决定,而通过散列码所决定,散列码通常作为一个偏移量,该偏移量对应分配给内存空间的起始位置。
Map集合类包括Map接口与Map接口的所有实现类。每个key最多映射一个value值。
(2)、Map接口实现类
例1、
import java.time.chrono.IsoChronology;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class Map {
public static void main(String args[])
{
HashMap<Integer,String> hashMap = new HashMap<>();
hashMap.put(1,"a");
hashMap.put(2,"b");
hashMap.put(3,"c");
//利用hashMap.keySet()生成一个Set集合,后利用Set迭代器返回所有的key值
Set<Integer> set = hashMap.keySet();
Iterator<Integer>iterator = set.iterator();
//利用hashMap.values生成一个对象为values的Collection集合,后利用Collection迭代器返回所有的values值
Collection<String> collection = hashMap.values();
Iterator<String>stringIterator = collection.iterator();
System.out.println("key值:");
for (Integer element:set)
System.out.print(" "+element+" ");
System.out.print("\n"+"value值:"+"\n");
while (stringIterator.hasNext())
{
String element = stringIterator.next();
System.out.print(" "+element+" ");
}
}
}
需要注意的是key、value的值分别要通过hashMap中的keySet方法、values方法转化为Set集合、Collection集合通过迭代器获取或foreach获取。
1、如果直接打印输出Map
System.out.printfln(hashMap)
输出结果:
2、containsKey(Object key)方法,来判断此映射是否包含指定的Key
if (hashMap.containsKey(1))
System.out.println("1存在于hashMap中");
//result ture
3、containsValues(Object values)方法,来判断此映射是否包含指定的values
hashMap.containsValue("b")
//result ture
4、利用以下代码可以判断输入的key、values其是否为一个特定的键值对(在hashMap中)
System.out.println(hashMap);
Scanner Str = new Scanner(System.in);
Scanner anInt = new Scanner(System.in);
String str = Str.nextLine();
int i = anInt.nextInt();
if (hashMap.containsValue(str))
{
if (hashMap.get(i).equals(str))
System.out.println("{"+i+"="+str+"}"+"存在且为一个键值对");
else
System.out.println("{"+i+"="+str+"}"+"该键值对不存在");
}
else
System.out.println("{"+i+"="+str+"}"+"该键值对不存在");
笔记参考《Java从入门到精通》