今天仔细研究了几个主要的集合类,结合数据结构的知识,说说我对这些集合类特点的认识。
List接口下的类
在数据结构刚开始的时候,就有对顺序表和链表的讲解,包括实现存入数据,获取数据,判空等基本方法。
- Vector和ArrayList的结构就是顺序表。
对两个类的底层代码做了比较,Vector的几乎所有方法都有 sychornizeed修饰。所以很容易看出vector类相比ArrayList是线程安全的。当在需要线程安全的程序里,两者之间当然会选择vector;正由于vector的线程安全,它的开销会相比ArrayList大,所以在正常的情况下会选择ArrayList。 - 相对顺序表,LinkedList的结构是链表结构。
先跑个小题,链表结构都是通过指针建立的结构(前一个元素的指针指向后一个元素),而在Java中,由于指针潜在的危险性,禁用了这一属性,那LinkedList结构是怎么实现的呢 。记得做过一个关于约瑟环的小题。在题中需要建一个循环队列。当时的我还懵懂无知,不懂指针,不懂面向对象思,我就想到了一个这样的方法:首先声明一个二维数组a[n][2],a[x][0]存入元素,a[x][1]存入下一个元素的x下表。后来老师看了以后,说可以建个结构体,存放元素和指针属性。而这正是Java没有指针也能实现链表结构的原因。而我此后越来越觉得指针并不应该是一个具体的东西,而是一个思想:根据已知元素通过某种联系指向另一个我们想得到的元素。
Map接口下的类
在数据结构学习的后期阶段,学习了Map的各种用法,包括一些搜索,动态规划等算法都是建立在Map思想的基础下。可以说Map的思想在金算计领域是很重要的。
HashMap和HasTable
在数据结构中讲到查询的几种算法中,hash表查找就是其中一种。曾经自己做过一个小的hash表结构,可以实现存入和取出功能,当然当时的实现机制的是特别笨重的,即最基本的hash原理。没有一点改进和优化的。但通过此次的联系,让我对哈希表查询表有更深层次的理解。而HashMap类的底层实现也是相同的思想。在HashMap上又引入了Hashtable。HashTable是线程安全的,两者使用场所比较和前面讲的ArrayList与Vector一样的,就不在赘述了。Set接口下的类
主要有TreeSet和HashSet。这两个我没有做深层次的研究,但是从字面意思,应该能了它们的基本存储结构。