`

java中的类集之Set

阅读更多

         java容器中有三个接口:Iterator、collection、map这三个接口是java所有容器类的最大父接口。

         collection的子接口主要有list、set、queue;

                list的实现类主要有:ArrayList、LinkedList、Vector、Stack

                set的实现类主要有:HashSet、TreeSet、LinkedHashSet

                queue的主要实现类有:PriorityQueue

          Map接口的主要实现类有:HashMap、HashTable、TreeMap

 

1.Iterator接口的用法:

         Iterator接口主要用来遍历Collection集合中的元素,Iterator对象也被称为迭代器。Iterator接口隐藏了各种Collecton实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口。当使用Iterator仅仅用于collection集合的输出,它没有盛装对象的能力,因此不能利用它来操作collection对象。

输出集合元素的代码(Iterator、foreache两种方式):

package com.shine.container;
import java.util.*;
public class IteratorDemo_01 {
    public static void main(String[] args){
        Collection books = new HashSet();
        books.add("语文");
        books.add("数学");
        books.add("英语");
        //用Iterator输出集合
        Iterator it = books.iterator();
        while(it.hasNext()){
            String book = (String)it.next();
            if(book.equals("语文")){
                it.remove();     //a
                //books.remove(book);//把a语句换成该语句会报错
            }
            book="测试字符串";
        }
        System.out.println(books);
       //使用foreach输出集合
        for(Object obj : books){
            String book = (String)obj;
            System.out.println(book);
            if(book.equals("数学"))
                books.remove(book);
        }
        System.out.println(books);
    }
}
2.Set和HashSet

       Set:Set集合中不允许有重复元素。set集合判断重复元素是根据equals()方法来判断的,只要equals方法 

              的返回值是false都能够成功的添加到set集合中,如果结果返回的是true则会抛出异常且添加失败。

       HashSet:HashSet中的元素不能保证其排列顺序,顺序有可能发生变化。HashSet不是同步的,如果多个

               线程同时访问一个HashSet则必须通过代码来保证其同步。HashSet判断两个元素是否相等是通过

               equals方法返回ture并且两个对象的hashCode()方法的返回值也相同。

   测试代码:

   package com.shine.container;

import java.util.HashSet;

//person类的equals方法的返回值为true,没有重写hashCode方法
class Person{
    public boolean equals(Object obj){
        return true;
    }
}
//person2类的hashCode方法的返回值为1,没有重写equals方法
class Person2{
    public int hashCode(){
        return 1;
    }
}
//类person3的hashCode方法的返回值为2,并且重写了equals方法
class Person3{
    public boolean equals(Object obj){
        return true;
    }
    public int hashCode(){
        return 2;
    }
}
public class HashSetDemo_01 {
    public static void main(String[] args) {
        HashSet persons = new HashSet();
        persons.add(new Person());
        persons.add(new Person());
       
        persons.add(new Person2());
        persons.add(new Person2());
       
        persons.add(new Person3());
        persons.add(new Person3());
       
        System.out.println(persons);

    }
}
    运行结果:[com.shine.container.Person2@1, com.shine.container.Person2@1,   

                      com.shine.container.Person3@2, com.shine.container.Person@22adc446,

                     com.shine.container.Person@3e30e173]

    只有person3的第二个对象没有添加进去。

    所以,当我们把一个对象放到HashSet中时,应该重写这个对象实现类的equals和hashCode方法。

    hashCode()方法的重要性:当程序向HashSet集合中添加元素时,HashSet会根据该元素的hashCode()值

    来计算它的存储位置。也就是说,每个元素的hashCode()值可以决定它的存储索引。HashSet采用元素的

    hashCode()值来计算其索引,从而可以自由增加HashSet的长度,并可以根据元素的hashCode()值来访问

    元素。这也是HashSet速度快的原因。

 

LinkedHashSet:

           LinkedHashSet是HashSet的一个子类,它也是根据元素的HashSet值来决定元素的存储位置的,它同

     时使用链表来维护元素的顺序。

           LinkedHashSet记录了元素的添加顺序,它依然不允许内部有重复元素。

TreeSet

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

          TreeSet采用红黑树的数据结构来存储 集合元素。TreeSet支持两种 排序方法:自然排序和定制排序。

     1.自然排序:

               TreeSet会调用集合元素的compareTo(0bject obj)方法来比较元素之间的大小关系,然后将集合元

          素按升序排列,这种方式就是自然排序。

               java中有一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一

           个整数值,实现该接口的类必须实现该方法,实现了该接口的对象就可以比价大小。java中的一些常

            用类已经实现了Comparable接口,并且提供了比较大小的标准。下面是这些常用类:

                  BigDecimal、BigInteger以及所有的数值型对应的包装类:按他们对应的数值大小进行比较。

                  Character:按字符的UNICODE值进行比较。

                  Boolean:true对应的包装类实例大于false对应的包装类实例。

                  String:按字符串中的UNICODE值进行比较。

                  Date、Time:后面的时间、日期比前面的时间、日期大。

             如果试图把一个对象添加到TreeSet中,则该对象必须实现Comparable接口,否则程序将会抛出异

             常。

      2.定制排序:

              TreeSet的自然排序是根据集合元素的大小,TreeSet将它们以升序排列。如果需要实现定制排序,

           则需要Comparator接口的帮助。该接口里有一个int compare(T o1,T o2)方法。

              如果需要定制排序,则需要在创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合

           关联,由该Comaprator对象负责集合元素的排序逻辑。

       

 

            当通过Comparator对象来实现TreeSet的定制排序时,依然不可以向TreeSet中添加类型不同的对

       象,否则会引发ClassCastException异常。使用定制排序时,TreeSet对集合元素排序不管集合元素本身

       的大小,而是由Comparator对象负责集合元素的排序规则。TreeSet判断两个元素相等的标准是:通过

       Comparator比较两个元素返回了0,这样TreeSet不会把第二个元素添加到集合中。

 

总结:

       HashSet的性能总是比TreeSet好,因为TreeSet需要额外的红黑树来维护集合元素的次序。只有当需要一个排序的Set时才使用TreeSet。

       对于HashSet的子类LinkedHashSet普通的插入删除操作,LinkedHashSet的速度比HashSet慢,这是由于维护链表的额外开销造成的。不过,因为有了链表,遍历LinkedHashSet会更快。

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

       Set的三个实现类HashSet、TreeSet和EnumSet都不是线程安全的。通常可以通过Collections工具类的synchronizedSortedSet方法“包装"该Set集合。此操作最好在创建时进行,以防止对Set集合的意外非同步访问。

 

 

 

  • 大小: 24 KB
  • 大小: 7.4 KB
分享到:
评论

相关推荐

    java 运用集的相关类(Set)

    java 运用集的相关类(Set) java 运用集的相关类(Set) java 运用集的相关类(Set)

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该...

    set类计算大学所有同学学分绩

    java set 学分绩 java set 学分绩 java set 学分绩 java set 学分绩 java set 学分绩 java set 学分绩 java set 学分绩 java set 学分绩 java set 学分绩 java set 学分绩 java set 学分绩 java set 学分绩 java set...

    用java实现画曼德勃罗集(Mandelbrot Set)及朱莉亚集(Julia Set)

    用java实现画曼德勃罗集(Mandelbrot Set)及朱莉亚集(Julia Set)图像

    Java类集集合框架

    List接口,Set接口,Map接口,Iterator接口,Comparator

    Java期末复习-类集框架

    Java类集框架 最大单值操作父接口Collection及其子接口、子类: List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、HashSet类、TreeSet类、SortedSet接口 双值操作...

    java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK

    java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK ……

    Java面试题合集最新版2024.zip

    集合框架:熟悉Java集合框架中的List、Set、Map等接口及其实现类,如ArrayList、HashSet、HashMap等。 泛型:理解泛型的概念及其在Java中的应用,如泛型类和泛型方法。 并发编程:了解Java中的线程、同步、锁等机制...

    Java集合容器集合框架Set集(与“集合”有关文档共23张).pptx

    Java集合容器集合框架Set集(与“集合”有关文档共23张).pptx

    java实现接口返回数据实体类属性大写变成小写

    所以,没办法, 还得是去看响应实体中是否有问题,这时候我发现了我的实体类生成get/set方法用的是lombok框架的@Data注解生成! 定位到问题 上面我们说了用的是lombok框架生成我们的get/set方法 查看我们的编译...

    java中集合容器的详细介绍

    在常见用法中,集合(collection)和数学上直观的集(set)的概念是相同的。集是一个唯一项组,也就是说组中没有重复项。实际上,“集合框架”包含了一个 Set 接口和许多具体的 Set 类。但正式的集概念却比 Java ...

    java面试宝典

    42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...

    JAVA面试题最全集

    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

    JAVA核心知识点整理.zip

    集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。 Collection:Collection 是集合 List、Set、Queue 的最基本的接口。 Iterator:迭代器,可以通过迭代器遍历集合中的...

    Java开发详解.zip

    031304_【第13章:Java类集】_Set接口笔记.pdf 031305_【第13章:Java类集】_排序及重复元素说明笔记.pdf 031306_【第13章:Java类集】_SortedSet接口笔记.pdf 031307_【第13章:Java类集】_Iterator接口笔记.pdf ...

    JAVA类集代码!!!!!!!

    JAVA类集代码!非常详细,包括list set map hashmap arraylist等。有利于对接口connection的学习!!

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

    java_character-set.rar_java Character

    java编写的关于字符集的程序,对于理解不同字符集在web程序中有不同的表现有直观的印象。

    java网管技术snmp协议技术

    在SNMP中,SNMP管理模型包含四个组成部分: 1)SNMP NMS:SNMP管理站,利用SNMP协议对网络设备进行管理和监控的系统;...SNMP MIB可以分为两大类,一类称之为组如下图的system组,有查询、修改操作,

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler)...

Global site tag (gtag.js) - Google Analytics