IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [ XJTUSE ]JAVA语言进阶知识——9.5 Set接口与Map接口 -> 正文阅读

[数据结构与算法][ XJTUSE ]JAVA语言进阶知识——9.5 Set接口与Map接口

9.5 Set接口与Map接口

9.5.1 Set接口

Set接口是Collection的子接口,适用于不允许出现重复的元素。放入Set的元素必须定义equals() 方法,以确保对象的唯一性。 与List 不同的是Set 中元素的次序不保持有序。Set接口以普通的散列表数据结构实现,用于存储键-值数据对,能提供快速的查找功能。每个对象都作为数据存放在散列表中,由类库负责维护散列表,把对象存储到合适的位置。

Set接口有一个子接口SortedSet,它提供了保证迭代器按照元素递增顺序遍历的方法,可以按照元素的自然顺序排序,或者按照创建有序集合时提供的比较器Comparator进行排序。比较器可用于对象排序程序中,但它不负责排序,只比较两个对象,把结果传递给排序
的方法,Set 接口的主要方法如表所示。
在这里插入图片描述
实现Set接口有以下三个主要具体类

HashSet :使用散列表结构存储元素,可以随机访问,通常用于快速检索。它不保证集合的迭代顺序,特别是不保证该顺序恒久不变,此类允许使用null元素。

TreeSet:使用树结构来存储元素,此类保证排序后的Set按照升序排列元素,比HashSet检索慢。它实现了SortedSet 接口,也就是加入了对象比较的方法,通过迭代集合中的对象,可以得到一个升序的对象集合。

LinkedHashSet :具有HashSet的查询速度,此实现与HashSet的不同之处在于,其内部使用链表维护元素的插入次序。此链表定义了迭代顺序,在使用迭代器遍历Set时,将按照元素插入集合中的顺序进行迭代。

下面举例说明三种Set的用途,它们都可以用来过滤重复元素。使用时首先实例化,然后把对象作为新元素添加到散列表中。

示例:将有重复元素的字符串添加到HashSet、TreeSet和LinkedHashSet集合中,在添加过程中,集合自动去掉重复的元素。

代码如下

public class SetTest {
    public static void main(String[] args) {
        //过滤重复元素,但是不保证元素的迭代次序
        String[] strArray = new String[]{"one","world","one","dream"};
        Set<String> s = new HashSet<String>();
        for (int i = 0; i <4 ; i++) {
            if(!s.add(strArray[i])){
                //添加strArray元素到集合s中
                System.out.println("Duplicate detected: "+strArray[i]);
            }
        }
        System.out.println(s.size()+" distinct words: "+s);

        //自动按照升序排列内容,并过滤重复元素
        TreeSet<String> treeSet = new TreeSet<>();
        treeSet.add("b");
        treeSet.add("a");
        treeSet.add("c");
        treeSet.add("d");
        treeSet.add("b");
        System.out.println("TreeSet:");
        System.out.println(treeSet);
        System.out.println("the first element is: "+treeSet.first());
        //返回第一个元素
        Iterator<String>iterator = treeSet.iterator();//迭代器
        while(iterator.hasNext()){
            System.out.println(iterator.next()+";");
        }

        //过滤重复元素,不保证元素的迭代次序
        LinkedHashSet<String> hashSet =new LinkedHashSet<>();
        hashSet.add("b");
        hashSet.add("a");
        hashSet.add("c");
        hashSet.add("d");
        hashSet.add("b");
        System.out.println("LinkedHashSet: ");
        System.out.println(hashSet);
        Iterator<String> iterator1 = hashSet.iterator();
        while(iterator1.hasNext()){
            System.out.println(iterator1.next()+";");
        }
    }
}

运行结果如下

Duplicate detected: one
3 distinct words: [world, dream, one]
TreeSet:
[a, b, c, d]
the first element is: a
a;
b;
c;
d;
LinkedHashSet: 
[b, a, c, d]
b;
a;
c;
d;

9.5.2 Map接口

Map提供了一个更通用的元素存储方法,Map接口是Map集合框架的根接口,它不属于Collection接口。Map集合类用于存储元素对(称为键-值对),其中每个键映射到一个值,而且不能有重复的键。每个键只能够映射到一个值,但是允许多个键映射到同一个值。这种键-值对的例子日常用到不少,如姓名与电话号码、书号和书名、宠物和主人等,Map 通常用于由某个对象查找另一类型对象。

几乎所有通用的Map都使用散列映射,这是一种将元素映射到数组的简单机制,通过散列函数将对象转换为一个适合内部数组的整数,期间会调用每个对象都包含的一个返回整数值的hashCode()方法,Map的常用方法如表所示
在这里插入图片描述
Map接口提供3种可能的视图,允许以键集、值集或键-值对集的形式查看某个映射的内容,或者要遍历的所有元素。以下是三种可能的视图:

●键-值对集:参见entrySet()。
●键集:参见keySet()。
●值集:参见values()。

键-值对集和键集两个视图均返回Set对象,值集视图返回Collection对象,若要遍历,则需要获得一个Iterator 对象。

Map接口的一个重要子接口SortedMap提供排序功能,凡是实现此接口的具体类都属于排序的子类,比如TreeMap就是SortedMap的子类,具备排序功能。SortedMap的常用方法如表所示。
在这里插入图片描述

Map中比较常用的具体类有HashMap、TreeMap、 LinkedHashMap,它们在效率、排序等方面各不相同。

HashMap:使用对象的hashCode()实现快速查找,允许存储null值和null键,该类既不保证映射的顺序,也不保证该顺序持久不变。HashMap不是线程安全的,即不适用于多线程同步;而HashTable是线程安全的,并且不允许null值,其余功能两者大致相同。

LinkedHashMap:类似于HashMap,但是它采用链表维护内部排列顺序,效率比HashMap慢一点, 在遍历时,取得键-值对的顺序遵循其插人顺序,或者使用最近最少使用(LRU)顺序

TreeMap:采用红黑树结构实现,根据其键的自然顺序排序,或者根据创建映射时提供的Comparator排序。TreeMap 是实现SortedMap接口的具体类。

示例 使用HashMap,将几个Product对象添加到HashMap中,ProductID 作为Map的键,其余类的代码不变。

代码如下

public class MapTest {
    public static void main(String[] args) {
        Product t1 = new Product(11,"lenovo");
        Product t2 = new Product(12,"dell");
        Product t3= new Product(13,"mac");
        Map<Integer,String> map = new HashMap<>();
        map.put(t1.getId(),t1.getName());
        map.put(t2.getId(),t2.getName());
        map.put(t3.getId(),t3.getName());

        Set<Integer> set = map.keySet();
        System.out.println("Map集合中所有元素是:");
        Iterator<Integer>it = set.iterator();
        while (it.hasNext()){
            Integer key = (Integer)it.next();
            String name = (String)map.get(key);
            System.out.println(key+"——"+name);
        }
        map.remove(11);//将id为"11"的对象从集合中删除
        System.out.println("Map集合执行删除操作以后所有元素是:");
        Iterator<Integer>iterator = set.iterator();
        while (iterator.hasNext()){
            Integer key = (Integer)iterator.next();
            String name = (String)map.get(key);
            System.out.println(key+"——"+name);
        }
    }
}

运行结果如下

Map集合中所有元素是:
11——lenovo
12——dell
13——mac
Map集合执行删除操作以后所有元素是:
12——dell
13——mac

Java集合框架中各种集合的使用方法总结如下:

1)Collection、List、 Set、 Map都是接口,不能实例化,只有实现它们的ArrayList、LinkedList、HashTable、 HashMap这些常用具体类才可被实例化。

2)在各种List集合中,LinkedList 适用于快速插人、删除元素,可用于构建栈Stack、队列Queue; ArrayList 适用于快速随机访问元素。最好的做法是以ArrayList作为默认选择

3)在各种Set中,HashSet 的插人、查找效率通常优于HashTree, 一旦需要产生一个经过排序的序列,则可选用TreeSet,因为它能够维护其内元素的排序状态。

4)在各种Map中,HashMap的用途最为广泛,可提供快速查找,TreeMap 适用于需要排序的序列。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:47:48  更:2021-09-04 17:49:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:21:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码