Java 学习之——哈希表 HashSet,HashMap+例题_hashset经典题-程序员宅基地

技术标签: Java  java  散列表  intellij-idea  

目录

一、Java HashSet

1、 添加元素

2、 判断元素是否存在

3、删除元素

4、计算大小

如果要计算 HashSet 中的元素数量可以使用 size() 方法:

5、迭代 HashSet

二、Java HashMap

基本类型和引用类型表格对应见HashSet表(基本一样)

1.添加元素

2 、访问元素

3、删除元素

4、计算大小

5、迭代 HashMap

三、实战

一、Java HashSet

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合

HashSet 允许有 null 值。

HashSet 是无序的,即不会记录插入的顺序。

HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。

HashSet 实现了 Set 接口

基本类型 引用类型
boolean Boolean
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character

1、 添加元素

HashSet 类提供了很多有用的方法,添加元素可以使用 add() 方法:

// 引入 HashSet 类      
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
    HashSet<String> sites = new HashSet<String>();
        sites.add("Apple");
        sites.add("Banana");
        sites.add("Orange");
        sites.add("Peach");
        sites.add("Banana);  // 重复的元素不会被添加
        System.out.println(sites);
    }
}

执行以上代码,输出结果如下:

[Apple, Banana, Orange, Peach]

2、 判断元素是否存在

我们可以使用 contains() 方法来判断元素是否存在于集合当中:

// 引入 HashSet 类      
import java.util.HashSet;

public class Maint {
    public static void main(String[] args) {
    HashSet<String> sites = new HashSet<String>();
        sites.add("Apple");
        sites.add("Banana");
        sites.add("Orange");
        sites.add("Peach");
        sites.add("Banana");  // 重复的元素不会被添加
        System.out.println(sites.contains("Orange"));
    }
}

执行以上代码,输出结果如下:

true

3、删除元素

我们可以使用 remove() 方法来删除集合中的元素:

// 引入 HashSet 类      
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
    HashSet<String> sites = new HashSet<String>();
        sites.add("Apple");
        sites.add("Banana");
        sites.add("Orange");
        sites.add("Peach");
        sites.add("Banana");     // 重复的元素不会被添加
        sites.remove("Orange");  // 删除元素,删除成功返回 true,否则为 false
        System.out.println(sites);
    }
}

执行以上代码,输出结果如下:

[Apple, Banana, Peach]

删除集合中所有元素可以使用 clear 方法:

// 引入 HashSet 类      
import java.util.HashSet;

public class Main{
    public static void main(String[] args) {
    HashSet<String> sites = new HashSet<String>();
        sites.add("Apple");
        sites.add("Banana");
        sites.add("Orange");
        sites.add("Peach");
        sites.add("Banana");     // 重复的元素不会被添加
        sites.clear();  
        System.out.println(sites);
    }
}

执行以上代码,输出结果如下:

[ ]

4、计算大小

如果要计算 HashSet 中的元素数量可以使用 size() 方法:

// 引入 HashSet 类      
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
    HashSet<String> sites = new HashSet<String>();
        sites.add("Apple");
        sites.add("Banana");
        sites.add("Orange");
        sites.add("Peach");
        sites.add("Banana");     // 重复的元素不会被添加
        System.out.println(sites.size());  
    }
}

执行以上代码,输出结果如下:

4

5、迭代 HashSet

可以使用 for-each 来迭代 HashSet 中的元素。

// 引入 HashSet 类      
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
    HashSet<String> sites = new HashSet<String>();
        sites.add("Apple");
        sites.add("Banana");
        sites.add("Orange");
        sites.add("Peach");
        sites.add("Banana");     // 重复的元素不会被添加
        for (String i : sites) {
            System.out.println(i);
        }
    }
}

执行以上代码,输出结果如下:

Apple
Banana
Orange
Peach

二、Java HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。

HashMap 是无序的,即不会记录插入的顺序。 

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口

基本类型和引用类型表格对应见HashSet表(基本一样)

1.添加元素

HashMap 类提供了很多有用的方法,添加键值对(key-value)可以使用 put() 方法:

// 引入 HashMap 类      
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // 创建 HashMap 对象 Sites
        HashMap<Integer, String> Sites = new HashMap<Integer, String>();
        // 添加键值对
        Sites.put(1, "Apple");
        Sites.put(2, "Banana");
        Sites.put(3, "Orange");
        Sites.put(4, "Peach");
        System.out.println(Sites);
    }
}

执行以上代码,输出结果如下:

{1=Apple, 2=Banana, 3=Orange, 4=Peach}

2 、访问元素

我们可以使用 get(key) 方法来获取 key 对应的 value:

// 引入 HashMap 类      
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // 创建 HashMap 对象 Sites
        HashMap<Integer, String> Sites = new HashMap<Integer, String>();
        // 添加键值对
        Sites.put(1, "Apple");
        Sites.put(2, "Banana");
        Sites.put(3, "Orange");
        Sites.put(4, "Peach");
        System.out.println(Sites.get(2));
    }
}

执行以上代码,输出结果如下:

Banana

3、删除元素

我们可以使用 remove(key) 方法来删除 key 对应的键值对(key-value):

// 引入 HashMap 类      
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // 创建 HashMap 对象 Sites
        HashMap<Integer, String> Sites = new HashMap<Integer, String>();
        // 添加键值对
        Sites.put(1, "Apple");
        Sites.put(2, "Banana");
        Sites.put(3, "Orange");
        Sites.put(4, "Peach");
        Sites.remove(3);
        System.out.println(Sites);
    }
}

执行以上代码,输出结果如下:

{1=Apple, 2=Banana, 4=Peach}

删除所有键值对(key-value)可以使用 clear 方法:

      与HashSet删除全部一样,代码就不举例写了。

4、计算大小

如果要计算 HashMap 中的元素数量可以使用 size() 方法:

// 引入 HashMap 类      
import java.util.HashMap;

public class Main{
    public static void main(String[] args) {
        // 创建 HashMap 对象 Sites
        HashMap<Integer, String> Sites = new HashMap<Integer, String>();
        // 添加键值对
        Sites.put(1, "Apple");
        Sites.put(2, "Banana");
        Sites.put(3, "Orange");
        Sites.put(4, "Peach");
        System.out.println(Sites.size());
    }
}

执行以上代码,输出结果如下:

4

5、迭代 HashMap

可以使用 for-each 来迭代 HashMap 中的元素。

如果你只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果你只想获取 value,可以使用 values() 方法。

// 引入 HashMap 类      
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // 创建 HashMap 对象 Sites
        HashMap<Integer, String> Sites = new HashMap<Integer, String>();
        // 添加键值对
        Sites.put(1, "Apple");
        Sites.put(2, "Banana");
        Sites.put(3, "Orange");
        Sites.put(4, "Peach");
        // 输出 key 和 value
        for (Integer i : Sites.keySet()) {
            System.out.println("key: " + i + " value: " + Sites.get(i));
        }
        // 返回所有 value 值
        for(String value: Sites.values()) {
          // 输出每一个value
          System.out.print(value + ", ");
        }
    }
}

执行以上代码,输出结果如下:

key: 1 value: Apple
key: 2 value: Banana
key: 3 value: Orange
key: 4 value: Peach

Apple,Banana,Orange,Peach,

更多HashMap()方法从API帮助文档均可查到


三、实战

 以我个人做过的几个例题进行举例

第一题

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
     
        Set<String> hashset = new HashSet<String>();
        for (int i = 0; i < a; i++) {
            String str=sc.next();
            hashset.add(str);
        }
        System.out.println(hashset.size());
    }
}

      该题所求出现不同字符串的个数,像第一个字符串{abc}和第三个字符串{abc}一样,所以输出这四个字符串个数{abc,aaaa,abcc,12345}。利用set集合的去重属性,向集合中添加输入的字符串,若输入字符串已在集合中存在,则不会再向集合中添加。

 

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();//表示将要输入N个整数
        int C = sc.nextInt();//A-B的结果C
        int[] arr = new int[N];
        long sum = 0;
        int t=0;//计数器

        HashMap<Integer, Integer> map = new HashMap<>();
        //依次将N个数字输入数组中
        for (int i = 0; i < N; i++) {
            arr[i] = sc.nextInt();
            //从哈希表中依次找数字,如果获得的数字为空值,则计数器t=0。
            if(map.get(arr[i])==null){
                t=0;
            }
            else{
                t=map.get(arr[i]);
            }
            map.put(arr[i],++t);
        }

        //A-B=C就相当于 A=B+C
        for (int i = 0; i < N; i++) {
            if(map.get(arr[i]+C)!=null){
                sum=map.get(arr[i]+C)+sum;
            }
        }
        System.out.println(sum);
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_67597772/article/details/128333634

智能推荐

hdu 1229 还是A+B(水)-程序员宅基地

文章浏览阅读122次。还是A+BTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24568Accepted Submission(s): 11729Problem Description读入两个小于10000的正整数A和B,计算A+B。...

http客户端Feign——日志配置_feign 日志设置-程序员宅基地

文章浏览阅读419次。HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息。FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。NONE:不记录任何日志信息,这是默认值。配置Feign日志有两种方式;方式二:java代码实现。注解中声明则代表某服务。方式一:配置文件方式。_feign 日志设置

[转载]将容器管理的持久性 Bean 用于面向服务的体系结构-程序员宅基地

文章浏览阅读155次。将容器管理的持久性 Bean 用于面向服务的体系结构本文将介绍如何使用 IBM WebSphere Process Server 对容器管理的持久性 (CMP) Bean的连接和持久性逻辑加以控制,使其可以存储在非关系数据库..._javax.ejb.objectnotfoundexception: no such entity!

基础java练习题(递归)_java 递归例题-程序员宅基地

文章浏览阅读1.5k次。基础java练习题一、递归实现跳台阶从第一级跳到第n级,有多少种跳法一次可跳一级,也可跳两级。还能跳三级import java.math.BigDecimal;import java.util.Scanner;public class Main{ public static void main(String[]args){ Scanner reader=new Scanner(System.in); while(reader.hasNext()){ _java 递归例题

面向对象程序设计(荣誉)实验一 String_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏6次。目录1.串应用- 计算一个串的最长的真前后缀题目描述输入输出样例输入样例输出题解2.字符串替换(string)题目描述输入输出样例输入样例输出题解3.可重叠子串 (Ver. I)题目描述输入输出样例输入样例输出题解4.字符串操作(string)题目描述输入输出样例输入样例输出题解1.串应用- 计算一个串的最长的真前后缀题目描述给定一个串,如ABCDAB,则ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA }ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。

算法设计与问题求解/西安交通大学本科课程MOOC/C_算法设计与问题求解西安交通大学-程序员宅基地

文章浏览阅读68次。西安交通大学/算法设计与问题求解/树与二叉树/MOOC_算法设计与问题求解西安交通大学

随便推点

[Vue warn]: Computed property “totalPrice“ was assigned to but it has no setter._computed property "totalprice" was assigned to but-程序员宅基地

文章浏览阅读1.6k次。问题:在Vue项目中出现如下错误提示:[Vue warn]: Computed property "totalPrice" was assigned to but it has no setter. (found in <Anonymous>)代码:<input v-model="totalPrice"/>原因:v-model命令,因Vue 的双向数据绑定原理 , 会自动操作 totalPrice, 对其进行set 操作而 totalPrice 作为计..._computed property "totalprice" was assigned to but it has no setter.

basic1003-我要通过!13行搞定:也许是全网最奇葩解法_basic 1003 case 1-程序员宅基地

文章浏览阅读60次。十分暴力而简洁的解决方式:读取P和T的位置并自动生成唯一正确答案,将题给测点与之对比,不一样就给我爬!_basic 1003 case 1

服务器浏览war文件,详解将Web项目War包部署到Tomcat服务器基本步骤-程序员宅基地

文章浏览阅读422次。原标题:详解将Web项目War包部署到Tomcat服务器基本步骤详解将Web项目War包部署到Tomcat服务器基本步骤1 War包War包一般是在进行Web开发时,通常是一个网站Project下的所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码。当开发人员在自己的开发机器上调试所有代码并通过后,为了交给测试人员测试和未来进行产品发布,都需要将开发人员的源码打包成Wa..._/opt/bosssoft/war/medical-web.war/web-inf/web.xml of module medical-web.war.

python组成三位无重复数字_python组合无重复三位数的实例-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏13次。# -*- coding: utf-8 -*-# 简述:这里有四个数字,分别是:1、2、3、4#提问:能组成多少个互不相同且无重复数字的三位数?各是多少?def f(n):list=[]count=0for i in range(1,n+1):for j in range(1, n+1):for k in range(1, n+1):if i!=j and j!=k and i!=k:list.a..._python求从0到9任意组合成三位数数字不能重复并输出

ElementUl中的el-table怎样吧0和1改变为男和女_elementui table 性别-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏2次。<el-table-column prop="studentSex" label="性别" :formatter="sex"></el-table-column>然后就在vue的methods中写方法就OK了methods: { sex(row,index){ if(row.studentSex == 1){ return '男'; }else{ return '女'; }..._elementui table 性别

java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下-程序员宅基地

文章浏览阅读1.1k次。java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下

推荐文章

热门文章

相关标签