为什么要是用集合框架?-2.Set/Iterator/Map的应用及泛型集合

本文详细介绍了Java集合框架中的Set接口,重点讲解了HashSet和迭代器Iterator的工作原理。同时,探讨了Map接口及其最常见的实现类HashMap,展示了多种遍历Map的方法。此外,还通过综合练习解释了如何通过英文名称获取学员对象信息。最后,讨论了泛型集合的概念和优势,以及如何使用泛型解决类型转换异常,确保集合中元素类型的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Set接口

什么是Set接口?

  • 如图 Set接口存储一组唯一、无序的对象
  • HashSet是Set接口常用的实现类
  • Set中存放对象的引用(请参考下面代码,且注:以下文章Set接口章节所有代码的其中类请参考博主的集合框架1)
    图1
Set set = new HashSet();
String s1 = new String("java");  //String引用类型比较特殊,请参考实用类章节
String s2 = s1;
String s3 = new String("JAVA");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());   //输出结果为:2

Set接口为什么不能存储重复的值,该如何判断加入对象是否已经存在呢?

  • 答:采用对象的equals()方法比较对象是否相等(请参考以下代码)
Set set = new HashSet();
String s1 = new String("hello java"); 
String s2 = s1;
String s3 = new String("hello java"); //String重写了重复的内容
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size()); //输出结果为:1

HashSet是Set接口常用的实现类

//创建类newsTitleList中main方法的代码
Set newsTitleSet = new HashSet();
NewTitle car = new NewTitle(1,"汽车","admin");
//增加元素
newsTitleSet.add(car);
//获取元素个数
System.out.println("新闻标题数目为:"+newsTitleList.size()+"条");

Setj接口不存在get()方法

newsTitleSet.get(0);  //该代码错误,原因Set接口存储的对象无序     那么该如何实现遍历元素输出呢?请看代码

1.增强型for遍历元素输出

package com.lch.Collection;

import java.util.HashSet;
import java.util.Set;

//测试Set的使用
public class setDemo {
	public static void main(String[] args) {
		NewsTitle title1 = new NewsTitle(1,"中国天晴了1","admin");
		NewsTitle title2 = new NewsTitle(2,"中国天晴了2","admin");
		NewsTitle title3 = new NewsTitle(3,"中国天晴了3","admin");
		NewsTitle title4 = new NewsTitle(4,"中国天晴了4","admin");
		NewsTitle title5 = new NewsTitle(5,"中国天晴了5","admin");
		
		Set set = new HashSet();
		set.add(title1);
		set.add(title2);
		set.add(title3);
		set.add(title4);
		set.add(title5);
		
		
		System.out.println("新闻总记录数:"+set.size());
		
		//遍历无序的集合:1.增强for  2.迭代器Iterator
		
		//遍历每条新闻信息
		for(Object obj : set){
			NewsTitle title = (NewsTitle)obj;
			System.out.println(title.getId()+"  "+title.getTitle());
		}
	}
}

输出结果:
新闻总记录数:5
1  中国天晴了1
4  中国天晴了4
2  中国天晴了2
5  中国天晴了5
3  中国天晴了3

迭代器Iterator

迭代器的特征:将对象放在迭代器中,但它有类似指针的东西通过它可以选择元素(但遍历输出时若下一个元素为空则会自动停止运行)
在这里插入图片描述
具体代码

	//紧接上面增强for遍历
	System.out.println("***********************");
		//使用迭代器遍历
		Iterator itor = set.iterator();//获得迭代器:Iterator->alt+/  选择java.util,创建迭代器等号set.->Ctrl+1会发现多了一个iterator()方法选择它
//		通过迭代器迭代出集合元素
		while(itor.hasNext()){
			NewsTitle title = (NewsTitle)itor.next();
			System.out.println(title.getId()+"  "+title.getTitle());
		}

【注:在集合框架1中我们说过Iterator迭代器属于Collection接口的,因此List接口中出for循环遍历和增强型for遍历外又多了一种对象遍历方式】

二、Map接口(独立的接口)

问题 建立国家英文简称和中文全名间 的 键值映射 ,并通过key对value进行操作,应该如何实现数据的存储和操作呢?
在这里插入图片描述

分析

  • Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作
  • 最常用的实现类HashMap

具体实现

package com.lch.Collection;

import java.util.HashMap;
import java.util.Map;

//存储国家英文加成  ----  国家全称(键-值对)
public class MapDemo {

	public static void main(String[] args) {
		Map countries = new HashMap();
		
		//向Map集合中添加键值对
		countries.put("CN", "中华人民共和国"); //put 放置
		countries.put("RU", "俄罗斯联邦"); 
		countries.put("FR", "法兰西共和国"); 
		countries.put("US", "美利坚合众国"); 
	
		//获取Map的元素个数
		System.out.println(countries.size());
		
		//通过某个键获取对应的值
		String cnStr = (String)countries.get("CN"); //获得的类型是Objective,所以要强制类型转换
		System.out.println(cnStr);
		
		//判断Map中是否包含某个键
		boolean flag = countries.containsKey("US");
		System.out.println("集合中是否包含US?"+flag);
		
		//删除特定键对应的键值对
		countries.remove("US");
		System.out.println(countries.size());
		
		System.out.println("集合中是否包含US?"+countries.containsKey("US"));
		
		//分别显示Map中键集合、值集合、键值对集合
		System.out.println(countries.keySet());  //键集合  Set接口是无序 唯一的,因此keySet键是无序 唯一的
		System.out.println(countries.values());  //值集合
		System.out.println(countries);  //键值对集合
		
		//清空
		countries.clear();
		if(countries.isEmpty()){
			System.out.println("Map数据已清空!");
		}
		
	}
}

输出结果:
4
中华人民共和国
集合中是否包含US?true
3
集合中是否包含US?false
[RU, CN, FR]
[俄罗斯联邦, 中华人民共和国, 法兰西共和国]
{RU=俄罗斯联邦, CN=中华人民共和国, FR=法兰西共和国}
Map数据已清空!

Map接口常用方法
在这里插入图片描述
【注:具体实操,请查看上面Map接口的代码】
遍历Map集合

  • 方法1:通过迭代器Iterator实现遍历
  • 方法2:增强型for循环
  • 方法3:键值对
    具体代码
		
		//清空
//		countries.clear();
//		if(countries.isEmpty()){
//			System.out.println("Map数据已清空!");
//		}
		System.out.println("***************");
		//分别获取Map中的键和值
		//(1)先获取到每个key,然后根据每个key拿到相应的value
		Set keys = countries.keySet();
		//方法一:使用增强for拿到每个key
		for(Object obj : keys ){
			String key = (String)obj;
			String value = (String)countries.get(key);
			System.out.println(key+" - "+value);
		}
		System.out.println("****************");
		//方法二:使用Iterator迭代器拿到每个key
		Iterator itor = keys.iterator();
		while(itor.hasNext()){
			String key = (String)itor.next();
			String value = (String)countries.get(key);
			System.out.println(key+" - "+value);
		}
		System.out.println("*****************");
		//(2)先拿到Map中的键值对,然后再在每个键值对中分别取出来键和值
		//方法3:利用entrySet()拿到键值对遍历
		Set ms = countries.entrySet();  //拿到Map中所有键值对的集合,无序
		for(Object obj: ms){ 
			Map.Entry me = (Map.Entry)obj; //Map中的每一个键值对(Map.Entry)
			Object key = me.getKey(); //取出每个键值对中的键
			Object value = me.getValue(); //取出每个键值对的值
			System.out.println((String)key + " - "+(String)value);
		} 
输出结果:
***************
RU - 俄罗斯联邦
CN - 中华人民共和国
FR - 法兰西共和国
****************
RU - 俄罗斯联邦
CN - 中华人民共和国
FR - 法兰西共和国
*****************
RU - 俄罗斯联邦
CN - 中华人民共和国
FR - 法兰西共和国

三、综合练习

需求说明
- 某学员应聘至外企工作,每个学员都会有一个英文名称,对应该学员对象。请实现通过英文名称,获得该学员对象的详细信息
.学员属性包括姓名以及性别

 	效果:
	请输入您要寻找的学员英文名:
	Jack
	您要找的学员是:张三-男

具体实现

package cn.jbt.stu;
//创建Student类
public class Student {
	private String name;
	private String sex;
	
	public Student(){}
		public Student(String name,String sex){
			this.name = name;
			this.sex = sex;
		}
		

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
}

package cn.jbt.stu;
//创建测试类
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Test {
		public static void main(String[] args) {
			Map students = new HashMap();
			Student s1 =new Student("张三", "男");
			Student s2 =new Student("李四", "男");
			Student s3 =new Student("王五", "男");

			//键值对:学员的英文名字-学员
			students.put("Jack", s1);
			students.put("Bluce", s2);
			students.put("Alley", s3);
			
			//根据特定的key获取相应的value
			Scanner input = new Scanner(System.in);
			System.out.println("请输入您要寻找的学员英文名:");
			String key = input.next();
			if(students.containsKey(key)){
				Student stu = (Student)students.get(key);
				System.out.println("您要找的学员是:"+stu.getName()+" - "+stu.getSex());
				
			}else{
				System.out.println("对不起,没有您要寻找的学员!");
			}
		}
}

四、泛型集合

问题

  • 如何解决以下强制类型转换时容易出现的异常问题
    1.List的get(int index)方法获取元素
    2.Map的get(Object key)方法获取元素
    3.Iterator的next()方法获取元素
    方法
    • 通过泛型
      1.JDK5.0使用泛型 改写了集合框架中的所有接口和类
      泛型
  • 讲对象的类型作为参数,制定到其他类或者方法上,从而保证类型转换的安全性和稳定性
  • 本质是参数化类型
    示例
   //创建学院集合
   ArrayList<Student>students = new ArrayList<Student>();
   //创建学员类对象
   Student student = new Student();
   //创建诗类对象
   Poem poem = new Poenm();
   //将两个对象添加到List集合中
   students.add(student);
   students.add(poem);//由于创建时已指定Student类型,所以这里会报错
   
  • 泛型集合可以约束内的元素类型
  • 典型泛型集合ArrayList、HashMap<K,V>
    1.、<K,V>表示该泛型集合中的元素类型
    2.泛型集合中的数据不再转换为Object
    【注:除了指定的集合中的元素类型外,泛型集合和之前学习的集合的用法完全一样】
    具体实例
package com.lch.Collection;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

//存储国家英文加成  ----  国家全称(键-值对)
public class MapDemo {
	public static void main(String[] args) {
		Map<String,String> countries = new HashMap<String,String>();
		//向Map集合中添加键值对
		countries.put("CN", "中华人民共和国"); //put 放置
		countries.put("RU", "俄罗斯联邦"); 
		countries.put("FR", "法兰西共和国"); 
		countries.put("US", "美利坚合众国"); 
		//获取Map的元素个数
		System.out.println(countries.size());
		//通过某个键获取对应的值
		String cnStr = countries.get("CN");
		System.out.println(cnStr);
		//判断Map中是否包含某个键
		boolean flag = countries.containsKey("US");
		System.out.println("集合中是否包含US?"+flag);
		//删除特定键对应的键值对
		countries.remove("US");
		System.out.println(countries.size());
		System.out.println("集合中是否包含US?"+countries.containsKey("US"));
		//分别显示Map中键集合、值集合、键值对集合
		System.out.println(countries.keySet());  //键集合
		System.out.println(countries.values());  //值集合
		System.out.println(countries);  //键值对集合
		//清空
//		countries.clear();
//		if(countries.isEmpty()){
//			System.out.println("Map数据已清空!");
//		}
		System.out.println("***************");
		//分别获取Map中的键和值
		//(1)先获取到每个key,然后根据每个key拿到相应的value
		Set<String> keys = countries.keySet();
		//方法一:使用增强for拿到每个key
		for(String key : keys ){
			String value = (String)countries.get(key);
			System.out.println(key+" - "+value);
		}
		System.out.println("****************");
		//方法二:使用Iterator迭代器拿到每个key
		Iterator<String> itor = keys.iterator();
		while(itor.hasNext()){
			String key = itor.next();
			String value = countries.get(key);
			System.out.println(key+" - "+value);
		}
		System.out.println("*****************");
		//(2)先拿到Map中的键值对,然后再在每个键值对中分别取出来键和值
		//方法3:利用entrySet()拿到键值对遍历
		Set<Map.Entry<String, String>> ms = countries.entrySet();  //拿到Map中所有键值对的集合,无序
		for(Map.Entry<String, String> obj: ms){ 
			System.out.println(obj.getKey() + " - "+obj.getValue());
			//Map.Entry me = (Map.Entry)obj; //Map中的每一个键值对(Map.Entry)
			//Object key = me.getKey(); //取出每个键值对中的键
			//Object value = me.getValue(); //取出每个键值对的值
			//System.out.println((String)key + " - "+(String)value);
		} 		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值