集合类的学习笔记(原)

来源:互联网 发布:女性自慰器 知乎 编辑:程序博客网 时间:2024/06/12 01:29

 

 

 

 

二.列表实现类(List)

       1.ArrayList

        Resizable-array implementation of the List interface. Implements all optional list operations, and permits all elements, including null. In addition to implementing the List interface, this class provides methods to manipulate the size of the array that is used internally to store the list. (This class is roughly equivalent to Vector, except that it is unsynchronized.)

ArrayList()
              Constructs an empty list with an initial capacity of ten.

 

12    ArrayList:我们可以将其看作是能够自动增长容量的数组。它的底层是用对象数组实现的,它有 size(),get(index),add(),方法,并且实现了toString()方法,只要它所包含的对象也实现了这个方法就可以直接通过打印列表的方式来将各个元素输出。

13    利用ArrayListtoArray()返回一个数组, 可以作为数组和列表转换的桥梁。

14    Arrays.asList()返回一个列表,但这个列表是固定尺寸的,不可以通过add()方法添加对象,只能通过set(index,object)方法来修改对应索引的值。

15    迭代器(Iterator) 给我们提供了一种通用的方式来访问集合中的元素。

一般实现的方法如下,

//利用迭代器设计了一种通用的方法,用来取出集合中的元素,因为有些集合类中并没有get()方法.

public static void printElements(Collection c)

{

        Iterator it=c.iterator();

        while(it.hasNext())

        {

               System.out.println(it.next());

        }

}

       因为后面讲到的set接口的实现类,就没有get()方法只能通过迭代器来访问列表元素。Iterator中只有三个方法如下:

 

 

boolean

hasNext()
          Returns true if the iteration has more elements.

 E

next()
          Returns the next element in the iteration.

 void

remove()
          Removes from the underlying collection the last element returned by the iterator (optional operation).

 

而且remove()方法是可选的,这样做的目的也是为了避免产生很多的借口,增加了学习难度。另外还要提醒大家注意两点:

(1)remove()方法

在使用remove()方法时,要注意先要用next()方法返回这个元素,然后才能删除这个元素。但是用迭代器很少使用删除方法,一般都是使用输出功能。

(2)Arrays.aslist()返回的列表,并没有实现remove()方法

3 iteratorEnumeration的比较首选是前者只有在hashmap这个类中会涉及到这方面的东西。

 

Collections类中所有的方法都是静态方法提供了一个自然排序的方法 sort(list)sort(list,comparator(java.util))

(a)有比较器的排序方法

要用一个内部类(最好)实现这个比较器接口中的

compare(T o1, T o2)

L另外一个方法一般不用实现,因为一般的类都是继承自Object这个基类,已经实现了equals()方法。

b) 没有比较器的排序方法

必须使list中的对象实现Comparable接口中的compareTo(T o)方法。

另外 Collections类还实现了下面的方法

1        取最大和最小的元素Collections.max()Collections.min()

2        在已排序的List中搜索指定的元素Collectons.binarySearch()

 

具体的代码可以参考ArrayListTest.java

 

2LinkedList

1         LinkedList是采用双向循环链表实现的。

2         利用LinkedList实现栈(stack)、队列(queue)、双向队列(double-ended queue )

具体的代码可以参考文件夹LinkList下的代码,模拟了栈和队列。

3          

ArrayListLinkedList的比较

6         ArrayList底层采用数组完成LinkedList则是以一般的双向链表(double-linked list)完成其内每个对象除了数据本身外还有两个 引用分别指向前一个元素和后一个元素。

7         如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用LinkedList,否则的话,使用ArrayList将更加快速。

三. Set实现类(HashSet,TreeSet)

1. HashSet

3        实现Set接口的hash table(哈希表),依靠HashMap来实现的。

4        我们应该为要存放到散列表的各个对象定义hashCode()equals()

因为hashSet是实现set接口,所以不可以有重复的元素。那么这个散列表是如何判定元素是否重复,通过hashcode()来判别的,对于不同的对象他们的hashcode是不同的,为了按照自然排序的方式把对象存放到散列表中,我要把对象的hashcode()equals()重写。

 

2TreeSet

1           TreeSet是依靠TreeMap来实现的。

2         TreeSet是一个有序集合TreeSet中元素将按照升序排列缺省是按照自然顺序进行排列意味着TreeSet中元素要实现Comparable接口。

3         我们可以在构造TreeSet对象时,传递实现了Comparator接口的比较器对象

 

具体实现代码参考HashSetTest.javaTreeSetTest.java

HashSetTreeSet的比较

 

HashSet是基于Hash算法实现的其性能通常都优于TreeSet。我们通常都应该使用HashSet在我们需要排序的功能时我们才使用TreeSet

四. Map实现类(HashMapTreeMap)

Map借口和Collection没有关系所以没有add()方法。

1        HashMap

HashMapkey进行散列。

添加元素采用put()方法得到元素采用get(key)方法。

keySet()返回map中的key视图,返回值为set,可以通过迭代器输出。

values()返回map中的value视图,返回值为collection,可以通过迭代器输出。

entrySet()。返回map视图返回值为set,可以通过迭代器输出。

这里要提醒注意的是 这个set中的每个元素都是Map.Entry类型,每个元素都有getKey()和getValue()可以分别获得 key和value 。

2TreeMap

TreeMap按照key进行排序

HashMapTreeMap的比较

 

Set类似,HashMap的速度通常都比TreeMap快,只有在需要排序的功能的时候,才使用TreeMap

具体的实现代码可以参见代码HashMapTest.java

五.Properties

继承自HashTable

其中有3个方法值得注意:

public Enumeration<?> propertyNames()返回 key的一个枚举

public void list(PrintStream out)结合System.. Properties()方法。

getProperty(String key)得到对应key的value

load(InputStream inStream)可以加载一个文件流,一般是 配置文件 *.ini。

 

五.Java1.0/1.1的集合类

 

1         Vector:用ArrayList代替Vector

2         Hashtable:用HashMap代替Hashtable

3         Satck:用LinkedList代替Stack,,主要是因为这个类继承了vectorelementAt(index)方法,丢弃了栈的特性,我们可以采用LinkedList来模拟 stackquene

4         ArrayList代替Vector

Hashtable:用HashMap代替Hasht 和用HashMap代替Hashtable。有相同的原因

关于原因的分析参看tutorial1.5下面是摘录。

 Vector中的所有方法都是同步的,这样会降低运行速度,在多线程环境下要用到ArrayList方法synchronizedList(List<T> list)

 

 

附录

 

1散列表

2         散列表又称为哈希表。散列表算法的基本思想是:

  以结点的关键字为自变量,通过一定的函数关系(散列函数)计算出对应的函数值,以这个值作为该结点存储在散列表中的地址。

8         当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,所有元素存放到新的散列表中,原先的散列表将被删除。在Java语言中,通过负载因子(load factor)来决定何时对散列表进行再散列。例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,那么将进行再散列。

9         负载因子越高(越接近1.0),内存的使用效率越高,元素的寻找时间越长。负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多。

10     HashSet类的缺省负载因子是0.75

 

2数据结构

一般将数据结构分为两大类:线性数据结构和非线性数据结构。线性数据结构有线性表、栈、队列、串、数组和文件;非线性数据结构有树和图

 

1)线性表

1         线性表的逻辑结构是n个数据元素的有限序列:

              (a1, a2 ,a3,…an)

n为线性表的长度(n0)n=0的表称为空表。

3         数据元素呈线性关系。必存在唯一的称为第一个的数据元素;必存在唯一的称为最后一个的数据元素;除第一个元素外,每个元素都有且只有一个前驱元素; 除最后一个元素外,每个元素都有且只有一个后继元素。

4         所有数据元素在同一个线性表中必须是相同的数据类型。

5         线性表按其存储结构可分为顺序表和链表。用顺序存储结构存储的线性表称为顺序表;用链式存储结构存储的线性表称为链表

6         将线性表中的数据元素依次存放在某个存储区域中,所形成的表称为顺序表一维数组就是用顺序方式存储的线性表。

 

2)链表

1         单向链表

2         循环链表

3         双向循环链表

3)队列

 

2         队列(Queue)是限定所有的插入只能在表的一端进行,而所有的删除都在表的另一端进行的线性表。

3         表中允许插入的一端称为队尾(Rear),允许删除的一端称为队头(Front)

4         队列的操作是按先进先出(FIFO)的原则进行的。

5         队列的物理存储可以用顺序存储结构,也可以用链式存储结构。