java中的集合

来源:互联网 发布:双色球的算法和技术 编辑:程序博客网 时间:2024/06/07 19:26

======================================================
注:本文源代码点此下载
======================================================

1.集合的特点:

都位于 java.util包中,不能存放基本类型的数据,而只能存放对象的引用,操作的数目可以不固定(类似于动态数组)。

2.分类:

有三个类:

a.set(集):对象不按特定方式排序,没有重复元素。这个与数学中的集合概念最相似。

b.list(列表):按照索引位置排序,可以有重复元素,允许按照对象在集合中的索引位置检索对象。

c.map(映射):每一个元素包含一个键值对。没有重复的键值对,但是值对象可以重复。

有两个接口:

collection接口适用于java集合中的set和list(这两个类直接继承了这个接口),提供了一些通用操纵的静态方法。

iterator接口隐藏了底层集合的数据结构,对外提供了遍历各种数据类型集合的统一接口。由collection集合的iterator得到一个iterator。语法如下:

iterator it = set.iterator();

(注意此后若通过collection方法修改了集合则使用next()方法时会出现异常,因为其运用了所谓快速失败机制。避免了潜在的共享资源竞争而导致的并发问题)。

3.set集合:

主要有两个实现类:hashset和treeset。

前者使用哈希算法,存取速度快,它还有一个子类linkedhashset类,性能更高。hashset向集合中加入一个对象时,会调用对象的hashcode()方法得到哈希码,然后根据这个哈希码计算出对象在集合中的存放位置。

为了保证其能正常工作,要求当两个对象用equals()方法比较的结果为true时它们的哈希码也必须相同。这就要求我们如果在我们自己设计的类中覆盖了equals方法,那么也也应该覆盖hashcode()方法。用equals()方法比较的结果为false时,最好hashcode不同,减少哈希冲突,提高性能。

而后者则实现了sortedset接口,具有排序功能。由于用户属性变化不会导致重新排序,所以适合加入不可变类。向其中加入自定义的类时要注意,实现其comparable接口,并且euqals()得出的结论要与compareto()得出的结论相同。另外,它还支持comparator接口,可以定义一个实现了该接口的类customercomparator实现自定义的排序。在定义时使用如下的语法:

set set = new treeset(new customercomparator);

4.list列表:

主要特征是以线性方式存储,集合中可存放重复元素。thoughts works 公司的一个顾问曾拟文说在java 中强烈建议使用list替代所有的数组。在数组与list转换时使用aslist的方法。

主要有两个实现类:arraylist和linkedlist。

前者的特点是允许对元素进行快速随机访问,但插于和删除元素的速度较慢。一般用于代表可变数组。

后者的特点是采用链表数据结构,对顺序访问和删除、插入元素速度较快,但随机访问速度较慢。一般用于代表堆栈、队列和双向队列。

一个比较实用的接口是listiterator接口,使用listiterator方法返回得到,它继承了iterator接口,并且提供了专门操纵列表的方法。

arrays类的一个方法aslist()可以把一个数组包装成list对象,但此时这个list固定长度了,因为所有操作都会作用于底层数组。

以前还有一个叫做vector类,现在已经不提倡使用了。

性能上,java数组的随机访问和迭代操作速度最快,arraylist的随机访问速度也较快,而linkedlist则进行插入和删除操作有最快的速度。

因此尽量不要在list中进行迭代操作,而使用addall 或 removeall,传入包含要对其添加或移除元素的集合作为参数,将一个集合(特别是由数组转化而成的集合)的内容转移到另一个集合,或者从一个较大对象集合中移除一个较小对象集合,从而完成成员的增减。迭代可能会出现的问题如下:

每次添加或移除元素后重新调整集合将非常低效。

每次在获取锁、执行操作和释放锁的过程中,都存在潜在的并发困境。

当添加或移除元素时,存取集合的其他线程会引起竞争条件。

5.map映射:

每一个元素包含一个键值对,而且值对象还可以map映射类型,键对象不允许重复。

map的entryset()方法返回了一个set集合,这个集合存放了map.entry类型的元素,每个map.entry对象代表map中的一个键值对。而keyset()方法返回集合中所有键对象的集合。

主要有两个实现类:hashmap和treemap,与set的两个实现类特性和使用须知基本相同。

注意:永远不要将可变对象类型用作 hashmap 中的键,否则支持哈希码的键依赖于可变字段的内容,这样hashcode()容易改变,产生 bug。

6.使用的注意事项:

1)在泛型中可以使用类似set 表示只接受object类型及其子类型。或者set表示接受string类型和其父类型。

2)可以使用更简便的遍历方法以代替iterator,这个增强适用于实现 iterable 接口的任何对象,而不仅仅是 collections:

for(string element : set){

system.out.println(element);

}

3)set、list和map实现类都没有采取同步机制,要注意并发问题。

4)collections实用类,使用方法例如:collections.sort(list);直接调用(因为是静态的嘛),注意与collection接口区分。

5)list在移除一个成员时后一个其 “后面” 的各项会上升填补空位,这可能是与数组显著的不同吧。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击