Java程序开发之泛型与集合框架

(学习参考书:Java2实用教程第5版)

一、泛型

泛型的主要目的是可以建立具有类型安全的集合框架,如链表、散列映射等数据结构。实现常见数据结构的类通称为Java集合框架。

(1)泛型类声明
可以使用“ class 名称<泛型列表> ”声明一个和普通的类有所区别的类,这样的声明的类称作泛型类。泛型列表给出的泛型(对象或接口)可以作为类的成员变量的类型、方法的类型以及局部变量的类型。
(2)使用泛型类声明对象
和普通的类相比,泛型类声明和创建对象时,类名后多了一对“<>”,而且必须要使用具体的类型替换“<>”中的泛型。
泛型最重要的一个优点是:在使用泛型类建立安全的数据结构时,不必进行强制类型转换,即不要求进行运行时类型检查。

二、链表

链表是由若干个结点的对象组成的一种数据类型,可以动态的减少和增加数据项。在单链表中每个结点含有一个数据和下一个节点的引用;在双链表中每个结点含有一个数据和上一个节点的引用,以及下一个结点的引用。

(1)LinkedList泛型类
java.util包中的LinkedList泛型类创建的对象以链表结构存储数据习惯上称LinkedList类创建的对象称为链表对象。例如创建一个空双链表:

LinkedList<类型> 链表名 = new LinkedList<类型>();

使用链表泛型类创建链表时,必须要指明E的类型,然后链表可以通过链表对象名.add(对应类型的具体值)依次增加结点。结点通过add方法自动连接,不需要操作安排结点中所存放的下一个或上一个引用。

(2)常用方法
LinkedList是实现了泛型接口List的泛型类,泛型接口List又是Collection泛型接口的子接口。因此可以使用接口回调技术,将链表对象的引用赋值给接口变量,调用类实现的接口方法。
LinkedList实现List泛型接口的一些常用方法:

public boolean add(E element) 向链表末尾添加一个新的结点,该结点中的数据是参数element指定的数据
public void add(int index,E element) 向链表指定位置添加一个新的结点,该结点中的数据是参数element指定的数据
public void clear() 删除链表的所有结点,让当前链表称为空链表
public E remove(int index) 删除指定位置上的结点
public boolean remove(E element) 删除首次出现含有数据element的结点
public E get(int indedx) 得到链表中指定位置处结点的数据
public int indexOf(E element) 返回含有数据element的结点在链表中首次出现的位置,如果链表中没有此结点,返回-1
public int lastIndexOf(E element) 返回含有数据element的结点在链表中最后出现的位置,如果链表中没有此结点,返回-1
public E set(int index,E element) 将当前链表index位置结点中的数据替换为参数element指定的数据,并返回被替换的数据
public int size() 返回链表的长度,即结点的个数
public boolean cntains(Object element) 判断链表中是否含有数据element

LinkedList泛型类本身新增加的一些常用方法:

public void addFirst(E element) 向链表的头添加新结点,该结点中的数据是参数element指定的值
public void addLast(E element) 向链表的末尾添加新结点,该结点中的数据是参数element指定的值
public E getFirst() 得到链表中第一个结点的数据
public E getLast() 得到链表中最后一个结点的数据
public E removeFirst() 删除第一个结点,并返回这个结点的数据
public E removeLast() 删除最后一个结点,并返回这个结点的数据
public Object clone() 得到当前链表的一个克隆链表,原链表和克隆链表各自数据的改变互不影响

(3)遍历链表
链表、散列表等不同存储结构的集合都提供了迭代器以供遍历整个集合。链表对象可以使用iterator()方法获取一个Iterator对象,该对象就是针对当前链表的迭代器。

Iterator<类型> iter = list.iterator;

(4)排序和查找
Collections类提供的用于排序和查找的类方法如下:

public static sort(List<E> list) 该方法可以将list中的元素按升序排列
int binarySearch(List<E> list,E key,CompareTo<E> c) 该方法使用折半法查找list是否含有和参数key相等的元素,如果key与链表中某个元素相等,方法返回和key相等的元素在链表中的索引位置(链表索引从0开始),否则返回-1

排序链表或查找对象,都涉及对象的大小关系。String类实现了Comparable接口,规定字符串按字典序比较大小。如果链表中的对象不是字符串数据,那么创建对象的类必须实现Comparable接口。即实现该接口中的compareTo方法来规定对象的大小关系。

(5)洗牌和旋转
Collection类提供了将链表中的数据重新随机排列的类方法以及旋转链表中数据的类方法。

public static void shuffle(List<E> list)将list中的数据按洗牌算法顺序
static void rotate(List<E> list,int distance)旋转链表中的数据。当distance去正值时,向右转动list中的数据,取负值向左
public static void reverse(List<E> list)翻转list中的数据,彻底倒序

三、堆栈

堆栈是一种“后进先出”的数据结构,只能在一端进行输入或输出数据的操作。堆栈把第一个放入该堆栈的数据放在最底下,而把后续放入的数据放在已有数据的顶上。向堆栈中输入数据的操作叫做“压栈”,从堆栈中输出数据叫“弹栈”。由于堆栈总是在顶端进行数据的输入输出操作,所以弹栈总是输出(删除)最后压如堆栈的数据。
使用java.util包中的Stack泛型类创建一个堆栈对象。以下是相关方法:

public E push(E item) 实现压栈操作
public E pop() 实现弹栈操作
public boolean empty() 判断堆栈是否还有数据,有数据返回false
public E peek() 获取堆栈顶端的数据,但不删除(不等于弹栈)
public int search(Object data) 获取数据在堆栈中的位置,最顶端位置是1向下以此增加,如果不含此数据,返回-1

四、散列映射

HashMap<K,V>泛型类实现了泛型接口Map<K,V>,HashMap<K,V>类中的绝大部分方法都是Map<K,V>接口方法的实现,因此编程时可以使用接口回调技术调用类实现的方法。
HashMap<K,V>泛型类创建的对象采用散列表这种数据结构存储数据,习惯性HashMap<K,V>对象称为散列映射。(其中K是键,V是键对应的值)

(1)散列映射的使用
散列映射用于存储键值对,允许把任何数量的键值对存储在一起。键不可以发生逻辑冲突(两个数据项使用相同的键),如果冲突,先前的键值对将被替换。散列映射在它需要更多的存储空间时会自动增大容量,如果散列映射的装载因子是0.75,那么当容量使用了75%时,散列映射将容量扩充为原来的两倍。相比数组和链表,散列映射处理大量数据时可以减少检索的开销。

键值对:键:要存的值的编号;值:要存放的数据

(2)常用方法

public void clear() 清空散列映射
public Object clone() 返回当前散列映射的一个克隆
public boolean containsKey(Object key) 如果散列映射有键值对使用了参数key指定的键,方法返回true,否则返回false
public boolean containsValue(Object value) 如果散列映射有键值对具有参数value指定的值,方法返回true,否则返回false
public V get(Object key) 返回散列映射中使用key做键的键值对中的值
public boolean isEmpty() 如果散列映射不含有任何键值对,方法返回true,否则返回false
public V remove(Object key) 删除散列映射中键为指定参数的键值对,并返回对应的值
public int size() 返回散列映射的大小,即其中键值对的数量

(3)遍历散列映射

public Collection<V> values()

该方法返回一个实现Collection接口类创建的对象,可以使用接口回调技术,回调iterator()方法获取一个Iterator对象,这个对象存放散列映射中所有键值对中的值。

(4)基于散列映射的查询
对于经常需要查找的数据使用散列映射来存储这种数据,即为数据指定一个查找它的关键字,然后按着键值对,将关键字和数据一并存入散列映射中。

五、树集

(1)TreeSet泛型类
TreeSet泛型类是实现接口Set的类,TreeSet泛型类创建的对象称作树集。树集采用树结构存储数据。

(2)结点的大小关系
树集结点的排列与链表不同,不按添加的先后顺序排列,树集结点会按照其存放的数据的“大小”顺序一层一层排列,再同一层中的结点从左到右按字典序的从小到大递增排列,下一层的都比上一层的小。

实现Comparable接口类创建的对象可以调用comparaTo(Object str)方法和参数指定对象比较大小关系。例:a.comparaTo(b)<0表示a小于b
(3)TreeSet类的常用方法

public boolean add(E e) 向树集添加结点,结点中的数据由参数指定,添加成功返回true,否则返回false
public void clear() 删除树集中的所有结点
public void contains(Object o) 如果树集中有包含参数指定的对象,该方法返回true,否则返回false
public E first() 返回树集中第一个结点的数据(最小的结点)
public E last() 返回树集中最后一个结点的数据(最大的结点)
public boolean isEmpty() 判断是否为空树集,如果树集不含任何结点,该方法返回true
public boolean remove(Object o) 删除树集中的存储参数指定的对象的最小结点,如果成功返回true,否则返回false
public int size() 返回树集中结点的数目

六、树映射

TreeMap<K,V>类实现了Map<K,V>接口,称为TreeMap<K,V>对象为树映射。树映射使用public V put(K key,V value)方法添加结点,树映射的结点存储的是键值对,且保证结点按照关键字升序排列。

七、自动装箱和拆箱

程序允许把一个基本数据类型添加到类似链表等数据结构中,系统会自动完成基本数据到相应对象的转换(自动装箱)。当从一个数据结构中获取对象时,如果该对象是基本数据的封装对象,那么系统自动完成对象到基本数据类型的转换(自动拆箱)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值