28、Java高级特性——集合:Set接口、HashSet集合、Map接口、 Map集合

目录

课前先导:

一、Set接口

二、HashSet集合

1、HashSet类

2、 HashSet集合的特点

3、HashSet集合常用方法 

三、HashSet集合代码演示 

1、封装属性类

2、集合操作类

3、添加数据:add()

4、返回集合中元素数量:size()

5、遍历HashSet集合的方法 

(1)增强for循环

(2)迭代器Iterator 

四、Map接口 

1、Map接口中的常用方法 

2、HashMap类代码演示 

(1)准备封装属性类

(2)HashMap实现类

(3)添加元素:put(Object key,Object value)

(4)获取集合中的元素个数:size()

(5)根据键(key)获取键对应的值:get(Object key)

(6)通过键删除键值对:remove(Object key)

(7)判断集合中是否包含键值对:containsKey(Object key)/containsValue(Object value)

(8)获取 集合中的所有键:keySet()

(9)获取集合中的所有值:values()

五、遍历Map集合的三种方式

1、获取键的集合,通过键来找值 

(1)增强for循环

(2)迭代器Iterator

 2、Map.Entry接口遍历Map集合:entrySet()

六、完整代码

1、Set集合

2、Map集合 


课前先导:

前面学习的关于集合的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,觉得内容不错的小伙伴可以点点关注,我们下篇博文见,再见!

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值