10月6号-对象容器Set

本文深入探讨了Java集合框架中的核心接口Set与Map及其主要实现类,包括HashSet、LinkedHashSet、TreeSet、EnumSet以及HashMap等。通过具体示例介绍了它们的特点、应用场景及如何使用。

1.      HashSet

java.util.HashSet 实现java.util.Set 接口。 List 容器中的对象可以重复,但Set 容器中的对象都是唯一的,Set 容器有自己的排序规则。

 

HashSet 的排序方法是利用哈希法,所以加入HashSet 容器的对象还必须重新定义hashCode() 方法。HashSet 根据哈希码来确定对象在容器中存储的位置,也可以根据哈希码来快速找到容器中的对象。

在比较两个加入HashSet 容器中的对象是否相同时,会先比较hashCode() 方法返回值是否相同。如果相同在使用equals() 方法比较。

事实上在定义类时,最好总是重新定义equals()hashCode() 方法。

下面使用HashSet 的例子:

package hash;

 

import java.util.HashSet;

import java.util.Iterator;

import java.util.Scanner;

import java.util.Set;

 

public class HashSetDemo {

 

    public static void main(String[] args) {

       Set<String> set = new HashSet<String>();

 

       Scanner scanner = new Scanner(System. in );

 

       while ( true ) {

           System. out .println( " 请输入对象: " );

 

           String input = scanner.next();

           if (input.equals( "quit" )) {

              break ;

           }

           set.add(input);

       }

 

       Iterator iterator = set.iterator();

       while (iterator.hasNext()) {

           System. out .println(iterator.next() + " " );

       }

       System. out .println();

    }

 

}

 

在上面例子中你可以输入两个相同的字符串,也就是两个相同的对象。但是最后显示 HashSet 里面元素时只显示了一个,这就是 Set 容器的特性。另外迭代 HashSet 中所有的值,其顺序与加入容器的顺序是不一样的,迭代顺序是按照 HashSet 排序后的顺序。

如果想要在迭代的时候按照加入的顺序显示,则可以使用 java.util.LinkedHashSet. 它在内部是按照哈希码进行排序的,然后允许迭代时行为像 LinkedList 。如:

package hash;

 

import java.util.Iterator;

import java.util.LinkedHashSet;

import java.util.Set;

 

public class LinkedHashSetDemo {

 

    public static void main(String[] args) {

       Set<String> set = new LinkedHashSet<String>();

       set.add( "dengjie" );

       set.add( "liuzhongqiu" );

       set.add( "bailong" );

       set.add( "shensha" );

       Iterator iterator = set.iterator();

       while (iterator.hasNext()) {

           System. out .println(iterator.next() + " " );

       }

 

    }

 

}

 

2.      TreeSet

TreeSet 实现Set 接口与java.util.SortedSet 接口,SortedSet 提供相关方法让您有序的取出对应位置的对象,像first(),last() 方法。它使用红黑树结构来对加入的对象进行排序。

package hash;

 

import java.util.Iterator;

import java.util.Scanner;

import java.util.Set;

import java.util.TreeSet;

 

public class TreeSetDemo {

 

    public static void main(String[] args) {

       Set<String> set = new TreeSet<String>();

       Scanner scanner = new Scanner(System. in );

 

       while ( true ) {

           System. out .println( " 请输入对象: " );

           String input = scanner.next();

           if (input.equals( "quit" ))

              break ;

           set.add(input);

       }

 

       Iterator iterator = set.iterator();

       while (iterator.hasNext()) {

           System. out .println(iterator.next() + " " );

       }

       System. out .println();

 

    }

 

}

 

由于加入的是 String 对象,执行结果会自动按照字典顺序进行排序的动作。

 

3.    EnumSet

建立枚举类型的集合

package set;

 

import java.util.EnumSet;

import java.util.Iterator;

 

public class EnumSetDemo {

    enum FontConstant {

       Plain , Bold , Italic

    }

 

    public static void main(String[] args) {

       // 建立枚举值集合

       EnumSet<FontConstant> enumSet = EnumSet.of (FontConstant. Plain ,

              FontConstant. Bold );

       // 显示集合内容

       showEnumSet (enumSet);

       showEnumSet (EnumSet.complementOf (enumSet));

    }

 

    public static void showEnumSet(EnumSet<FontConstant> enumSet) {

       Iterator iterator = enumSet.iterator();

       while (iterator.hasNext()) {

           System. out .println(iterator.next() + " " );

       }

       System. out .println();

    }

 

}

上面例子可以指定枚举值加入 EnumSet 中,使用 of() 方法会返回一个 EnumSet 实例,其中包括所指定的枚举值。也可以使用 complementOf() 指定一个 EnumSet 的互补集。

因为 EnumSet 实现了 Set 接口,可以使用 Set 接口的方法来测试它所包括的枚举值 . 例如测试一个集合是否包括 FontConstant.Bold:

    if (enumSet.contains(FontConstant. Bold ))

       {

         System. out .println( " 包括 FontConstant.Bold" );

       }

       else

           System. out .println( " 不包括 FontConstant.Bold" );

下面是使用 Set 接口方法的 EnumSet

 

4.    Map

实现 java.util.Map 接口的对象会将键( Key )映射至值( Value ),值指的是要存入 Map 容器的对象。在将对象存入 Map 对象时,需要同时给定一个键,要取回时可以指定键,这样就可以取得与键对应的对象值。 Map 中的每一个键都是唯一的。 Map 有自己的排序规则。

 

4.1    HashMap

Map 的特性就是键值对应。就是说要取回一个对象需要一个键对应这个对象。 HashMap 内部实现的是哈希法。下面是例子:

package map;

 

import java.util.HashMap;

import java.util.Map;

 

public class HashMapDemo {

 

    public static void main(String[] args) {

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

 

       String key1 = "dengjie" ;

       String key2 = "bailong" ;

 

       map.put(key1 , "dengjie 的信息 " );

       map.put(key2, "bailong 的信息 " );

 

       System. out .println(map.get(key1 ));

       System. out .println(map.get(key 2));

    }

 

}

 

可以使用 values() 方法返回一个实现 Collection 的对象,其中包括所有的值对象。如果需要一次迭代 Map 中所有对象,这个会有用。如下:

package map;

 

import java.util.Collection;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

 

public class HashMapDemo2 {

 

    public static void main(String[] args) {

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

       map.put( "dengjie" , "dengjie 的信息 " );

       map.put( "bailong" , "bailong 的信息 " );

       map.put( "liuzhongqiu" , "liuzhongqiu 的信息 " );

       map.put( "shensha" , "shensha 的信息 " );

 

       Collection collection = map.values();

       Iterator iterator = collection.iterator();

       while (iterator.hasNext()) {

           System. out .println(iterator.next() + " " );

       }

       System. out .println();

    }

 

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值