您的位置:首页 > 编程语言 > Java开发

Java集合框架

2016-03-30 21:54 246 查看
Collection是集合接口

|————Set子接口:无序,不允许重复。

|————List子接口:有序,可以有重复元素。

List(后缀):有序(存入和取出的顺序一致)列表,允许存放重复的元素;

ArrayList:数组实现,查询快,增删慢,线程不安全,轻量级;

LinkedList:链表实现,增删快,查询慢


注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:

    List list = Collections.synchronizedList(new LinkedList(...));

Vector:数组实现,线程安全,重量级
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.

Set(后缀):接口---实现类: HashSet、LinkedHashSet

无序集合,不允许存放重复的元素;允许使用null元素

判断元素的唯一性:

是通过对象的hashCode和equals方法来完成对象唯一性的。

如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。

如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。

如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

注意:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。

按照散列函数的定义,如果两个对象相 同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如 果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希
表的操作。



HashSet:

1、不能保证元素的排列顺序,顺序有可能发生变化



2、不是同步的

3、集合元素可以是null,但只能放入一个null

LinkedHashSet(当不希望集合中有重复值,并且希望按照元素的插入顺序进行迭代遍历时可采用此类。)

LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起
来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。

LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

TreeSet类

TreeSet保证集中的元素是有序的,有2种方法可以实现对象之间的可比较性:1,添加到TreeSet的对象实现了Comparable接口;2,给规则集的元素指定一个比较器(Comparator)

TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。

TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0

自然排序

自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。

Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。

obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。

定制排序

自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法

HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

TreeMap:它实现SortedMap 接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字,根据使用的构造方法不同,可能会按照键的类的自然顺序 进行排序(参见 Comparable),或者按照创建时所提供的比较器进行排序。

Hashtable:此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。

Properties::key和value都是String类型,用来读配置文件;

//此处要保证参数的顺序,采用LinkedHashMap.

Map<String, String> map = new LinkedHashMap<String,String>();

// 判断是从 "转帐、缴存、转出" 页面到成功页面的


Hash(前缀):是指该容器采用的是hash算法存储的,元素具有唯一性,需要覆盖hashcode和equals方法。

Link(前缀):表示该集合容器内部使用的是链表数据结构实现的,增删快,如LinkedList。

Array(前缀):表示该集合容器内部使用的是数组数据结构实现的,查询快,有角标,如ArrayList。

Tree(前缀):表示该集合容器内部使用的是红黑树存储的(是一种顺序存储,且没有重复元素的,平均性能很高效)如TreeSet;

如何判断元素的唯一性:

第一种:让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。

第二种:让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。将该类对象作为参数传递给TreeSet集合的构造函数。

集合使用技巧:

TreeSet:元素需要唯一且元素需要制定顺序。

HashSet:元素需要唯一但是元素不需要指定顺序。

LinkedList:元素不需要唯一但是增删频繁。

ArrayList:元素不需要唯一但是需要随机访问的。

Arrays类:提供了对数组排序,查找,比较,填充元素的各种静态方法。



Collections类(注意不是Collection):提供了许多静态的方法来管理集合,线性表



参考:
http://www.cnblogs.com/Terry-greener/archive/2011/12/02/2271707.html http://blog.csdn.net/softwave/article/details/4166598
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: