JAVA中的Set和Map

  • 1. Set接口
    • 1.1 概述
    • 1.2 特点
    • 1.3 常用方法
    • 1.4 案例 测试常用方法
  • 2. HashSet
    • 2.1 概述
    • 2.2 案例 获取HashSet里的元素
  • 3. Map接口
    • 3.1 概述
    • 3.2 特点
    • 3.3 继承结构
    • 3.4 常用方法
    • 3.5 案例 测试常用方法
  • 4. HashMap
    • 4.1 概述
    • 4.2 案例 读取HashMap的数据
    • 4.3 案例 字符串中的字符统计
    • 4.4 HashMap扩容

1. Set接口

1.1 概述

一个不包含重复元素的 collection。

数据无序(因为set集合没有下标)。

由于集合中的元素不可以重复。常用于给数据去重。

1.2 特点

  • HashSet:底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。当然K仍然不许重复。

  • TreeSet:底层就是TreeMap,也是红黑树的形式,便于查找数据。

  • HashMap实现中,当哈希值相同的对象,会在同一个hash值的位置存储不同属性的数据。

1.3 常用方法

boolean add(E e):添加元素。boolean addAll(Collection  c):把小集合添加到大集合中 。boolean contains(Object o) : 如果此 collection 包含指定的元素,则返回 true。boolean isEmpty() :如果此 collection 没有元素,则返回 true。Iterator<E> iterator():返回在此 collection 的元素上进行迭代的迭代器。boolean remove(Object o) :从此 collection 中移除指定元素的单个实例。int size() :返回此 collection 中的元素数。Objec[] toArray():返回对象数组

1.4 案例 测试常用方法

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class TestMap {public static void main(String[] args) {Set set = new HashSet ();set.add("hello");set.add("b");set.add("a");set.add("world");set.add("b");//不存重复元素,元素无序System.out.println(set);//迭代器Iterator it = set.iterator();while(it.hasNext()) {System.out.println(it.next());}}
}

2. HashSet

2.1 概述

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

2.2 案例 获取HashSet里的元素

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class TestMap {public static void main(String[] args) {HashSet set = new HashSet();set.add("a");set.add("e");set.add("b");set.add("a");set.add("b");System.out.println(set);//无序,不重复Iterator it = set.iterator();while(it.hasNext()) {System.out.println(it.next());}}
}

3. Map接口

3.1 概述

java.util  接口 Map<K,V>

类型参数: K - 此映射所维护的的类型
V - 映射的类型。

也叫哈希表、散列表。常用于存 键值对 结构的数据。其中的键不能重复,值可以重复.

3.2 特点

  • 可以根据键 提取对应的值

  • 键不允许重复,如果重复值会被覆盖

  • 存放的都是无序数据

  • 初始容量是16,默认的加载因子是0.75

3.3 继承结构

3.4 常用方法

void clear()从此映射中移除所有映射关系(可选操作)。boolean containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true。boolean containsValue(Object value)如果此映射将一个或多个键映射到指定值,则返回 true。V get(Object key)返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。boolean isEmpty()如果此映射未包含键-值映射关系,则返回 true。V put(K key, V value)将指定的值与此映射中的指定键关联(可选操作)。void putAll(Map<? extends K,? extends V> m)从指定映射中将所有映射关系复制到此映射中(可选操作)。V remove(Object key)如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。int size()返回此映射中的键-值映射关系数。Set<Map.Entry<K,V>> entrySet()返回此映射所包含的映射关系的 Set 视图。

3.5 案例 测试常用方法

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class TestMap {public static void main(String[] args) {Map map = new HashMap ();map.put("001", "钢铁侠");map.put("002", "蜘蛛侠");map.put("003", "绿巨人");map.put("004", "灭霸");map.put("005", "美国队长");map.put("005", "凤姐");System.out.println(map.containsKey("001"));System.out.println(map.containsValue("美国队长"));System.out.println(map.isEmpty());System.out.println(map.get("003"));System.out.println(map.remove("001"));System.out.println(map.size());Map map2 = new HashMap ();map2.put("999", "刘德华");
map.put(null,null);//可以存入键为null,值也null的数据map.putAll(map2);System.out.println(map);//keySet()返回键的set集合,把map的key形成set集合Set set = map.keySet();System.out.println(set);//map集合的遍历,//方式1:keySet():把map中的可以放入set集合//遍历方式1:keySet ()
Set set = m.keySet();Iterator it = set.iterator();while(it.hasNext()) {String key = (String) it.next();String val = (String) m.get(key);System.out.println(key+"="+val);}//遍历方式2:entrySet ()
Set set2 = m.entrySet();Iterator it2 = set2.iterator();while(it2.hasNext()) {Entry en = (Entry) it2.next();String key = (String) en.getKey();String value = (String) en.getValue();System.out.println(key+"=="+value);}}
}

4. HashMap

HashMap的键要同时重写hashCode()和equals()hashCode()用来判断确定hash值是否相同equals()用来判断属性的值是否相同-- equals()判断数据如果相等,hashCode()必须相同-- equals()判断数据如果不等,hashCode()尽量不同

4.1 概述

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。

HashMap底层是一个Entry数组,当存放数据时会根据hash算法计算数据的存放位置。算法:hash(key)%n,n就是数组的长度。

当计算的位置没有数据时,就直接存放,当计算的位置有数据时也就是发生hash冲突的时候/hash碰撞时,采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。

4.2 案例 读取HashMap的数据

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;public class TestMap {public static void main(String[] args) {HashMap map = new HashMap ();map.put(100, "刘德华");map.put(101, "梁朝伟");map.put(102, "古天乐");map.put(103, "周润发");//遍历方式1:keySet ()Set set = m.keySet();Iterator it = set.iterator();while(it.hasNext()) {String key = (String) it.next();String val = (String) m.get(key);System.out.println(key+"="+val);}//遍历方式2:entrySet ()Set set2 = m.entrySet();Iterator it2 = set2.iterator();while(it2.hasNext()) {Entry en = (Entry) it2.next();String key = (String) en.getKey();String value = (String) en.getValue();System.out.println(key+"=="+value);}}
}

4.3 案例 字符串中的字符统计

接收用户输入的一串字符串,统计出现的每个字符的个数

import java.util.HashMap;
import java.util.Scanner;
public class TestCount {public static void main(String[] args) {//abacbcdaString s = new Scanner(System.in).nextLine();//a 1  b 2  c 1HashMap<Character,Integer> map = new HashMap<>();//遍历字符串获取每个字符for(int i = 0;i<s.length();i++) {//1,取出字符串中的每个字符char c = s.charAt(i);//拿着字符查个数Integer count = map.get(c);//如果取出来是null,就存1,if(count==null) {map.put(c, 1);}else {//如果取出来有值,计数加1map.put(c,count+1);}}System.out.println(map);}
}

4.4 HashMap扩容

成长因子:

static final float DEFAULT_LOAD_FACTOR = 0.75f;

前面的讲述已经发现,当你空间只有仅仅为10的时候是很容易造成2个对象的hashcode 所对应的地址是一个位置的情况。这样就造成 2个 对象会形成散列桶(链表)。这时就有一个加载因子的参数,值默认为0.75 ,如果你HashMap的 空间有 100那么当你插入了75个元素的时候 HashMap就需要扩容了,不然的话会形成很长的散列桶结构,对于查询和插入都会增加时间,因为它要一个一个的equals比较。但又不能让加载因子很小,如0.01,这样显然是不合适的,频繁扩容会大大消耗你的内存。这时就存在着一个平衡,jdk中默认是0.75,当然负载因子可以根据自己的实际情况进行调整。

二十三、JAVA中的Set和Map相关推荐

  1. Java学习笔记二十:Java中的内部类

    Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...

  2. java中list里面存放map,根据map中的某一个字段进行排序

    Java中list里面存放map,根据map中的某一个字段进行排序 例如: [java] view plaincopy package com; import java.util.ArrayList; ...

  3. JAVA 中的 Collection 和 Map 以及相关派生类的概念

    JAVA中Collection接口和Map接口的主要实现类 Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素 ...

  4. 【Log】(二)Java 中的日志框架 JCL、SLF

    [Log](一)Java 中的日志框架 JUL.Log4j [Log](二)Java 中的日志框架 JCL.SLF [Log](三)Java 中的日志框架 logback.log4j2 前言 JUL ...

  5. JAVA中线程安全的MAP有哪些?

    JAVA中线程安全的map有:Hashtable.synchronizedMap.ConcurrentHashMap. java中map中线程安全怎么实现: 1.同步的map就是Hashtable, ...

  6. Java中四种遍历Map对象的方法

    方法一:在for-each循环中使用entry来遍历,通过Map.entrySet遍历key和value,这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Int ...

  7. (二)Java中的HashMap与ConcurrentHashMap的区别

    HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了. ConcurrentHashMap具 ...

  8. Java中的Set, List, Map漫谈

    在编程语言中,集合是指代表一组对象的对象.Java平台专门有一个集合框架(Collections Framework).集合框架是指表示和操作集合的统一架构,隔离了集合的操作和实现细节. 集合框架中的 ...

  9. Java面试题详解二:java中的关键字

    一,final 1.被final修饰的类不可以被继承 2.被final修饰的方法不可以被重写 3.被final修饰的变量不可以被改变   重点就是第三句.被final修饰的变量不可以被改变,什么不可以 ...

最新文章

  1. 注册Github账户过程
  2. silverlight实现2D人物动画
  3. iOS--SDAutolayout宽度自适应
  4. 51单片机的配p10端口c语言,stc12c5a16s2的单片机的p5口做普通端口怎么定义?
  5. mysql 压力测试知乎_MySQL性能基准测试对比:MySQL 5.7与MySQL 8.0
  6. android 清除应用程序数据,Android – 通过“清除数据”设置选项阻止正在删除的应用程序数据或文件...
  7. 云原生之容器安全实践
  8. [转载] Java中Runtime的使用
  9. snmp 获得硬件信息_计算机网络基础课程—简单网络管理协议(SNMP)
  10. open cv+C++错误及经验总结(十)
  11. N天学习一个Linux命令之grep
  12. verilog逻辑符
  13. 单片机控制10BitDA正弦信号发生器 PROTEUS 和51单片机教程(附仿真文件+源代码)
  14. 常见模拟电路设计 四 :比较器详讲
  15. 51单片机数码管计数器
  16. AudioRecord的用法
  17. 简历||STAR法则
  18. 我室友拿到了美团50万年薪,太牛逼了
  19. 机器学习实验二 决策树
  20. 低成本打造初创团队的 DevOps 实践(采用 NAS中的KVM 承载 Gogs + Jenkins + Nexus 服务)【0x02】安装Nexus

热门文章

  1. 计算机笔记--【Netty网络编程①】
  2. 立方体,生成6个面,修改透视、俯视角度
  3. 时间序列 R 10 其他进阶预测方法 Advanced forecasting methods
  4. 蓝屏0x00000077?
  5. 输出8+88+888+8888+88888+。。。。。。前20个数(java)
  6. 对于.exe文件如何创建快捷方式?
  7. 使用MediaPlay播放视频
  8. python 消除二值图像中面积小于某个阈值的连通域(消除孤立点)
  9. java——Object类、Date类、DateFormat类、Calendar类、包装类
  10. codeforces-962-c