目录
(3)添加元素:put(Object key,Object value)
(5)根据键(key)获取键对应的值:get(Object key)
(6)通过键删除键值对:remove(Object key)
(7)判断集合中是否包含键值对:containsKey(Object key)/containsValue(Object value)
2、Map.Entry接口遍历Map集合:entrySet()
课前先导:
前面学习的关于集合的List接口,它的两个实现类ArrayList和LinkedList里面可以存储重复的元素,今天来看一下存储元素不能重复的集合。
一、Set接口
1、Set接口可以存储一组唯一、无序的对象;
2、Set接口常用的实现类有HashSet。
二、HashSet集合
1、HashSet类
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
比如我们遍历的集合的时候,集合有三个元素1,2,3;第一次遍历是1,2,3;第二次遍历是1,2,3;第三次遍历可能就是3,2,1了。
2、 HashSet集合的特点
(1)集合内的元素是无序排列的;
(2)HashSet类是非线程安全的;
(3)允许集合元素值为null。
3、HashSet集合常用方法
Set集合是不能通过下标操作的
三、HashSet集合代码演示
1、封装属性类
public class NewsTitle {
private int id; //新闻标题的编号
private String name;//新闻的名称;
private String author;//作者
//无参构造
public NewsTitle(){
}
//有参构造
public NewsTitle(int id, String name, String author) {
super();
this.id = id;
this.name = name;
this.author = author;
}
//get/set方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
//toString方法
@Override
public String toString() {
return "NewsTitle [id=" + id + ", name=" + name + ", author=" + author
+ "]";
}
}
2、集合操作类
import java.util.HashSet;
public class HashSetDemo01 {
public static void main(String[] args) {
//创建三个NewsTitle类对象
NewsTitle nt01 = new NewsTitle(1001,"我的很大吴亦凡!","张三");
NewsTitle nt02 = new NewsTitle(1002,"一次六千李云迪!","李四");
NewsTitle nt03 = new NewsTitle(1003,"死不承认李易峰!","王二");
//创建集合容器
HashSet hs = new HashSet();
}
}
3、添加数据:add()
//添加数据:add()
hs.add(nt01);
hs.add(nt02);
hs.add(nt03);
hs.add(nt01);
4、返回集合中元素数量:size()
//添加数据:add()
hs.add(nt01);
hs.add(nt02);
hs.add(nt03);
hs.add(nt01);
//集合中元素个数:size()
int size = hs.size();
System.out.println("Set集合中元素的数量为:"+size);
程序添加了四个元素,但size()方法返回的元素个数是三个 ,因为:Set集合存储的是一组无序、唯一的对象
5、遍历HashSet集合的方法
因为Set集合是无序的,所以就无法用get()方法通过元素下标获取元素了,那么普通for循环就无法遍历Set集合了。
(1)增强for循环
//增强for循环遍历数组
for(Object object:hs){
NewsTitle newsTitle = (NewsTitle)object;
System.out.println(newsTitle);
}
(2)迭代器Iterator
//迭代器遍历数组
//将集合元素取出来放到迭代器容器中
Iterator it = hs.iterator();
//使用hashNext()方法判断迭代器是否有元素
while(it.hasNext()){
//使用next()方法取出元素
Object object = it.next();
NewsTitle nt = (NewsTitle)object;
System.out.println(nt);
}
四、Map接口
(1)Map接口存储一组成对的键(key)——值(value)对象,提供key到value的映射,通过key来检索;
(2)Map接口中的key不要求有序,不允许重复。value同样不要求有序,但允许重复;
(3)最常用的Map接口实现类是HashMap。
1、Map接口中的常用方法
2、HashMap类代码演示
(1)准备封装属性类
public class Student {
private String name;
private char sex;
private int age;
//无参构造
public Student(){
}
//有参构造
public Student(String name, char sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
//get/set方法
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//toString方法
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
(2)HashMap实现类
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo01 {
public static void main(String[] args) {
//准备三个Student类对象
Student stu01 = new Student("张三",'男',20);
Student stu02 = new Student("李四",'男',30);
Student stu03 = new Student("Lisa",'女',18);
//创建Map集合容器(多态)
Map map = new HashMap();
}
}
(3)添加元素:put(Object key,Object value)
//添加元素
map.put("zs", stu01);
map.put("ls", stu02);
map.put("lisa", stu03);
(4)获取集合中的元素个数:size()
//获取集合中的元素个数
int size = map.size();
System.out.println(size);
(5)根据键(key)获取键对应的值:get(Object key)
//根据键(key)获取键对应的值:get(Object key)
Object object = map.get("zs");
Student student01 = (Student)object;
System.out.println(student01);
(6)通过键删除键值对:remove(Object key)
//根据键删除键值对
Object object01 = map.remove("ls");
Student student02 = (Student)object01;
System.out.println("你删除的元素为:"+student02);
(7)判断集合中是否包含键值对:containsKey(Object key)/containsValue(Object value)
//判断集合中是否包含键:containsKey(Object key)
boolean result01 = map.containsKey("zs");
System.out.println("集合中包含键“zs”?"+result01);
System.out.println("集合中包含键“mz”?"+map.containsKey("mz"));
//判断集合中是否包含值:containsValue(Object value)
System.out.println("集合中包含值stu01?"+map.containsValue(stu01));
(8)获取 集合中的所有键:keySet()
获取的键是Set集合
//获取集合中的所有键:keySet()
Set keys = map.keySet();
for(Object obj:keys){
//我们设置的键是String类型
String key = (String)obj;
System.out.println(key);
}
(9)获取集合中的所有值:values()
获取的集合是Collection类
//获取集合中的所有值:values()
Collection value = map.values();
Iterator it = value.iterator();
while(it.hasNext()){
Object obje = it.next();
Student stud = (Student)obje;
System.out.println(stud);
}
五、遍历Map集合的三种方式
1、获取键的集合,通过键来找值
//通过键遍历Map集合
//通过键的集合,然后通过键来找值
Set keyset = map.keySet();
(1)增强for循环
//增强for循环
for(Object obj1:keyset){
String strKey = (String)obj1;
Object obj2 = map.get(strKey);
Student student1 = (Student)obj2;
System.out.println(strKey+"对应的学生:"+student1);
}
(2)迭代器Iterator
//迭代器遍历
Iterator it01 = keyset.iterator();
while(it01.hasNext()){
Object obj3 = it01.next();
String strkey = (String)obj3;
Object obj4 = map.get(strkey);
Student student2 = (Student)obj4;
System.out.println(strkey+"对应的学生:"+student2);
}
2、Map.Entry接口遍历Map集合:entrySet()
entrySet()方法返回一个Set集合
映射项(键-值对)。Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。获得映射项引用的唯一 方法是通过此 collection 视图的迭代器来实现。这些 Map.Entry 对象仅 在迭代期间有效;更确切地讲,如果在迭代器返回项之后修改了底层映射,则某些映射项的行为是不确定的,除了通过 setValue 在映射项上执行操作之外。
//Map.Entry接口遍历集合
Set keyValues = map.entrySet();
for(Object objec:keyValues){
Map.Entry me = (Map.Entry)objec;
//获取键
Object obj5 = me.getKey();
String stringkey = (String)obj5;
//获取值
Object obj6 = me.getValue();
Student student3 = (Student)obj6;
System.out.println(stringkey+"对应的学生:"+student3);
}
六、完整代码
1、Set集合
public class NewsTitle {
private int id; //新闻标题的编号
private String name;//新闻的名称;
private String author;//作者
//无参构造
public NewsTitle(){
}
//有参构造
public NewsTitle(int id, String name, String author) {
super();
this.id = id;
this.name = name;
this.author = author;
}
//get/set方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
//toString方法
@Override
public String toString() {
return "NewsTitle [id=" + id + ", name=" + name + ", author=" + author
+ "]";
}
}
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo01 {
public static void main(String[] args) {
//创建三个NewsTitle类对象
NewsTitle nt01 = new NewsTitle(1001,"我的很大吴亦凡!","张三");
NewsTitle nt02 = new NewsTitle(1002,"一次六千李云迪!","李四");
NewsTitle nt03 = new NewsTitle(1003,"死不承认李易峰!","王二");
//创建集合容器
HashSet hs = new HashSet();
//添加数据:add()
hs.add(nt01);
hs.add(nt02);
hs.add(nt03);
//集合中元素个数:size()
int size = hs.size();
System.out.println("Set集合中元素的数量为:"+size);
System.out.println("***************************************************************");
//增强for循环遍历数组
for(Object object:hs){
NewsTitle newsTitle = (NewsTitle)object;
System.out.println(newsTitle);
}
System.out.println("***************************************************************");
//迭代器遍历数组
//将集合元素取出来放到迭代器容器中
Iterator it = hs.iterator();
//使用hashNext()方法判断迭代器是否有元素
while(it.hasNext()){
//使用next()方法取出元素
Object object = it.next();
NewsTitle nt = (NewsTitle)object;
System.out.println(nt);
}
}
}
2、Map集合
public class Student {
private String name;
private char sex;
private int age;
//无参构造
public Student(){
}
//有参构造
public Student(String name, char sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
//get/set方法
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//toString方法
@Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapDemo01 {
public static void main(String[] args) {
//准备三个Student类对象
Student stu01 = new Student("张三",'男',20);
Student stu02 = new Student("李四",'男',30);
Student stu03 = new Student("Lisa",'女',18);
//创建Map集合容器(多态)
Map map = new HashMap();
//添加元素
map.put("zs", stu01);
map.put("ls", stu02);
map.put("lisa", stu03);
//获取集合中的元素个数
int size = map.size();
System.out.println("Map集合长度:"+size);
System.out.println("***********************************************************");
//根据键(key)获取键对应的值:get(Object key)
Object object = map.get("zs");
Student student01 = (Student)object;
System.out.println(student01);
System.out.println("***********************************************************");
//根据键删除键值对
Object object01 = map.remove("ls");
Student student02 = (Student)object01;
System.out.println("你删除的元素为:"+student02);
System.out.println("Map集合长度:"+map.size());
System.out.println("***********************************************************");
//判断集合中是否包含键:containsKey(Object key)
boolean result01 = map.containsKey("zs");
System.out.println("集合中包含键“zs”?"+result01);
System.out.println("集合中包含键“mz”?"+map.containsKey("mz"));
//判断集合中是否包含值:containsValue(Object value)
System.out.println("集合中包含值stu01?"+map.containsValue(stu01));
System.out.println("***********************************************************");
//获取集合中的所有键:keySet()
Set keys = map.keySet();
for(Object obj:keys){
//我们设置的键是String类型
String key = (String)obj;
System.out.println(key);
}
System.out.println("***********************************************************");
//获取集合中的所有值:values()
Collection value = map.values();
Iterator it = value.iterator();
while(it.hasNext()){
Object obje = it.next();
Student stud = (Student)obje;
System.out.println(stud);
}
System.out.println("***********************************************************");
//通过键遍历Map集合
//通过键的集合,然后通过键来找值
Set keyset = map.keySet();
//增强for循环
for(Object obj1:keyset){
String strKey = (String)obj1;
Object obj2 = map.get(strKey);
Student student1 = (Student)obj2;
System.out.println(strKey+"对应的学生:"+student1);
}
System.out.println("***********************************************************");
//迭代器遍历
Iterator it01 = keyset.iterator();
while(it01.hasNext()){
Object obj3 = it01.next();
String strkey = (String)obj3;
Object obj4 = map.get(strkey);
Student student2 = (Student)obj4;
System.out.println(strkey+"对应的学生:"+student2);
}
System.out.println("***********************************************************");
//Map.Entry接口遍历集合
Set keyValues = map.entrySet();
for(Object objec:keyValues){
Map.Entry me = (Map.Entry)objec;
//获取键
Object obj5 = me.getKey();
String stringkey = (String)obj5;
//获取值
Object obj6 = me.getValue();
Student student3 = (Student)obj6;
System.out.println(stringkey+"对应的学生:"+student3);
}
}
}
目前学习了List接口中的AllayList集合、LinkedList集合;Set接口中的Set集合实现类HashSet;Map接口的Map集合实现类HashMap,这四个类中的方法都差不多的,只不过都有一些自己独有的方法,但并不难懂。所谓万变一理,一通百通。基础很重要,不要眼高手低。今天的学习到此结束,我是一米八、有腹肌、低于半小时你报警的Loveletter,觉得内容不错的小伙伴可以点点关注,我们下篇博文见,再见!