Java集合—Set集和Map集
一、Set集合
1.概述
Set集合无序的、不可重复的元素(无序是指索引)
Set集合不按照特定的方法进行排序,只是将元素放在集合中。
下面介绍一下Set集合的HashSet和TreeSet两个实现类。
2.HashSet集合
概述:
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable
Hash(哈希算法) 哈希函数定义的好坏决定了哈希算法的好坏,可以避免数据倾斜。
HashCode 哈希值
(1)使用equals()方法 可以判断两个元素的HashCode值是否相同
(2)如果HashCode值相同,继续与集合的元素作比较,
如果元素值也相同则视为同一个对象,将不保存在HashSet中;
如果元素值相同即不是同一个对象,理论上要存储该元素,但比较麻烦,应避免出现该情况!
(3)如果HashCode值不相同,直接把元素存储在该元素的HashCode位置。
构造方法:
HashSet<E> hashSet = new HashSet<E>();
主要方法:
boolean add(E e) -->将指定的元素添加到此集合(如果尚未存在)。
boolean contains(Object o) -->如果此集合包含指定的元素,则返回 true 。
int hashCode() -->返回此集合的哈希码值。
注意:在使用HashSet存储自定义数据类型的元素时,要在封装类中重写HashCode、equals、toString方法!!!
/**
* @ author: PrincessHug
* @ date: 2019/2/10, 3:17
* @ Blog: https://www.cnblogs.com/HelloBigTable/
*/
public class Student {
private String id;
private String name;
private char sex; public Student() {
} public Student(String id, String name, char sex) {
this.id = id;
this.name = name;
this.sex = sex;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public char getSex() {
return sex;
} public void setSex(char sex) {
this.sex = sex;
} @Override
public boolean equals(Object o) {
if (this == o) {return true;}
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return id == student.id &&
sex == student.sex &&
name.equals(student.name);
} @Override
public int hashCode() {
return id.hashCode();
} @Override
public String toString() {
return "id=" + id + ", name='" + name + '\'' + ", sex=" + sex;
}
} public class HashSetDemo {
public static void main(String[] args) {
HashSet<Student> hs = new HashSet<Student>();
Student s1 = new Student("20190201", "Wyh", '男');
Student s2 = new Student("20190202", "Fyh", '男');
Student s3 = new Student("20190203", "Zyq", '男');
System.out.println("添加Wyh是否成功"+hs.add(s1));
System.out.println("添加Fyh是否成功"+hs.add(s2));
System.out.println("添加Wyh是否成功"+hs.add(s3));
for (Student s:hs){
System.out.println(s.hashCode());
}
}
}
二、Map集合
1.概述
Set与List都属于Collection,而Map与Collection平行。
Map类型每个元素的值都包含两个对象:key-value键值对
key不能够重复,唯一的key可以对应多个value;
Map集合中不存储索引,key值即相当于索引。
2.HashMap
概述:
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
允许null值和null键,基于哈希表实现的Map接口。
构造方法:
HashMap<key,value> hm = new HashMap<key,value>();
主要方法:
V put(K key, V value) =>将指定的值与此映射中的指定键相关联。
Set<K> keySet() =>返回此地图中包含的键的Set视图。
V get(Object key) =>返回到指定键所映射的值,或 null如果此映射包含该键的映射。
boolean containsKey(Object key) =>如果此映射包含指定键的映射,则返回 true
boolean containsValue(Object value) =>如果此地图将一个或多个键映射到指定值,则返回 true 。
Set<Map.Entry<K,V>> entrySet() =>返回此地图中包含的映射的Set视图。
遍历HashMap的两种方法:
Set<K> keySet() =>返回map中包含的键的Set视图
Set<Map.Entry<K,V>> entrySet() => 返回map中包含的映射Set视图
Map.Entry见最后补充!
/**
* @ author: PrincessHug
* @ date: 2019/2/10, 9:29
* @ Blog: https://www.cnblogs.com/HelloBigTable/
*/
public class HashMapDemo {
public static void main(String[] args) {
HashMap<String, Student> hm = new HashMap<>();
Student s1 = new Student("20180201", "Wyh", '男');
Student s2 = new Student("20180202", "Gam", '女');
Student s3 = new Student("20180203", "Wqs", '男');
hm.put("000001",s1);
hm.put("000002",s2);
hm.put("000003",s3); System.out.println("遍历HashMap集合的方法一:entrySet()");
Iterator<Map.Entry<String, Student>> it = hm.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Student> entry = (Map.Entry<String,Student>)it.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
} System.out.println("遍历HashMap集合的方法二:keySet()");
Iterator<String> it2 = hm.keySet().iterator();
while (it2.hasNext()){
String key = it2.next();
System.out.println("key:" + key + "value:" + hm.get(key));
}
}
}
2.Hashtable
概述:
Hashtable实现了一个哈希表,它将键映射到值。任何非null对象都可以作为键或值
为了成功在Hashtable中存储和获取对象,用作键的对象必须实现HashCode和equals
构造方法:
Hashtable<String,Strudent> ht = new Hashtable<String,Strdent>();
主要方法:
void get(Object key) =>返回指定键所映射的值
void put(K key,V value) =>将指定的键映射的值设为value
遍历Hashtable的三种方法:
Enumeration<K> keys() => 返回次散列表中键的枚举
Set<Map,Entry<K,V>> entrySet() =>返回次地图中包含的映射的Set视图
Set<K> keySet() =>返回此map中包含的key的Set视图
Enumeration见最后补充!
/**
* @ author: PrincessHug
* @ date: 2019/2/10, 9:49
* @ Blog: https://www.cnblogs.com/HelloBigTable/
*/
public class HashtableDemo {
public static void main(String[] args) {
Hashtable<String, Student> ht = new Hashtable<>();
Student s1 = new Student("20180101", "Wyh", '男');
Student s2 = new Student("20180102", "Gam", '女');
Student s3 = new Student("20180203", "Wqs", '男');
ht.put("0001",s1);
ht.put("0002",s2);
ht.put("0003",s3); System.out.println("遍历Hashtable的方法一:keys()");
Enumeration<String> keys = ht.keys();
while (keys.hasMoreElements()){
String key = keys.nextElement();
System.out.println("key:" + key + ",value:" + ht.get(key));
} System.out.println("遍历Hashtable的方法二:entrySet()");
Iterator<Map.Entry<String, Student>> it = ht.entrySet().iterator();
while (it.hasNext()){
Map.Entry<String, Student> entry = (Map.Entry<String, Student>) it.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
} System.out.println("遍历Hashtable的方法三:keySet()");
Iterator<String> it1 = ht.keySet().iterator();
while (it1.hasNext()){
String key1 = it1.next();
System.out.println("key:" + key1 + ",value:" + ht.get(key1));
}
}
}
***补充:
1.Map.Entry
public static interface Map.Entry<K,V>
它属于Map接口(里面包含键值对),Set(Map.Entry<K,V>)方法返回地图的集合视图,其元素属于此接口类,获取对映射条目的引用的唯一方法是从该集合视图的迭代器。
主要方法:
K getKey()
V getValue()
2.Enumeration
public interface Enumeration<E>
实现枚举接口的对象生成一系列元素,一次一个;
类似于Iterator接口对集合进行迭代
主要方法:
boolean hasMoreElements() =>测试此枚举是否包含更多元素。
E nextElement() =>如果此枚举对象至少有一个要提供的元素,则返回此枚举的下一个元素。
Java集合—Set集和Map集的更多相关文章
- Java 集合系列 08 Map架构
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java集合框架之map
Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...
- Java 集合系列 15 Map总结
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java集合框架之Map接口浅析
Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...
- java集合框架07——Map架构与源代码分析
前几节我们对Collection以及Collection中的List部分进行了分析,Collection中还有个Set,因为Set是基于Map实现的,所以这里我们先分析Map,后面章节再继续学习Set ...
- 【JAVA集合框架之Map】
一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- 「 深入浅出 」java集合Collection和Map
本系列文章主要对java集合的框架进行一个深入浅出的介绍,使大家对java集合有个深入的理解. 本篇文章主要具体介绍了Collection接口,Map接口以及Collection接口的三个子接口Set ...
- Java集合中的Map接口怎么使用?
Map(双列集合框架) 1.Map接口及实现类概述 Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序 定义为迭代器在映射的 coll ...
随机推荐
- 手机CPU架构体系分类及各大厂商
手机cpu相关知识,这对于开发Android应用程序适应各个机型有一定的辅助作用 . 手机cpu架构体系分类 指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分,代表架构分别是x86.A ...
- SoapUI、Jmeter、Postman三种接口测试工具的比较分析
前段时间忙于接口测试,也看了几款接口测试工具,简单从几个角度做了个比较,拿出来与诸位分享一下吧.各位如果要转载,请一定注明来源,最好在评论中告知博主一声,感谢.本报告从多个方面对接口测试的三款常用工具 ...
- Confluence 6 编辑站点欢迎消息
通过编辑欢迎信息能够为你站点的主页面添加一些个人信息. 站点的欢迎信息显示在站点主面板的右侧,这是你对站点添加声明,连接,有关你项目组美好回忆照片的完美位置. 你需要 Confluence 管理员权限 ...
- select下拉框的数据回显
需求描述:select框,下拉后又很多的选项,选择一个,根绝后台代码做查询,完成之后,页面上的select框还是之前选的那个值 解决思路:select本质就是 value和text一一对应,根据你的s ...
- C++ 使用system()实现锁定屏幕
除了使用函数“LockWorkStation()”实现锁定屏幕,参考:http://www.cnblogs.com/Satu/p/8183081.html 此外,也可以使用函数“system()”来实 ...
- js--基础(对象、数组、函数、if语句、while语句、do while语句、continue语句、break语句)
三.流程控制:1.单行语句var age =20;//单行语句 2.复合语句花括号包含起来的与聚集和叫做复合语句,一对花括号表示一个复合语句 ,处理时可以当成一个单行语句来看待,一般复合句与叫做代码块 ...
- appium如何解决每次都要安装apk的烦恼
1.appium上勾选 No Reset 2.程序加上:capabilities.setCapability("noReset", true); //不需要再次安装 3.命令行 ...
- Loadrunner11.0 录制手机App脚本的方法一
使用Loadrunner录制手机终端App脚本 1. 说明 目前手机APP上的功能日益丰富,对手机应用功能的性能测试需求也越来越多.公司比较抠门没有花钱买Loadrunner,可怜我们工作中一直用的破 ...
- python字典操作用法总结
基本语法: dict = {'ob1':'computer', 'ob2':'mouse', 'ob3':'printer'} 技巧: 字典中包含列表:dict={'yangrong':['23',' ...
- java操作office和pdf文件java读取word,excel和pdf文档内容
在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...