Java——Set 集合

  Set集合,它类似于一个罐子,程序可以依次把多个对象 “丢进” Set 集合,而 Set 集合通常不能记住元素的添加的顺序,也就是说Set 集合是无序的。Set 集合与 Colleaction 基本相同,没有提供额外的方法,实际上 Set 就是 Collection,只是行为略有不同(Set 不允许包含重复元素)。

》HashSet 

  HashSet 类是 Set 接口的典型实现类,大多数时候使用 Set 集合时就是使用这个实现类。HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。

  HashSet 具有以下特点:

  》不能保证元素的排列顺序,顺序可能和添加的顺序不同,顺序也有可能发生变化。

  》HashSetf不是同步的,如果多个线程同时来访问一个 HashSet,假设有两个或者两个以上线程同时修改了HashSet 集合时,则必须通过代码来保证其同步。

  》集合元素值可以是 null。

public static void main(String[] args) {

        Dog ououDog=new Dog("欧欧","雪纳瑞");
        Dog yayaDog=new Dog("亚亚","拉布拉多");
        Dog meimeiDog=new Dog("美美","雪纳瑞");
        Dog feifeiDog=new Dog("菲菲","拉布拉多");

        Set dogs = new HashSet();
        //添加元素
        dogs.add(ououDog);
        dogs.add(yayaDog);
        dogs.add(meimeiDog);
        dogs.add(feifeiDog);   

        //遍历集合中的元素
        for (Object item : dogs) {
            Dog dog=(Dog)item;
            System.out.println(dog.getName());
        }

        System.out.println(dogs.size());    //查看长度

        System.out.println(dogs.isEmpty());  //为空返回 true ,否则返回 false

        System.out.println(dogs.contains(feifeiDog));  //指定元素存在返回 true,否则返回false

        dogs.remove(feifeiDog);  //删除指定元素

        dogs.clear();   //清空集合当中的所有元素

    }

 》LinkedHashSet 

  HashSet 还有子类 LinkedHashSet, LinkedHashSet 集合也是根据元素的 hashCode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历 LinkedHashSet 将会按照添加元素顺序来访问集合里的元素。

  LinkedHashSet 需要维护元素的插入顺序,因此性能略低于 HashSet 的性能,但在迭代访问 Set 里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。虽然 LinkedHashSet 使用了链表记录集合元素的添加顺序,但 LinkedhasHSet依然是 HashSet,因此它依然不允许集合元素重复。

public static void main(String[] args) {

        Dog ououDog=new Dog("欧欧","雪纳瑞");
        Dog yayaDog=new Dog("亚亚","拉布拉多");
        Dog meimeiDog=new Dog("美美","雪纳瑞");
        Dog feifeiDog=new Dog("菲菲","拉布拉多");

        Set dogs=new LinkedHashSet();

        dogs.add(ououDog);
        dogs.add(yayaDog);
        dogs.add(meimeiDog);
        dogs.add(feifeiDog);   

        for (Object item : dogs) {
            Dog dog=(Dog)item;
            System.out.println(dog.getName());
        }

    }

》TreeSet 

  TreeSet 是 SortedSet 接口的实现类,正如 SortedSet 名字所暗示的,TreeSet 可以确保集合元素处于排序状态。与HashSet 相比,TreeSet 还提供了几个额外的方法。

public static void main(String[] args) {

        TreeSet nums=new TreeSet();

        nums.add(5);
        nums.add(2);
        nums.add(10);
        nums.add(-9);
        nums.add(15);

        //自动排序    从小到大
        System.out.println(nums);   //输出 [-9, 2, 5, 10, 15]

        //输出集合元素的一个元素
        System.out.println(nums.first());    //输出 -9

        //输出集合元素的最后一个元素
        System.out.println(nums.last());     //输出 15

        //返回小于 4 的子集,不包含 4
        System.out.println(nums.headSet(4)); //输出[-9, 2]

        //返回大于 5 的子集,子集中还包含5
        System.out.println(nums.tailSet(5)); //输出[5, 10, 15]

        //返回大于等于-3 、小于4的子集
        System.out.println(nums.subSet(-3, 4));  //输出[2]

        //返回小于指定元素 的最大元素,指定元素不需要非得是TreeSet集合里的元素
        System.out.println(nums.lower(11));

        //返回大于指定元素的最小元素
        System.out.println(nums.higher(3));

        //如果 TreeSet 采用了定制排序,则该方法返回定制排序所使用的 Comparator;如果采用自然排序,则返回 null
        System.out.println(nums.comparator());
    }

》各 Set 实现类的性能分析

  HashSet 和 TreeSet 是 Set 的两个典型实现,到底如何选择 HashSet 和 TreeSet 呢?HashSet 的性能总是比 TreeSet 好(特比是常用的添加 、查询元素等操作),因为 TreeSet 需要额外的红黑树算法来维护集合元素的次序,只有当需要一个保持排序的 Set 时,才应该使用 TreeSet ,否则都应该使用 HashSet 。

  HashSet 还有一个子类 : LinkedHashSet ,对于普通的插入、删除操作,LinkedHashSet 比 HashSet 要略微慢一点,这是由于维护链表所带来的额外开销造成的,但由于有了链表,遍历 LinkedHashSet 会更块。

时间: 2024-10-24 02:06:59

Java——Set 集合的相关文章

六:Java之集合

集合包含的内容很多,我发现一个很好的博客,感觉自己都没有写的必要了! 链接献上  Java集合 六:Java之集合,布布扣,bubuko.com

Java复习-集合

Java的集合大致分为以下几类 map set list queue set代表无序,不可重复的集合 list代表有序,重复的集合 map代表了映射关系的集合 queue代表的是一种队列集合 从上面的图我们可以看出,访问set集合的时候我们只能根据元素本身来访问,访问list集合的时候可以直接根据元素的索引来访问,如果访问map集合中的元素,可以根据每项的key值访问元素,collection是list map queue的父接口,该接口里定义的方法,可以操作set map queue pack

java的集合框架之一

java是一套很成熟的东西,很多商用的东西都喜欢用它,用的人多,稳定.不过一般也不怎么说起它,因为太常见了,私下里说,写java应用层得就像农民工,每一处都是搭积木,根据设计师的东西如何优雅地搭好积木,当然美其名曰,论农民工搭积木的艺术修养.不难,但是东西很多,经验在里面是一个相当重要的东西.以上纯属每天扯淡,笑看即可,毕竟我目前就是个渣java程序员. java的集合框架以collection接口当作基础,这个接口定义了基本框架,包括size.hashcode.iterator.add.add

【Java】集合_学习笔记

一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.util.concurrrent.(utility的缩写,意为多用途的,实用的) 4.集合只能保存对象(实际是对象的引用,习惯称对象). 5.Java的集合主要由Collection和Map两个接口派生而出,Map接口的实现类用于保存关联数组,Set集合元素不可重复,通过元素本身访问,Map集合可以通过

Java基础——集合(三)——泛型、增强for、工具类

         接上篇,<Java基础--集合(二)--迭代器.Map集合> 六.泛型 (1)定义: 泛型是一种把明确类型的工作放在了创建对象或者调用方法时候才去明确的特殊的类型. (2)格式: <数据类型> ArrayList<String> aList=new ArrayList<String>(); <String> 即表示的是泛型 (3)好处:(掌握) A:解决了黄色警告线问题 B:把运行期间的转换异常给提前到了编译期间 C:优化了程序

Java中集合与数组的切换

在Java开发中常常遇见集合与数组的互相切换,如何实现呢,呵呵呵,很简单: import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class Test { /** * 将Set集合转换为数组 * * @author GaoHuanjie */ private static void setT

java之集合概述

集合也称容器:从大的类别分成两类:Collection和Map,也即:单列和双列列表. java编程思想中一张图说明该体系的整体结构:其中黑色着重的类是经常使用的类. 1 Collection Collection:作为单列集合的根接口.该类集合的继承体系如下: Collection分为两大类:List和Set 1)List: 特点:有序的 collection(也称为序列):列表通常允许重复的元素.       List 接口提供了特殊的迭代器,称为 ListIterator,除了允许 Ite

java初识集合(list,set,map)

java的集合有三类:list,set,map.list和set继承了collection接口.区别(list可以添加重复对象,且按照索引位置排序:set没有这两种特点). map是通过key操作里面的value,操作的是成对的对象.put放入对象,get取出对象. 另外:colletion没有随机访问的get()方法,因为collection还包括set,而set有自己的内部顺序.所以,要检查collection元素,必须使用iterator对象. 1.list中有ArrayList(类似数组

谈谈Java的集合组件

让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合组件:Set(集).List(列表).Map(映射). Collection接口:Collection是最基本的集合接口,声明了适用于Java集合的通用方法.Set和List都继承了Collection,Map. Collection接口的方法: boolean add(Object o):向集合中

Java基础——集合(二)——迭代器、Map集合

接上篇,<Java基础--集合(一)--集合体系和Collection> 四.迭代器的使用 使用步骤: 1.通过集合对象获取迭代器对象. 2.通过迭代器对象判断. 3.通过迭代器对象获取. 迭代器原理 由于多种集合的数据结构不同,所以存储方式不同,所以,取出方式也不同. 这个时候,我们就把判断和获取功能定义在了一个接口中,将来,遍历哪种集合的时候,只要该集合内部实现这个接口即可. 迭代器源码 public interface Iterator { publicabstract boolean