您的位置:首页 > 职场人生

黑马程序员—Java集合框架

2015-09-06 06:22 423 查看
------Java培训、Android培训、iOS培训、Net培训、期待与您交流! -------

 

一、集合的概述

        集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体。集合被用于存储、获取、操纵和传输聚合的数据。Java集合框架提供了有效的数据结构和算法,因此不需要我们自己编写代码实现这些功能。而且结合框架对各个接口的实现是可以互换的,因此很容易转换接口。这样就提高了软件的复用性。
二、集合框架
        Java平台提供了一个全新的集合框架。集合框架的核心接口为Collection、List(列表)、Set(集合)和Map(映射),如下图:
       


           

           从上图中可以看到,Collection是集合继承树中最顶层的接口,几乎所有的Java集合框架成员都继承实现了Collection接口,或者与其有密切关系。Collection提供了关于集合的通用操作。Set接口和List接口都继承了Collection接口,而Map接口没有继承Collection接口。因此,Set对象和List对象都可以调用Collection接口的方法,而Map对象则不可以。
       Set有点类似数学中集合的定义,是无序的、没有重复项目的集合。
       List是位置性集合,加进清单的元素可以加在清单中特定位置或加到末尾,可以保存重复的元素。
       Map用于关键字/数值对,其中关键字是数值的惟一标识(不可重复),用户可以按关键字存取数据,数据可重复。

三、Collection接口

       Collection接口是集合框架最基础的接口,所以这个接口定义了整个集合框架都可以调用的方法,因此必须十分的熟悉此定义。

       以下列举了Collection常用的方法:

       


四、List列表

 

    List列表作为集合的一种,主要特点在于其中的元素保持一定的顺序,常用List的两种实现类是ArrayList类和LinkedList类。

(1)ArrayList类

在Java中,标准数组是定长的,创建后,就不能被加长或缩短,也就意味着开发者必须先知道数组可以容纳多少元素,一般情况下,只有在运行时才能知道需要多大的数组,为了解决这个问题,集合框架定义了ArrayList,它能够动态地增加或者减少其大小。

     ArrayList有三种构造方法:

     ArrayList( );----------------------------建立一个空的数组列表

     ArrayList(Collection c );------------建立一个数组列表,该列表由类C中的元素初始化;

     ArrayList(int initialCapacity);------建立一个数组列表,该数组有指定的初始容量(capacity);

     ArrayList类主要的方法及功能描述如下表:

       


示例:创建一个数组列表,接着添加String类型对象,使列表显示出来,将其中一些元素删除后,再一次显示列表;

 

import java.util.ArrayList;
public class MyArrayList {

public static void main(String[] args) {
//创建一个ArrayList对象
ArrayList ar = new ArrayList();
System.out.println("数组的大小:"+ar.size());
//向ArrayList对象中添加内容
ar.add("A");
ar.add("B");
ar.add("C");
ar.add("D");
//把“E”加在ArrayList对象的第一个位置
ar.add(0,"E");
System.out.println("加入元素后数组的大小:"+ar.size());
System.out.println("数组的内容:"+ar);
//删除数组中的对象
ar.remove("B");
ar.remove(0);
//打印删除后数组的内容
System.out.println("删除后元素后数组的大小:"+ar.size());
System.out.println("数组的内容:"+ar);
}

}


控制台输出的内容:

数组的大小:0

加入元素后数组的大小:5

数组的内容:[E, A, B, C, D]

删除后元素后数组的大小:3

数组的内容:[A, C, D]

 

(2)LinkedList类

         LinkedList类提供了一个链接列表的数据结构,它有两种构造方法;

         LinkedList( );--------------------------------建立一个空的链接列表;

         LinkedList( Collection c);-----------------建立一个链接列表,该列表由类C中的元素初始化;

示例:创建一个数组列表,接着添加String类型对象,使列表显示出来,将其中一些元素删除后,再一次显示列表。

import java.util.LinkedList;
public class MyLinkedList {
public static void main(String[] args) {
//创建一个ArrayList对象
LinkedList ar = new LinkedList();
System.out.println("数组的大小:"+ar.size());
//向LinkedList对象中添加内容
ar.add("A");
ar.add("B");
ar.add("C");
ar.add("D");
//在列表的第一个和最后一个位置加入数据
ar.addFirst("E");
ar.addLast("F");
System.out.println("加入元素后数组的大小:"+ar.size());
System.out.println("数组的内容:"+ar);
//删除数组中的对象
ar.removeFirst();
ar.removeLast();
//打印删除后数组的内容
System.out.println("删除后元素后数组的大小:"+ar.size());
System.out.println("数组的内容:"+ar);
}

}

控制台输出的内容:

数组的大小:0

加入元素后数组的大小:6

数组的内容:[E, A, B, C, D, F]

删除后元素后数组的大小:4

数组的内容:[A, B, C, D]     

五、Set类

        Set集合是一种不包括重复元素的Collection,即Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。Set类中的两个主要的类HashSet类和TreeSet类。

(1)HashSet类

        HashSet类创建了一个类集,该类集使用散列表进行存储,而散列表则通过使用称之为散列法的机制来存储信息。在散列中,一个关键字的信息内容被用来确定唯一的一个值,称为散列码。而散列码则被用来当做与关键字相连的数据的存储下标。另外,可以向HashSet中添加null值,但只能添加一次,而且重复向HashSet中添加元素其值只显示一次。

        HashSet类的构造方法如下:

        HashSet( );------------------------------------------------------构造一个默认的散列集合

        HashSet(Collection c);---------------------------------------用类C中的元素初始化散列集合

        HashSet(int initislCapacity);--------------------------------用capacity初始化散列集合的容量

        HashSet(int initialCapacity , float fillRatio);-------------用参数初始化散列集合的容量和填充比(也称为加载容量)

        HashSet类常用的方法及功能描述如下表:

     


示例:

import java.util.HashSet;
public class TestHashSet {

public static void main(String[] args) {
//创建一个HashSet对象
HashSet hs = new HashSet();
//向HashSet对象中添加内容
hs.add("a");
hs.add("a");
hs.add("b");
hs.add("c");
hs.add("b");
hs.add("a");
//向HashSet对象中添加null
hs.add(null);
System.out.println("HashSet中的元素"+hs);
}

}

控制台输出的内容:

HashSet中的元素[null, a, b, c]

 

(2)TreeSet类

         TreeSet为使用树来进行存储的Set接口提供了一个工具。对象按升序进行存储,这方便我们对其进行访问和检索。在存储了大量的需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。

         TreeSet类的构造方法如下:

         TreeSet( );-------------------------------------构造一个空的树集合,其元素按升序排序

         TreeSet(Collection c);----------------------用类C中的元素初始化树集合

         TreeSet(Comparator comp);-------------按照由comp指定的比较方法进行排序

         TreeSet(SortedSet  ss);-------------------构造了一个包含了ss的元素的树集合

        TreeSet类中有几个特殊的方及功能描述:
        


       示例:

HashSet中的元素[null, a, b, c]HashSet中的元素[null, a, b, c]HashSet中的元素[null, a, b, c]HashSet中的元素[null, a, b, c]HashSet中的元素[null, a, b, c]HashSet中的元素[null, a, b, c]HashSet中的元素[null, a, b, c] 

import java.util.TreeSet;
public class MyTreeSet {

public static void main(String[] args) {
//创建一个TreeSet对象
TreeSet  Tr = new TreeSet();
//向TreeSet对象中添加内容
Tr.add(1);
Tr.add(6);
Tr.add(4);
Tr.add(0);
Tr.add(2);
System.out.println("TreeSet类输出内容"+Tr);
}
}

控制台输出的内容:

TreeSet类输出内容[0, 1, 2, 4, 6]

注明:TreeSet类会按树顺序存储其元素,所以它们被按照数字大小排列;而HashSet则 不会。

 

六、通过迭代方法访问类集——Iterator接口

        Iterator()是一个或者实现Iterator,或者实现ListIterator接口的对象。Iterator可以完成通过循环输出类集内容,从而获得或删除元素。ListIterator是对Iterator的扩展,允许双向遍历列表,并且可以修改单元。

        Iterator接口说明方法的总结:

       


           在通过迭代方法访问类集之前,必须得到一个迭代方法。通常,使用迭代方法循环输出类集内容的操作步骤如图:

 

                                    


示例:

import java.util.ArrayList;
import java.util.Iterator;

public class MyListIterator {

public static void main(String[] args) {
//创建一个ArrayList对象
ArrayList ar = new ArrayList();
//向ArrayList对象中添加内容
ar.add("A");
ar.add("B");
ar.add("C");
ar.add("D");
System.out.print("数组的内容是:");
//使用Iterator显示数组的内容
Iterator itr = ar.iterator();
//调用hasNext()方法进行循环
while (itr.hasNext()) {
Object c = itr.next();
System.out.print(c+"");

}
}

}

控制台显示的内容:

数组的内容是:ABCD

 

七、映射

         映射(map)是一个存储关键字和值的关联,或者说是“关键字/值”对的对象,即给定一个关键字,可以得到它的值。关键字和值都是对象,关键字必须是唯一的,但值是可以被复制的。而Map接口映射唯一关键字到值。关键字是以后用于检索值的对象。给定一个关键字和一个值,可以存储这个值到一个Map对象中。当这个值被存储以后,就可以使用它的关键字来检索它。

        Java提供了几个用来实现映射接口的类。可以被用作映射的类如下表:

      


(1)HashMap类

     HashMap类使用散列表实现Map接口,其构造方法如下:

     HashMap();-----------------------------------------------构造一个默认的散列映射;

     HashMap(Map m);--------------------------------------用类m中的元素初始化散列映射

     HashMap(int Capacity);-------------------------------将散列集合的容量初始化为capacity

     HashMap(int Capacity , float fillRatio);------------用参数同时初始化散列映射的容量和填充比

    HashMap类的主要方法及功能如下表:



示例:

import java.util.HashMap;
public class MyHashMap {

public static void main(String[] args) {
//创建一个HashMap对象
HashMap hm = new HashMap();
//向HashMap对象中添加内容
hm.put(1,"a");
hm.put(2,"b");
hm.put(3,"c");
hm.put(4,"d");
System.out.println("添加元素后的结果为:");
System.out.println(hm);
//删除和替换元素
hm.remove(3);
hm.put(2, "e");
System.out.println("删除和替换元素后的结果为:");
System.out.println(hm);
}

}


控制台显示的内容:

添加元素后的结果为:

{1=a, 2=b, 3=c, 4=d}

删除和替换元素后的结果为:

{1=a, 2=e, 4=d}
注意:HashMap类不保证输出元素的顺序

 

(2)TreeMap类

       TreeMap类通过使用树实现Map接口。TreeMap提供了按排序顺序存储关键字/值对的有效手段,同时允许快速检索。不像散列映射,树映射保证它的元素按照关键字升序排序。

        TreeMap的构造方法如下:

        TreeMap();---------------------------------------构造一个空树的映射

        TreeMap(Map m);------------------------------用类m中的元素初始化映射,使用关键字按自然排序

        Treemap(Comparator comp);---------------构造一个空的基于树的映射通过的使用Comparator来排序

        TreeMap(SortedMap sm);--------------------用从sm的输入来初始化一个树映射

        TreeMap类常用方法及功能如下:

       


示例:

import java.util.Iterator;
import java.util.TreeMap;
public class MyTreeMap {

public static void main(String[] args) {
//创建一个TreeMap对象
TreeMap tm = new TreeMap();
//向TreeMap对象中添加内容
tm.put(1,"a");
tm.put(7,"b");
tm.put(5,"c");
tm.put(3,"d");
System.out.println("所有的元素的值为:"+tm);
//为tm对象中的键值添加一个迭代器
Iterator iter = tm.keySet().iterator();
for (; iter.hasNext();) {
System.out.println("元素的值:"+tm.get(iter.next()));
}
}
}


控制台输出的内容:

所有的元素的值为:{1=a, 3=d, 5=c, 7=b}

元素的值:a

元素的值:d

元素的值:c

元素的值:b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: