网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  使用sets     
  文章作者:未知  文章来源:水木森林  
  查看:70次  录入:管理员--2007-11-17  
 
  set拥有与collection完全相同的接口,所以和两种不同的list不同,它没有什么额外的功能。相反,set完全就是一个collection,只是具有不同的行为(这是实例和多形性最理想的应用:用于表达不同的行为)。在这里,一个set只允许每个对象存在一个实例(正如大家以后会看到的那样,一个对象的“值”的构成是相当复杂的)。
  
使用sets


  set(接口) 添加到set的每个元素都必须是独一无二的;否则set就不会添加重复的元素。添加到set里的对象必须定义equals(),从而建立对象的唯一性。set拥有与collection完全相同的接口。一个set不能保证自己可按任何特定的顺序维持自己的元素
  hashset* 用于除非常小的以外的所有set。对象也必须定义hashcode()
  arrayset 由一个数组后推得到的set。面向非常小的set设计,特别是那些需要频繁创建和删除的。对于小set,与hashset相比,arrayset创建和反复所需付出的代价都要小得多。但随着set的增大,它的性能也会大打折扣。不需要hashcode()
  treeset 由一个“红黑树”后推得到的顺序set(注释⑦)。这样一来,我们就可以从一个set里提到一个顺序集合
  
  ⑦:直至本书写作的时候,treeset仍然只是宣布,尚未正式实现。所以这里没有提供使用treeset的例子。
  
  下面这个例子并没有列出用一个set能够做的全部事情,因为接口与collection是相同的,前例已经练习过了。相反,我们要例示的重点在于使一个set独一无二的行为:
  
  //: set1.java
  // things you can do with sets
  package c08.newcollections;
  import java.util.*;
  
  public class set1 {
   public static void testvisual(set a) {
  collection1.fill(a);
  collection1.fill(a);
  collection1.fill(a);
  collection1.print(a); // no duplicates!
  // add another set to this one:
  a.addall(a);
  a.add("one");
  a.add("one");
  a.add("one");
  collection1.print(a);
  // look something up:
  system.out.println("a.contains(/"one/"): " +
   a.contains("one"));
   }
   public static void main(string[] args) {
  testvisual(new hashset());
  testvisual(new treeset());
   }
  } ///:~
  
  重复的值被添加到set,但在打印的时候,我们会发现set只接受每个值的一个实例。
  运行这个程序时,会注意到由hashset维持的顺序与arrayset是不同的。这是由于它们采用了不同的方法来保存元素,以便它们以后的定位。arrayset保持着它们的顺序状态,而hashset使用一个散列函数,这是特别为快速检索设计的)。创建自己的类型时,一定要注意set需要通过一种方式来维持一种存储顺序,就象本章早些时候展示的“groundhog”(土拔鼠)例子那样。下面是一个例子:
  
  //: set2.java
  // putting your own type in a set
  package c08.newcollections;
  import java.util.*;
  
  class mytype implements comparable {
   private int i;
   public mytype(int n) { i = n; }
   public boolean equals(object o) {
  return
   (o instanceof mytype)
   && (i == ((mytype)o).i);
   }
   public int hashcode() { return i; }
   public string tostring() { return i + " "; }
   public int compareto(object o) {
  int i2 = ((mytype) o).i;
  return (i2 < i ? -1 : (i2 == i ? 0 : 1));
   }
  }
  
  public class set2 {
   public static set fill(set a, int size) {
  for(int i = 0; i < size; i++)
   a.add(new mytype(i));
  return a;
   }
   public static set fill(set a) {
  return fill(a, 10);
   }
   public static void test(set a) {
  fill(a);
  fill(a); // try to add duplicates
  fill(a);
  a.addall(fill(new treeset()));
  system.out.println(a);
   }
   public static void main(string[] args) {
  test(new hashset());
  test(new treeset());
   }
  } ///:~
  
  对equals()及hashcode()的定义遵照“groundhog”例子已经给出的形式。在两种情况下都必须定义一个equals()。但只有要把类置入一个hashset的前提下,才有必要使用hashcode()——这种情况是完全有可能的,因为通常应先选择作为一个set实现。
 
 
上一篇: 使用maps    下一篇: 使用lists
  相关文档
uddi4j v2 编程 11-17
java语言中class类对象实例的获取方法 11-16
在java程序中运行外部类文件 11-17
readall 方法 11-16
初学者编程十大好习惯 11-17
java热点--讨论ajax和ria走向离线 11-16
在 java 程序设计中处理 dom 异常 11-17
ajax技术:构建动态的java应用程序分析 11-16
java与xml(一)入门基础介绍 11-17
对于java开发人员必须遵从的十大基本法则 (1) 09-10
基于corba/web技术构建三层体系结构的应用 11-17
web编程防黑,遵循特定的web安全规范 11-17
实用技巧:.net框架类库中定时器类的使用 (1) 06-06
关于java组件开发:一个概念框架(组图) 11-17
浅谈java桌面应用程序开发 11-16
j2me学习笔记(3)—初次接触midlets 11-17
java对象序列化保存为xml文件的工具类 11-17
java模块游戏规则和界面设计(一) 11-17
java进阶:深入equals方法对象相等比较 11-16
java中的17种常用正则表达式归纳 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息