Java容器类小结

来源:互联网 发布:拓扑算法数学建模 编辑:程序博客网 时间:2024/05/20 08:23

容器类:

容器类分为两大类:Collection和Map。

Collection存放的是一组各自独立的对象;Map存放的是一群成对的键值对的映像。

 

List(Collection的子接口,一个有序可重复列表):

在集合中操纵的一定是对象,而不可能是简单类型数据,即使可以提供了相应的API也只是由容器自动转换成相对应的封装类型对象。

ArrayList和Vector的区别:

Vector是线程安全的,而ArrayList不是。Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。

当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

在ArrayList和Vector中,是用数组的形式来保存对象的,这种方式将对象放在连续的位置中,它的缺点是删除或者插入操作非常麻烦。

在JDK中还提供另外一种列表的实现,就是链接列表(LinkedList)。LinkedList将每个对象放在独立的空间中,而且在每个空间中还保存有下一个链接的索引,如果是双向链接列表,那么它还保存有上一个链接的索引。在Java中提供的是双向链接列表。LinkedList不支持快速随机访问。

Set

Set接口与List接口不同的地方在于,它表示的是不重复的对象集合。如果试图向Set中加入一个已经在它里面存在的对象,将不会成功。

比较常用的Set有HashSet和TreeSet类。

HashSet是一个无序的集,但是它能够快速地查找指定的对象,这是因为它采用了能够适应这个需求的散列码。在Object类中,有一个用于给对象产生散列码的方法hashCode(),它将会给每一个对象产生一个int型的数据作为散列码,理想情况下,如果对象不是同一个对象,它们的散列码不会相同。

除了HashSet,在Set的实现类中,还有一个比较典型的Set实现,就是TreeSet。TreeSet是一个有序无重复的集。我们可以用任何的顺序向TreeSet中加入对象,但是当使用iterator()方法进行遍历时,我们可以得到一个有序的结果。

如果我们往TreeSet集中插入相互之间不能进行比较的对象,那么将会发生ClassCastException异常。所以,在TreeSet中,只能用于保存可以相互进行比较大小的对象。现在的问题是,如何让自定义的类的对象可以比较?答案是,让你的类实现Comparable接口,并且实现这个接口的唯一方法compareTo(),它接受一个Object对象,可以在这个方法中定义对象的排序规则,它应该返回一个整数值,根据这个值的是大于0、小于0还是等于0确定两个对象的排序。

HashSet和TreeSet的区别:

HashSet底层用的是哈希表,TreeSet采用的数据结构是红黑树。HashSet是通过HashMap实现的,实现不add相同的元素。TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key。 

public class Person implements Comparable{private String ID;public Person(String ID){this.ID = ID;}public boolean equals(Object obj){if(obj == null) return false;if(this == obj) return true;if(this.getClass() != obj.getClass()) return false;Person c = (Person)obj;return this.ID.equals(c.ID);}public int hashCode(){return this.ID.hashCode();}public String toString(){return this.ID;}public String getID(){return this.ID;}public int compareTo(Object other){Person c = (Person)other;return ID.compareTo(c.getID());}}


Map:

Map用于存储元素对,一个映射不能包含重复的键,每个键最多只能映射一个值,在Map中键和值的保存顺序不是它们的插入顺序。

Map用put(key, value)方法来添加一个值,用get(key)方法获取与key键相关联的值。

Map接口的keySet()方法返回一个Set,因为Map中的key是不可重复的,所以得到所有key的keySet()方法返回一个Set对象,values()方法返回一个值的集合。

HashMap是Java为Map提供的实现类。HashMap是Map基于散列表的实现,基本实现了Map接口的全部方法并对速度进行了优化,是查询效率最高的Map。

TreeMap:

TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。TreeMap的基本操作 containsKey、get、put和 remove 的时间复杂度是 log(n) 。


Collections类的一些静态方法:

Collection.sort(list)排序;

Collection.Shuffle(list)随机序列;

Collection.Reverse(list)反转序列;

Collection.copy(newlist, srclist)复制序列。


原创粉丝点击