Java 常用Set集合和常用Map集合
常用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方法。
如图片失效等情况请参阅公众号文章:https://mp.weixin.qq.com/s/NLKGamezcB3nnQ3BgEDc9g
欢迎关注我的公众号:愚生浅末,一起交流学习。
Java 常用Set集合和常用Map集合的更多相关文章
- Android(java)学习笔记102:Map集合功能概述
下面通过代码引入Map集合:如下 package cn.itcast_01; import java.util.HashMap; import java.util.Map; /* * 作为学生来说,是 ...
- Android(java)学习笔记41:Map集合功能概述
1. 下面通过代码引入Map集合: 如下 package cn.itcast_01; import java.util.HashMap; import java.util.Map; /* * 作为学生 ...
- java学习第18天(map集合)
Map集合是将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 存储的是键值对形式的元素,键唯一,值可以重复,有点类似于数据库中的主键加数据.主要功能有: A:添加功能 put ...
- Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值
package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...
- Android(java)学习笔记104:Map集合的遍历之键找值
package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...
- Android(java)学习笔记103:Map集合的获取功能
package cn.itcast_01; import java.util.Collection; import java.util.HashMap; import java.util.Map; i ...
- 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合
package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...
- Java学习之路(九):Map集合
Map集合概述和特点 Map是属于java.util的一个接口Map<k,v> k:映射所维护的键的类型 v:映射值的类型 Map是将键映射到值的对象.一个映射不能包含重复的键:每个键最多 ...
- Android(java)学习笔记44:Map集合的遍历之键值对对象找键和值
1. Map集合的遍历之 键值对对象找 键和值: package cn.itcast_01; import java.util.HashMap; import java.util.Map; impor ...
- Android(java)学习笔记43:Map集合的遍历之键找值
1. Map集合的遍历之键找值 package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.u ...
随机推荐
- 基于Feature Flag的下一代开发模式
渐进式发布(Progressive Delivery)被认为是持续发布(Continous Delivery)的下一代形态,其专注于增强发布过程控制与降低发布风险,最终提高整体收益.国际科技巨头比如A ...
- CAS如何解决ABA问题
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. CAS如何解决ABA问题 什么是ABA:在CAS过程中,线程1.线程2分 ...
- HMS Core分析服务助您掌握用户分层密码,实现整体收益提升
随着市场愈发成熟,开发者从平衡收益和风险的角度开始逐步探索混合变现的优势,内购+广告就是目前市场上混合变现的主要方式之一. 对于混合变现模式,您是否有这样的困惑: 如何判断哪些用户更愿意看广告.哪些用 ...
- JS中的 && 、|| 、??、?. 运算符
javascript有不少好用的运算符,合理的使用可以大大提高工作效率,以下简单介绍了4种,具体如下: && 逻辑与运算(&&)是 AND 布尔操作.只有两个操作数都为 ...
- PHP代码审计之命令注入攻击
PHP漏洞-命令注入攻击 命令注入攻击 PHP中可以使用下列5个函数来执行外部的应用程序或函数 system.exec.passthru.shell_exec.``(与shell_exec功能相同) ...
- 前端HTML-01
HTML是什么? 超文本标记语言,是一种用于创建网页的标记语言 文件的扩展名:.html或者.htm HTML不是什么? HTML是一种标记语言,不是变成语言. HTML文档结构 <!DOCTY ...
- 2┃音视频直播系统之浏览器中通过 WebRTC 拍照片加滤镜并保存
一.拍照原理 好多人小时候应该都学过,在几张空白的纸上画同一个物体,并让物体之间稍有一些变化,然后连续快速地翻动这几张纸,它就形成了一个小动画,音视频播放器就是利用这样的原理来播放音视频文件的 播放器 ...
- 使用C#跨PC 远程调用程序并显示UI界面
在项目中有一个需求是需要在局域网内跨PC远程调用一个程序,并且要求有界面显示,调查了一些资料,能实现远程调用的.Net技术大概有PsExec.WMI.Schedule Task. 这三种方式都做了一个 ...
- vue - Vue路由
至此基本上vue2.0的内容全部结束,后面还有点elementUI和vue3.0的内容过几天再来更新. 这几天要回学校去参加毕业答辩,断更几天 一.相关理解 是vue的一个插件库,专门用来实现spa( ...
- 【Java面试】Redis存在线程安全问题吗?为什么?
一个工作了5年的粉丝私信我. 他说自己准备了半年时间,想如蚂蚁金服,结果第一面就挂了,非常难过. 问题是: "Redis存在线程安全问题吗?" 关于这个问题,看看普通人和高手的回答 ...