首页 > 代码库 > 集合类框架

集合类框架

1. 集合类框架定义

在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection Framework)。 这意味着我们在具体应用时不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象并加以应用就可以了,从而提高了编程效率。你可以了解更多关于Java集合框架的知识。

Java.util 中的集合类包含 Java 中某些最常用的类。最常用的接口是 List 和 Map。List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。List 适用于按数值索引访问元素的情形。

下图是Java集合框架的结构图,从此处你可以大致了解到各种类型的集合之间的关系。 
技术分享

2. 认识 ArrayList

ArrayList 就是动态数组,支持自动改变大小,可以灵活的插入和删除元素。你可以进一步了解ArrayList。

ArrayList 定义了一些用于插入和删除元素的方法,了解一下:

方法说明
add(E e) 将指定的元素添加到此列表的尾部
clear() 移除此列表中的所有元素
contains(Object o) 如果此列表中包含指定的元素,则返回 true
get(int index) 返回此列表中指定位置上的元素
remove(int index) 移除此列表中指定位置上的元素
toArray() 按从第一个到最后一个元素的顺序返回包含此列表中所有元素的数组

 

import java.util.ArrayList;
import java.util.List;

public class ArrayListTraversal {
    public static void main(String[] args)
    {
        //创建列表list
        List<Integer> list = new ArrayList<Integer>();

        for(int i=0;i<10;i++)
        {
            //使用add方法,通过for循环向list中增加10个元素
            list.add(i);
        }

        System.out.println("Items in the list: ");
        //输出列表中全部的元素。
        System.out.println(list);

        System.out.println("Items in the list with odd index: ");
        for(int i=1;i<list.size();i+=2)
        {
            System.out.print(list.get(i)+" ");
        }
    }
}
Items in the list: 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Items in the list with odd index: 
1 3 5 7 

3. 认识 HashMap

Java 自带了各种 Map 类,这些 Map 类可归为三种类型:

  1. 通用 Map : HashMap、Hashtable、Properties、LinkedHashMap、IdentityHashMap等
  2. 专用 Map : java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons等
  3. 一个用于帮助实现您自己的 Map 类的抽象类

其中,通用Map用于在应用程序中管理映射,通常在 java.util 程序包中实现,可以直接使用。

Map 定义了几个用于插入和删除元素的方法,通过这些方法可以更改 Map 中的内容。

方法说明
clear() 从 Map 中删除所有映射
remove(Object key) 从 Map 中删除键和关联的值
put(Object key, Object value) 将指定值与指定键相关联
get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
clear() 从 Map 中删除所有映射
putAll(Map t) 将指定 Map 中的所有映射复制到此 map

HashMap是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。这里的键值对(key - value)

下面我们使用HashMap及其中的一些方法来做一个简单的电话簿,让用户通过输入待查询的姓名来获取其对应的电话号码。

package 电话簿;

import java.util.HashMap;
import java.util.Scanner;

public class PhoneBookByMap {

    public static void main(String[] args)
    {
        //创建一个HashMap对象,名称为phonebook,键值对的类型均为String
        HashMap<String,String> phonebook = new HashMap<String,String>();

        //创建扫描器用于获取用户的输入
        Scanner scan = new Scanner(System.in);

        //创建一个名为keyword的字符串用于存放用户输入的关键词
        String keyword = new String();

        //利用自写的initPhoneBook方法为电话薄装入数据,完成其初始化
        phonebook = initPhoneBook(phonebook);

        //提示用户输入待查询的姓名
         System.out.println("Please input a name that you want to search:");

         //将用户的输入信息装入字符串keyword中
         keyword = scan.nextLine();
         while(keyword.isEmpty())
         {
             System.out.println("please input a name! ");
             keyword = scan.nextLine();
         }

         //若用户有输入某个关键词,则按照该关键词在phonebook中查找其对应的号码
         System.out.println("The result is :");
         System.out.println(queryPhone(phonebook,keyword));

         scan.close();
    }

    private static HashMap<String, String> initPhoneBook(HashMap<String, String> phonebook) {
        // 该方法用于完成指定HashMap的初始化,为其装入一些号码数据,你也可以自定义这些数据
        // Q:你还清楚形参和实参的区别吗?

        phonebook.put("Steve", "13012345678");
        phonebook.put("Bob", "028-80001234");
        phonebook.put("Peter", "182222233333");
        // 使用put()方法将姓名与电话号码相关联,存放在名为phonebook的HashMap中
        // put()方法中,第一个参数为关键词key,第二个参数为其对应的值value

        return phonebook;
        // 返回修改后的phonebook
    }

    private static String queryPhone(HashMap<String, String> phonebook, String keyword) {

        String result = new String();
        // 创建存放结果的字符串result

        result = phonebook.get(keyword);
        // 使用get()方法查询keyword所对应的电话号码,并赋给result
        // put()方法中,参数为关键词key,返回值为其对应的值value,未找到对应值时,返回值为null

        if (result == null)
            return "Can not find this user.";
        // 如果未找到该用户的电话号码,则将查询结果修改为“未找到该用户”

        return result;
        // 返回查询结果
    }
}
Please input a name that you want to search:
Steve
The result is :
13012345678

4. 常见问题解答

1. Collection与Collections的区别?

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。 
技术分享 
java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

2. List、Set和Map是否继承自Collection接口?

List和Set是,Map不是(见上图)

3. ArrayList、Vector、LinkedList的区别?

1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

2.Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。

3.LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

4. HashMap与Hashtable的区别? 

1. Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。 
2. Hashtable的方法是同步的,而HashMap的方法不是 
3. 只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。

集合类框架