Java常用集合之Set和Map的用法详解

目录
  • 常用Set集合
    • Set集合的特点
    • HashSet
    • 创建对象
    • 常用方法
    • 遍历
  • 常用Map集合
    • Map集合的概述
  • HashMap
    • 创建对象
    • 常用方法
    • 遍历
  • HashMap的key去重原理

常用Set集合

Set集合的特点

​ Set接口下的集合都会有以下特点

  • 不能存储重复元素
  • 没有索引

HashSet

HashSet集合的特点

  • 底层数据结构是哈希表
  • 存储元素的顺序和遍历获取出来的顺序可能不一致
  • 没有索引
  • 集合中不能存储重复元素

创建对象

HashSet<元素数据类型> set = new HashSet<>();

public static void main(String[] args) {
    HashSet<String> set = new HashSet<>();
}

常用方法

方法 解释
boolean add(E e) 添加元素,如果元素添加不成功 返回值代表是否添加成功
boolean remove(Object o) 删除元素 ,返回值代表删除元素是否成功
boolean contains(Object o) 判断元素是否存在
int size() 获取集合的大小
 public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        //添加元素
        boolean f = set.add("愚");
        set.add("生");
        set.add("浅");
        set.add("末");
        System.out.println(f);
    }

我们打断点调试一下:

可以看到愚生浅末四个字符已经装入set,且f为true证明添加成功。

我们再试试删除:

public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        //添加元素
        set.add("愚");
        set.add("生");
        set.add("浅");
        set.add("末");
        boolean f = set.remove("生");
    }

可以看到set已经没有生了,且f为true代表删除成功。

判断是否存在:

 public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        //添加元素
        set.add("愚");
        set.add("生");
        set.add("浅");
        set.add("末");
        boolean f = set.contains("末");
    }

末是存在于set的,所以返回值为true。

获取集合的大小:

 public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        //添加元素
        set.add("愚");
        set.add("生");
        set.add("浅");
        set.add("末");
         //获取集合的大小
        int size = set.size();

添加了愚生浅末四个字符,所以可以得到size是4.

遍历

1.转换为数组遍历

 public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("愚");
        set.add("生");
        set.add("浅");
        set.add("末");
        String[] strings = set.toArray(new String[0]);
        for (int i = 0; i < strings.length; i++) {
            System.out.println(strings[i]);
        }
    }

结果:

前面说过:存储元素的顺序和遍历获取出来的顺序可能不一致。

2.使用迭代器遍历

    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("愚");
        set.add("生");
        set.add("浅");
        set.add("末");
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
    }

结果:

3.foreach遍历

 public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("愚");
        set.add("生");
        set.add("浅");
        set.add("末");
        for (String s : set) {
            System.out.println(s);
        }
    }

结果:

常用Map集合

Map集合的概述

Map接口是双列集合的顶层接口,下面是Map接口的定义

interface Map<K,V> K:键的类型;V:值的类型

​ 存储的数据必须包含key和value。

​ key和value在Map集合中是一一对应的关系。一个key对应一个value。

​ key在map集合中是不会重复的。

HashMap

HashMap集合的特点

  • 底层数据结构是哈希表
  • 存储元素的顺序和遍历获取出来的顺序可能不一致
  • key不会重复

创建对象

HashMap<key的数据类型,value的数据类型> map = new HashMap<>();

例如:

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        HashMap<String,Integer> map = new HashMap<>();
    }

常用方法

方法 解释
V put(K key, V value) 添加元素,如果key不存在就添加,如果key
V get(Object key) 根据key获取对应的value值返回。如果key不存在就返回null
V remove(Object key) 根据key删除map中对应的键值对。并且把删除的value返回
boolean containsKey(Object key) 判断key是否存在
int size() 集合中键值对的对数
void clear() 清空集合中的所有键值对
    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
//        map.put()
        //添加元素
        map.put("name", "愷龍");
        map.put("age", "20");
        String v = map.put("name", "愚生浅末");//将原来的愷龍替换为愚生浅末
        String name = map.get("name");//获取名字:愷龍
        String age = map.get("age");//获取age:20
        //删除元素
        String delV = map.remove("age");//返回值为20
        //判断key是否存在
        if(map.containsKey("name")){
            String agea = map.get("name");//null
            System.out.println(agea.length());
        }
        //size
        int size = map.size();
        map.clear();
    }

遍历

1.使用entrySet遍历

map集合的entrySet方法可以获取一个Set集合,集合中存放的是Entry对象,一个Entry对象相当于一个键值对。我们可以遍历set集合拿到Entry对象,然后获取出里面的键和值。

使用迭代器遍历entrySet

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("name","愷龍");
        map.put("age","20");
        Set<Map.Entry<String, String>> entries = map.entrySet();
        //使用迭代器遍历entrySet
        Iterator<Map.Entry<String, String>> it = entries.iterator();
        while (it.hasNext()){
            Map.Entry<String, String> entry = it.next();
            System.out.println(entry.getKey()+"="+entry.getValue());
        }
    }

结果:

使用foreach遍历entrySet

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("name","愷龍");
        map.put("age","20");
        Set<Map.Entry<String, String>> entries = map.entrySet();
        //使用foreach遍历entrySet
        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey()+"="+entry.getValue());
        }
    }

结果:

2.使用keySet遍历

map集合的keySet方法可以获取一个Set集合,集合中存放的是所有的key。我们可以遍历set集合拿到key对象,然后通过key获取对应的value。

    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("name","愷龍");
        map.put("age","20");
        Set<String> keys = map.keySet();
        for (String key : keys) {
            System.out.println(key+"="+map.get(key));
        }
    }

结果:

HashMap的key去重原理

​HashMap在添加元素的时候会判断集合中是否有key和本次存入的key相同。判断的时候主要是通过hashCode方法和equals方法来进行判断的。hashCode相同,并且equals判断也相同就会认为是同一个key。

​所以如果我们要存储到HashMap中的key是一个自定义的类型。就需要根据情况判断下是否需要重写下hashCode方法和equals方法。重写的时候使用IDEA的提示即可。

public class Student {
    private int age;
    private String name;
    public String getName(){
        return name = this.name;
    }
    public void setName(String name){
        this.name = name;
    }
    public int getAge(){
        return age = this.age;
    }
    public void setAge(int age){
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}

注意:HashSet存储数据其实也是使用了HashMap。所以如果往HashSet中存储自定义对象也要看情况是否需要重写hashCode方法和equals方法。

以上就是Java常用集合之Set和Map的用法详解的详细内容,更多关于Java Set Map集合的资料请关注我们其它相关文章

(0)

相关推荐

  • 深入解读Java三大集合之map list set的用法

    Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap.TreeMap.Hashtable.ConcurrentHashMap以及Properties等 Set接口的实现类主要有:HashSet.TreeSet.LinkedHashSet等 List接口的实现类主要有:ArrayList.LinkedList.Stack以及Vector等 List,Set,Map三者的区别?List.

  • Java集合框架之Set和Map详解

    目录 Set接口 HashSet TreeSet Map接口 HashMap TreeMap Set接口 set接口等同于Collection接口,不过其方法的行为有更严谨的定义.set的add方法不允许增加重复的元素.要适当地定义set的equals方法:只要俩个set包含同样的元素就认为它们是相同的,而不要求这些元素有相同的顺序.hashCode方法的定义要保证包含相同元素的俩个set会得到相同的散列码. --Java核心技术 卷一 public interface Set<E> exte

  • Java集合Set、List、Map的遍历方法

    本文实例讲述了Java集合Set.List.Map的遍历方法,分享给大家供大家参考. 具体方法如下: package com.shellway.javase; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.uti

  • Java集合定义与用法实例总结【Set、List与Map】

    本文实例讲述了Java集合定义与用法.分享给大家供大家参考,具体如下: java集合大体可分为三类,分别是Set.List和Map,它们都继承了基类接口Collection,Collection接口定义了众多操作集合的基本方法,如下: 为了访问Collection集合,不得不去了解Iterator接口.该接口很简单,主要用于定义访问集合的方法,如下: 所以上述的三大类子集合必定都继承了上面2个接口.其中Set集合要求元素不重复,且内部无序,所以访问时只能根据元素值来访问:List内部为动态数组,

  • java中List、Array、Map、Set等集合相互转换

    java中List.Array.Map.Set等集合相互转换 在java中,我们经常需要对List.Array等做一些转换操作,当然转换方法有很多种,但哪种方法既方便又高效呢?在这里向大家介绍一下集合间的最佳转换方法. 1.List转换为Array List<String> list = new ArrayList<String>(); list.add("China"); list.add("Switzerland"); list.add(

  • Java中集合List、Set和Map的入门详细介绍

    目录 一.Collection接口 二.List集合 2.1介绍 2.1.1 ArrayList(数组) 2.1.2 Vector(数组实现.线程同步) 2.1.3 LinkList(链表) 2.2 List特性 2.3 List常用方法 2.4 List总结 三.Set集合 3.1介绍 3.2 分类 3.2.1 HashSet(Hash表) 3.2.2 TreeSet(二叉树) 3.2.3 LinkHashSet(HashSet+LinkedHashMap) 四.Map集合 4.1 HashM

  • 一段代码搞懂关于Java中List、Set集合及Map的使用

    Java中List.Set集合及Map的使用代码如下所示: package tingjizifu; import java.util.*; public class TongJi { /* * 使用Scanner从控制台读取一个字符串,统计字符串中每个字符出现的次数,要求使用学习过的知识完成以上要求 * 实现思路根据Set.List.Map集合的特性完成. */ public static void main(String[] args) { // 输入字符串 Scanner input = n

  • Java 集合框架掌握 Map 和 Set 的使用(内含哈希表源码解读及面试常考题)

    目录 1. 搜索 1.1 场景引入 1.2 模型 2. Map 2.1 关于 Map 的介绍 2.2 关于 Map.Entry<K, V> 的介绍 2.3 Map 的常用方法说明 2.4 关于 HashMap 的介绍 2.5 关于 TreeMap 的介绍 2.6 HashMap 和 TreeMap 的区别 2.7 Map 使用示例代码 3. Set 3.1 关于 Set 的介绍 3.1 Set 的常用方法说明 3.3 关于 TreeSet 的介绍 3.4 关于 HashSet 的介绍 3.5

  • Java常用集合之Set和Map的用法详解

    目录 常用Set集合 Set集合的特点 HashSet 创建对象 常用方法 遍历 常用Map集合 Map集合的概述 HashMap 创建对象 常用方法 遍历 HashMap的key去重原理 常用Set集合 Set集合的特点 ​ Set接口下的集合都会有以下特点 不能存储重复元素 没有索引 HashSet HashSet集合的特点 底层数据结构是哈希表 存储元素的顺序和遍历获取出来的顺序可能不一致 没有索引 集合中不能存储重复元素 创建对象 HashSet<元素数据类型> set = new H

  • Java常用API类之Math System tostring用法详解

    1.注意(类名不能与math重名,否则可能报错误) 1.math:可以直接拿来用的接口类 Math.abs(-90);返回参数的绝对值 Math.max(60,98)返回参数的最大值 Math.random()*100随机函数:随机输出一个数 等等 public static void main(String[] args){ int a = 1300, b = 1000; System.out.println(Math.abs(-90)); System.out.println(Math.ma

  • java 三种将list转换为map的方法详解

    java 三种将list转换为map的方法详解 在本文中,介绍三种将list转换为map的方法: 1) 传统方法 假设有某个类如下 class Movie { private Integer rank; private String description; public Movie(Integer rank, String description) { super(); this.rank = rank; this.description = description; } public Int

  • java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    一 . 得到这个对象的实例 Connection con ; con = DriverManager.getConnection(url,userName,password); DatabaseMetaData dbmd = con.getMetaData(); 二. 方法getTables的用法 原型: ResultSet DatabaseMetaData.getTables(String catalog,String schema,String tableName,String []type

  • Go语言学习之映射(map)的用法详解

    目录 1. 什么是 map 2. 创建 map 3. 访问 map 4. nil map和空map 5. map中元素的返回值 6. len()和delete() 7. 测试map中元素是否存在 8. 迭代遍历 map 9. 获取map中所有的key 10. 传递map给函数 1. 什么是 map Map 是一种无序的键值对的集合.Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值 Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash

  • Linux Shell Map的用法详解

    Map定义: 在使用map时,需要先声明,否则结果可能与预期不同,array可以不声明 方式1: declare -A myMap myMap["my03"]="03" 方式2: declare -A myMap=(["my01"]="01" ["my02"]="02") myMap["my03"]="03" myMap["my04&qu

  • java dump文件怎么生成和分析-JMAP用法详解

    jmap是java自带的工具 1. 查看整个JVM内存状态 jmap -heap [pid] 2. 查看JVM堆中对象详细占用情况 jmap -histo [pid] 3. 导出整个JVM 中内存信息,可以利用其它工具打开dump文件分析,例如jdk自带的visualvm工具 jmap -dump:file=文件名.dump [pid] 补充知识:Jmap导出java运行中的堆内存dump及Jprofiler分析方法 1.jmap导出dump 1.1运行程序的java\bin目录,执行jmap

  • java中的抽象类和接口定义与用法详解

    目录 一.抽象类 1.什么叫抽象类? 2.抽象类的特点: 3.成员特点: 二.接口 1.接口是什么? 2.接口的特点 3.接口的组成成员 4.类与抽象的关系: 5.抽象类与接口的区别: 一.抽象类 1.什么叫抽象类? 例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的.所以动物就是所谓的抽象类,猫和狗则是具体的类了.因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类. 2.抽象类的特点: 抽象类与抽象方法必须用abs

  • Java 中Map 的用法详解

    Map简介 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口. Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序.某些映射实现可明确保证其顺序,如 TreeMap 类:另一些映射实现则不保证顺序,如HashMap 类. 注:将可变对象用作映射键时必须格外小心.当对

  • Java正则环视和反向引用功能与用法详解

    本文实例讲述了Java正则环视和反向引用功能与用法.分享给大家供大家参考,具体如下: 环视 1.环视概念 环视,又称为零宽断言,简称断言. 环视强调位置(前面或后面),必须匹配环视表达式,才能匹配成功. 环视可认为是虚拟加入到它所在位置的附加判断条件,并不消耗正则的匹配字符. 2.环视基础表达式 (?=Expression) 顺序肯定环视,表示所在位置右侧能够匹配Expression (?!Expression) 顺序否定环视,表示所在位置右侧不能匹配Expression (?<=Express

随机推荐