集合学习笔记(一)

来源:互联网 发布:西部数码域名查询 编辑:程序博客网 时间:2024/05/22 06:46

  Java的集合类主要由两个接口派生而出Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。


Collection

Collection接口是List,set和Queue接口的父接口,该接口里定义的方法既可以用于操作Set集合,也可以用于操作List和Queue集合。Collection接口里定义了如下操作集合元素的方法,

boolean add(Object o)

boolean addAll(Collection c)

void clear()

boolean contains(Object o)

bloolean containsAll(Collection c)

blooean isEmpty()

Iterator iterator()

blooean remove(Object o)

blooean removeAll(Collection c)

blooean retainAll(Collection c)

int size()

Object[] toArray()

集合类就像容器,现实生活中的容器,无非就是添加对象,清空对象,判断容器是否为空等。

package com.lqf.collection;import java.util.ArrayList;import java.util.Collection;import java.util.HashSet;public class CollectionTest {Collection collection=new ArrayList();//添加元素collection.add("student1");//虽然集合里不能放基本类型的值,但Java支持自动装箱collection.add(1);System.out.println("collection集合的元素个数为:"+collection.size());//删除元素collection.remove(1);System.out.println("collection集合的元素个数为:"+collection.size());//判断是否包含指定字符串System.out.println("collection集合是否包含student1"+collection.contains("student1"));collection.add("集合学习");System.out.println("collection集合的元素:"+collection);Collection books=new HashSet();books.add("java编程思想");books.add("java核心技术");books.add("EffectiveJava");System.out.println("collection是否包含books集合"+collection.containAll(books));//用collection集合减去books集合里的元素collection.removeAll(books);System.out.println("collection集合的元素"+collection);//删除collection集合里的所有元素c.clear();System.out.println("collection集合的元素:"+collection);//控制books集合里只剩下collection也包含的元素books.retainAll(collection);System.out.println("books集合的元素:"+books);}

Set集合

set集合不能包含相同的元素。set集合与Collection基本相同,没有提供任何额外的方法。实际上Set就是Collection,只是行为略有不同(Set不能包含重复元素)。

HashSet类

HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。

HashSet具有以下特点

1 不能保证元素的排列顺序

2 HashSet不是同步的,如果多个线程同时访问一个HashSet,假设有两个或者有两个以上的线程同时修改了HashSet集合时,则必须通过代码来保证其同步

3 集合元素值可以是null


//类A的equals()方法总是返回true,但没有重写其hashCode()方法    class A {    public boolean equals(Object object) {    return true;    }    }   //    class B{    public int hashCode(){    return 1;    }    }    //    class C{    public int hashCode(){    return 2;    }    public boolean equals(Object object){    return true;    }    }        public class HashSetTest{    public static void main(String[] args){    HashSet books=new HashSet();    books.add(new A());    books.add(new A());    books.add(new B());    books.add(new B());    books.add(new C());    books.add(new C());        System.out.println(books);    }    }

LinkedHashSet类

HashSet还有一个子类LinkedHashSet,LinkedHashSet集合也是根据元素的hashcode值来决定元素的存储位置,但它同时链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历LinkHashSet集合里的元素时,LinkEdHashSet将会按元素的添加顺序来访问集合里的元素。

LinkHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问set里的全部元素时将有较好的性能,因为它以链表来维护内部顺序。

package com.lqf.collection;import java.util.LinkedHashSet;public class LinkedHashSetTest {public static void main(String[] args) {LinkedHashSet books=new LinkedHashSet();books.add("java编程思想");books.add("java核心技术");books.add("EffectiveJava");System.out.println(books);//删除 “Effective Java”books.remove("EffectiveJave");//重新添加“EffectiveJava"books.add("EffectiveJava");System.out.println(books);}}

输出LInkedHashSet集合的元素时,元素的顺序总与添加顺序一致。

LinkHashSet依然是HashSet,因此它依然不容许集合元素重复。


TreeSet类

TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保元素处于排序状态。与HashSet集合相比,TreeSet还提供了几个额外方法。

Comparator comparator()

Object first()

Object last()

Object lower()

        Object higher()

SortedSet subSet(Object fromElement,Object toElement)

SortedSet headSet(Object toElement)

SortedSet tailSet(Object fromElement)

增加了访问第一个,前一个,后一个,最后一个元素的方法,并提供了三个从TreeSet中截取子TreeSet的方法。

package com.lqf.collection;import java.util.TreeSet;public class TreeSetTest {public static void main(String[] args) {TreeSet nums=new TreeSet();//向TreeSet中添加四个Integer对象nums.add(1);nums.add(2);nums.add(4);nums.add(3);nums.add(5);//输出集合元素,看到集合元素已经处于排序状态System.out.println(nums);//输出集合里的第一个元素System.out.println(nums.first());//输出集合里的最后一个元素System.out.println(nums.last());//返回小于4的子集不包含4System.out.println(nums.headSet(4));//返回大于5的子集,如果Set中包含5,子集中还包括5System.out.println(nums.tailSet(5));//返回大于等于-3,小于4的子集System.out.println(nums.subSet(2, 4));}}

TreeSet并不是根据元素的插入顺序进行排序的,而是根据元素实际值的大小来进行排序的。TreeSet采用红黑树的数据结构来存储集合元素。TreeSet支持两种排序方法:自然排序和定制排序,在默认情况下,treeSet采用自然排序



1 0