您的位置:首页 > 移动开发 > Android开发

关于android开发中涉及到的java知识:集合类(二)

2014-11-29 21:29 423 查看
Java集合(二)

由于前几个星期很忙,所以好久没更,今天我将继续整理关于java类的知识,首先来看下set集合:

●set集合

set与前面的collection基本完全一样,只是它的行为略有不同。set只能加入不同的元素,对于两个相同的元素会添加失败。

set格式:Set students = new HashSet();

students.add(new String("haha"));

Set集合中有3个实现类:HashSet,TreeSet和EnumSet.

——>先来看下HashSet:

HashSet特点:

1.元素的排列顺序可能与添加次序不同。

2.多个线程访问一个HashSet并同时修改它时必须使用代码保证其同步性。

3.集合的元素值可以为null。

当向HashSet中存入一个元素时会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据其hashCode值决定该对象存储的位置,如果两个元素通过equal()方法比较返回true而hashCode()方法返回值不相等,那么HashSet会将它们存入不同的位置。

所以说HashSet判断两个元素相等的标准是看equal()和hashCode()方法返回值全部为true。

HashSet还有一个子类LinkedHashSet,它可以使得你输入的元素次序与存入元素次序相同,对HashSet有一定的完善作用。

——>我们再来看下TreeSet

TreeSet是SortedSet的接口实现类,它可以保证集合元素处在排序状态,他比HashSet多了以下几个方法:

1.Comparator comparator():如果TreeSet采用了定制排序则返回定制排序时使用的Comparator;如果采用自然排序则返回null。

2.Object first():返回集合中的第一个元素。

3.Object last():返回集合中的最后一个元素。

4.Object lower(Object e):返回集合中位于指定元素之前的元素。

5.Object higher(Object e):返回集合中位于指定元素之后的元素。

6.SortedSet subSet(Object fromElement,Object toElement):返回此Set的子集合,范围从fromElement(包含)到toElement(不包含)。

7.SortedSet headSet(Object toElement):返回此Set的子集,由小于toElement的元素组成。

8.SortedSet tailSet(Object fromElement):返回此Set的子集,大于或等于fromElement的元素组成。

注:TreeSet是根据元素的实际大小来进行排序的。

->自然排序

TreeSet会调用元素的compareTo(Object obj)方法来比较元素间的大小关系,然后对集合进行升序排列,这种方式就是自然排序。

注:向TreeSet中添加的应该是同一个类中的对象,否则会引起ClassCastEception异常。

对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过compare To(Object obj)方法是否返回0,若返回0,则相等。

->定制排序

想要实现定制排序,则需要在创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排列逻辑。

例:

class M

{

int age;

public M(int age)

{

this.age = age;

}

public String toString()

{

return "M[age:" + age + "]";

}

}

public class TreeSetTest4

{

public static void main(String[] args)

{

TreeSet ts = new TreeSet(new Comparator()

{

//根据M对象的age属性来决定大小

public int compare(Object o1, Object o2)

{

M m1 = (M)o1;

M m2 = (M)o2;

return m1.age > m2.age ? -1

: m1.age < m2.age ? 1 : 0;

}

});

ts.add(new M(5));

ts.add(new M(-3));

ts.add(new M(9));

System.out.println(ts);

}

}

——>现在让我们来看下EnumSet:

EnumSet是一个专为枚举类设计的集合类,它里面的所有元素都必须是指定枚举类型的枚举值。

EnumSet也是有序的,它以枚举值在Enum类内的定义顺序来决定集合元素的排序。

EnumSet在内部以位向量的形式储存,所以对象占用内存空间很小,而且运行效率高。但是它不能被加入null元素,如果加入会抛出NullPointerException异常。

EnumSet没有暴露任何构造器来创造实例,程序通过它提供的static方法创建EnumSet对象,例:

1.static EnumSet allOf(Class elementType):创建一个包含指定枚举类里的所有枚举值的EnumSet集合。

2.static EnumSet complementOf(EnumSet s):创建一个与指定EnumSet具有相同元素类型的EnumSet集合,新的EnumSet集合包含原来集合不包含的元素,两个集合加起来才是枚举类中所有的元素。

3.static EnumSet copyOf(Collection c):使用一个普通集合来创建EnumSet集合。

4.static EnumSet copyOf(EnumSet s):创建一个与指定EnumSet具有相同元素类型、相同集合元素的EnumSet集合。

5.static EnumSet noneOf(Class elementType):创建一个元素类型为指定枚举类型的空EnumSet。

6.static EnumSet of(E first,E...rest):创建一个包含一个或多个枚举值的EnumSet集合,传入的枚举值必须属于同一个枚举类。

7.static EnumSet rang(E from,E to):创建一个包含从from枚举值到to枚举值的范围内所有枚举值的EnumSet集合。

总结:如何选择HashSet和TreeSet?

一般来说HashSet比TreeSet性能要好,只有当需要一个保持排序的set时,才应该使用TreeSet。

LinkedHashSet比HashSet稍微慢一些,但遍历LinkedHashSet会更快。

EnumSet是所有Set类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。

Set集合是不安全的,可以通过Collection工具类的synchronizedSortedSet方法来包装set集合类。

例:

SortedSet s = Collection.synchronizedSortedSet(new TreeSet(...));

今天就到这,下次整理关于list集合的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: