Java 学习之——哈希表 HashSet,HashMap+例题

目录

一、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 接口

基本类型引用类型
booleanBoolean
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter

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);
    }
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅的水晶裤头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值