黑马程序员_java总结_集合框架

时间:2023-02-18 15:11:10

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

在编程中,需要管理很多对象集,比如其学校的学生信息,其公司的全体员工信息等,而在java中就有必要提供管理这些信息的数据结构了,而这个结构就是集合框架.
又由于各种原因,有着各种不同的实现,因此java中就定义了一个Collection接口,规范了一些必须的方法,这样不管你采用怎样的实现都必须有这些方法.在java中,定义
的框架体系是很复杂的,但是其最主要的结构可以看作是: Collection(List(ArrayList LinkedList) Set(HashSet TreeSet));
我们先介绍一下它的具体实现的一些特点,然后再介绍对它的一些具体的操作,最后说一下基于这个体系的另一个增强体系Map体系.
先简单的介绍一下它们的特点:
List体系:提供了有序的序列,即存入的时候是什么顺序取出的时候就是什么顺序,通常在该体系中允许有重复的元素出现.我们可以用索引的方式精确的控制每一个元素
的插入位置,也可以以同样的方式精确的访问每一个位置的元素.在它下面提供了两种具体的实现方式:以数组结构实现的(ArrayList Vector) 和以链表结构实现的
(LinkedList ),我们可以根据实际的需要选择具体的实现结构.若经常需要随机的访问集合中的元素,用数组结构的效率要高于用链表结构的,而若经常需要删除或随
机的插入元素,用链表结构的明显要好于数组结构的,这都取决于具体的需求.

Set体系:该体系并不能保证存入的时候是什么顺序取出的时候就是什么顺序,但是该体系可以保证数据的唯一性,也就是不包含重复的元素.在它下面提供了两种具体的实
现方式:以哈稀表结构实现的HashSet 和以二叉树结构实现的TreeSet,前面说到了它并不能保证存入什么顺序取出就是什么顺序,而且能保证数据的唯一性,那么它是按照
怎样的机制来存放数据的呢?这取决于具体的实现.

在以哈稀结构为具体实现时,它在存入的时候会先判断该元素的哈稀值在集合中是否存在,如果不存在,直接插入到集合中,如果已经存在,那么它会再用其的equals方
法与存在的这些(个)元素进行比较,返回真就不插入,否则插入.总结下来就是它保证数据唯一性的方式是:先判断哈稀值,再判断equals,只要有一条不满足就插入,如
果要经常在集合中查找元素,这无疑是最快的

在以二叉树结构为具体实现时,它可以在保证元素唯一性的同时对集合中的元素进行排序.但是前提是存入的元素必须具备可比较性(实现comparable接口并覆盖它的
comparTo()方法),而它保证元素唯一性和排序的依据都来自于这个comparTo()方法,如果返回0表示元素已经存在,不插入,返回负数,表示小于,正数表示大于.简单的
总结就是保证数据唯一性的方式是根据comparable接口中的comparTo()方法的返回值来确定.如果即要保证集合中元素的顺序又想要快速查找,选择它是最合适的.

好了,现在在分别介绍一下它们的具体操作.除了具体实现本身所具有的操作方式以外,在集合体系中还规范了另一种对集合操作的方式,那就是迭代器,所以我首先在这里
先介绍迭代的概念.在java中对集合规范了一些必须的方法,其中一个就是Iterator<E> iterator(),它把这个迭代器封装在了集合的内部 ,迭代器是一种行为类似于指针
的对象,每一个容器都要提供专属的迭代器,以避免暴露太多的内部实现细节.所以迭代器就被抽象出来成为一个接口,而集合中的每一种具体的实现都必须覆写这个接口中
的方法,并提供一个专属的迭代器.可以通过这个迭代器对集合中的元素进行访问和操作,方法如:
Iterator it = Collection的具体实现.iterator();
while(it.hasNext())
{
元素类型 元素名 = it.next();
//可以对元素进行非破坏性操作(破坏性操作指的是更改,删除等会对数据进行改变的操作)
}
这里要提一点的是,由于迭代器是一种行为类似于指针的对象,所以在迭代的时候如果从外部对其进行了破坏性的操作,就会引起迭代的错误,所以在java中如果出现这种情
况就会出现UnsupportedOperationException异常.所以在使用的时候请多加注意.
对于List体系.它还专门提供了一个更具体的迭代器:ListIterator,该迭代器提供了更多的方法.
另外对于Collection集合还专门提供了一个可以对集合进行操作的工具类Collections,该类中提供了对Collection集合体系的更具体的操作方法,如排序,查找,反转等..
所以,如果想要更具体的操作集合,可以使用该类中的方法,具体的可以看API文档.

最后是基于Collection体系的Map体系.

由于Collection体系中存放的都是单个的对象,如果遇到数据是一组一组的存放的时候操作起来就会很麻烦,所以java中提供了一个专门的体系用于存放一组一组的对象.
这就是Map体系.Map中的数据都是按照键和值一组一组的存放的.而它实际上就是封装的Collection,要对该体系进行操作可以把其转换成Collection对象,再利用
Collection体系中操作集合的方法进行操作.它提供3种转换成Collection的方式:以键的形式: Set<K> keySet() ,以值的形式:Collection<V> values() ,以键值对的形
式:Set<Map.Entry<K,V>> entrySet() ,可以根据不同的需要来转换.

至此,集合框架的体系算是整理完了,由于学的不是很好,所以如果有哪里不对或不足的地方还请指正!谢谢!另外关于泛型的部分没有提到,就当是在看java早期的版本吧!
关于泛型还没有复习到,而还有一些地方不是很明确,所以就暂时不让你们的手指有机会往下面对着我了.呵呵 !