一、Set接口
什么是Set接口?
- 如图 Set接口存储一组唯一、无序的对象
- HashSet是Set接口常用的实现类
- Set中存放对象的引用(请参考下面代码,且注:以下文章Set接口章节所有代码的其中类请参考博主的集合框架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);
}
}
}