集合类的相关知识

SET集合类似一个罐子,一旦把对象丢进SET集合,集合里多个对象之间没有明显的顺序。SET集合里面不允许包含相同的元素,如果试图把两个相同元素加入到一个SET中,则添加操作失败,ADD方法返回FALSE,且新元素不会被加入。

      SET集合判断两个对象是不是相同是根据EQUALS方法,也就是说两个对象的EQUALS方法比较返回TRUE,SET集合是不会接受这两个对象。

例如:

public static void main(String[] args) {
   Set books = new HashSet();
   books.add(new String("Struts2"));
   boolean result = books.add(new String("Struts2"));
   System.out.println(result);
   System.out.println(books);

 }

结果:

false
[Struts2]

 

HashSet特点:

1.不能保证元素的排列顺序,顺序可能变化。

2.HASHSET不是同步的,如果多个线程同时访问,要用代码来保证同步。

3.集合元素可以为NULL。

 

HASHSET和SET接口有不同的是,他判断两个元素相等的标准时两个对象通过EQUALS方法比较相等,并且两个对象的hashcode方法返回值也相等。

 

public class A {

 public boolean equals(Object obj)
 {
  return true;
 }
}

 

package com.action;

public class B {

 public int hashCode()
 {
  return 1;
 }
}

 

public class C {

 public boolean equals(Object obj)
 {
  return true;
 }
 
 public int hashCode()
 {
  return 2;
 }
}

 

public static void main(String[] args) {
   Set 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);
 }

结果:

[com.action.C@2, com.action.A@d9f9c3, com.action.B@1, com.action.B@1, com.action.A@757aef]

 

可以看到,向集合中分别添加了2个A,2个B,2个C,其中C重写equals方法,并且返回TRUE,HAHSCODE方法总是返回2,导致HASHSET将会把2个C对象当成一个对象。而A和B只满足了HASHSET判断对象相同条件的一种,所以如果需要把一个对象放入HASHSET中,如果重写该对象的EQUALS方法,也必须重写该类的HASHCODE方法,规则是2个对象通过EQUALS方法比较返回TRUE,这两个对象的HASHCODE也应该相同。

 

当向HASHSET中添加可变对象时,必须十分小心,如果修改HASHSET集合中的对象,有可能导致对象与集合中的其他对象相等,从而导致HASHSET无法准确访问对象。

 

LINKEDHASHSET是HASHSET集合的子类,但是他需要维护元素的插入顺序,性能略低于HASHSET的性能,但在迭代访问SET元素时,性能比较好。

 

TreeSet是SortedSet接口的惟一实现,可以确保集合元素处于排序状态。

 

 

TreeSet,不是根据元素的插入顺序进行排序,而是根据元素的实际值来进行排序的。TreeSet采用红黑树数据结构对元素进行排序,支持两种排序方式,自然排序,和定制排序。默认情况次采用自然排序。(调用集合元素的compareTo方法来比较两个元素的大小,然后按照集合元素升序排列)

试图把一个对象添加进TREESET中,该对象必须实现Comparable接口,否则会抛出异常。因为TreeSet会调用他集合中的compareTo方法与集合中的其他元素进行比较。

判断加入到其中的对象相等的原则:两个对象通过equals比较返回false,通过compareTo比较返回0.

例如:

package com.action;

public class A implements Comparable{

 public boolean equals(Object obj)
 {
  return true;
 }

 public int compareTo(Object obj) {
  // TODO Auto-generated method stub
  return 1;
 }
}

 

public static void main(String[] args) {
   Set books = new TreeSet();
   books.add(new A());
   books.add(new A());
   System.out.println(books);
 }

 

打印结果:[com.action.A@757aef, com.action.A@d9f9c3]

 

因为Aequals返回true,compareTo返回1,不满足是同一对象条件,所以保存的是两个对象。

 

注释:在HashSet和TreeSet集合中只放入不可变对象。如果放入可变对象,当可变对象的属性被修改的时候,容易出错。

 

 List判断两个对象相等只要通过equals方法比较返回TRUE即可。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值