黑马程序员—Java集合框架

------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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值