Java集合框架

来自CloudWiki
跳转至: 导航搜索

集合框架

什么是集合

什么是集合(Collection)?集合就是“由若干个确定的元素所构成的整体”。例如,5只小兔构成的集合:

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│   (\_(\     (\_/)     (\_/)     (\_/)      (\(\   │
    ( -.-)    (•.•)     (>.<)     (^.^)     (='.')
│  C(")_(")  (")_(")   (")_(")   (")_(")   O(_")")  │

└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘

在数学中,我们经常遇到集合的概念。例如:

  • 有限集合:
    • 一个班所有的同学构成的集合;
    • 一个网站所有的商品构成的集合;
    • ...
  • 无限集合:
    • 全体自然数集合:1,2,3,……
    • 有理数集合;
    • 实数集合;
    • ...

为什么要引入集合

为什么要在计算机中引入集合呢?这是为了便于处理一组类似的数据,例如:

   计算所有同学的总成绩和平均成绩;
   列举所有的商品名称和价格;
   ……

在Java中,如果一个Java对象可以在内部持有若干其他Java对象,并对外提供访问接口,我们把这种Java对象称为集合。很显然,Java的数组可以看作是一种集合:


String[] ss = new String[10]; // 可以持有10个String对象
ss[0] = "Hello"; // 可以放入String对象
String first = ss[0]; // 可以获取String对象

既然Java提供了数组这种数据类型,可以充当集合,那么,我们为什么还需要其他集合类?这是因为数组有如下限制:

  • 数组初始化后大小不可变;
  • 数组只能按索引顺序存取。

因此,我们需要各种不同类型的集合类来处理不同的数据,例如:

   可变大小的顺序链表;
   保证无重复元素的集合;
   ...

怎样实现集合

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

  • 接口:是代表集合的抽象数据类型。接口允许集合独立操纵其代表的细节。在面向 对象的语言,接口通常形成一个层次。
  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构。
  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。 这些算法被称为多态,是因为相同的方法可以在相似的接口上有着不同的实现。

Java中的集合框架

定义

Java集合框架为我们提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。

Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象。

Java6-100.jpg

Collection接口方法

Collection接口是List、Set和Queue接口的父接口,该接口里提供了在集合中添加与删除元素的基本操作以及多种查询操作

List接口

List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定的集合元素。List集合默认按元素的添加顺序设置元素的索引。List的常用实现类有:

ArrayList

┌───┬───┬───┬───┬───┬───┐
│ A │ B │ C │ D │ E │   │
└───┴───┴───┴───┴───┴───┘


ArrayList类支持可随需要而增长的动态数组。ArrayList类对于使用索引取出元素有较高的效率,它可以使用索引来快速定位对象。但元素做删除或插入速度较慢,因为使用了数组,需要移动后面的元素已调整索引顺序。

因为它是动态数组,初始化大小容量4,当数据存满时扩容是以当前数组容量大小的2倍扩容,之后再把数组元素一个一个的存入,数组在扩容时浪费一定的内存空间,和存储时间,而且,元素添加是一个装箱的过程,所以说,跟一般的数组比起来,速度上差些。

LinkedList

       ┌───┬───┐   ┌───┬───┐   ┌───┬───┐   ┌───┬───┐
 HEAD ──>│ A │ ●─┼──>│ B │ ●─┼──>│ C │ ●─┼──>│ D │   │
        └───┴───┘   └───┴───┘   └───┴───┘   └───┴───┘

LinkedList类提供了一个双向链表数据结构,所以针对频繁的插入和删除元素使用LinkedList类效率较高,它适合实现栈和队列。

LinkedList与ArrayList比较:

   LinkedList中插入元素很快,而ArrayList中插入元素很慢
   LinkedList中随机访问很慢,而ArrayList中随机访问很快

Set接口

Set集合类似一个罐子,程序可以一次把对象丢进Set集合,而set集合通常不能记住元素的添加顺序。并且没有重复的对象,如图6-3所示。

Java6-2.png

图6-3 set集合

Set接口常用的实现类有三个:

  • HashSet类是Set接口实现类之一,使用较广泛,它不保存元素的加入顺序。HashSet类根据元素的哈希码进行存放,取出时也可以根据哈希码快速找到。
  • LinkedHashSet类根据元素的哈希码进行存放,同时用链表记录元素加入的顺序。通过链表来存储对象,一般插入和删除效率较高,检索效率相对较低。
  • TreeSet类使用红黑树结构对加入的元素进行排序存放,通过TreeSet构造方法来获取TreeSet对象。

Map接口

Map集合用于保存具有映射关系的数据,即一个存储关键字和值的关联或者说是关键字/值对的对象,如图6-4所示。

Java6-3.png

图6-4 map集合

Map接口常用实现类有:

  • HashMap是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
  • TreeMap类基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序。


,具体方法如表6-1所示。

表6-1 collection接口常用方法

方法名	说    明
boolean add(Object o)	在列表的末尾顺序添加元素,起始索引位置从0开始
addAll(Collection<? extends E> c)	将指定 collection 中的所有元素都添加到此 collection 中
int size()	返回列表中的元素个数
Object get(int index)	返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换
boolean contains(Object o)	判断列表中是否存在指定元素
boolean remove(Object o)	从列表中删除元素
Object remove(int index)	从列表中删除指定位置元素,起始索引位置从0开始

使用foreach遍历集合中的元素

foreach循环除了能便捷的访问数组中的元素外,也可以很方便的迭代访问集合中的元素,下面程序使用foreach循环来迭代访问集合元素:

import java.util.ArrayList;
import java.util.Collection;

public class TestForeach {
	public static void main(String[] args) {
		Collection<String> books = new ArrayList();
		// 添加元素
		books.add("Think in java");
		books.add("java 讲义");
		books.add("java 语言程序设计");
		books.add("疯狂java讲义");
		// 遍历集合
		System.out.println("书库中的书籍有:");
		for (Object book : books) {
			System.out.println((String) book);
		}
	}
}

程序执行的结果为:

书库中的书籍有:
Think in java
java 讲义
java 语言程序设计
疯狂java讲义

Java的包装类型

Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,对应如下:

  • 原始类型:boolean,char,byte,short,int,long,float,double
  • 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

顺便一提,Java中的基本数据类型只有以上8个,除了基本类型(primitive type),剩下的都是引用类型(reference type)。


参考文档:

[1] https://www.cnblogs.com/lifelee/p/5306304.html

[2] https://www.cnblogs.com/liupengpengg/p/6062292.html