java集合类简介
集合类存放于java.util包中,集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference),集合类型主要有3种:set(集)、list(列表)和map(映射)。
通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器,而且不限制对象的数量。
集合和数组的区别
数组也可以把许多对象放在一起管理和维护,但是数组的长度是固定的,长度和空间创建之后不能进行修改。
我们可以认为集合是一个长度自动化的数组,更易用,更智能。
List集合的使用
List是有序集合,允许重复添加对象。
在使用List集合前要导入java.util包,下面的程序展示了创建集合且里面存放的全是字符串,往集合中添加对象方法add,以及获取集合中的某个对象方法get,还有两种遍历集合方法。
删除集合中对象
1. listTest.remove(2);
Set集合的使用
Set是无序集合,无法使用get方法获取指定的对象,Set集合重复对象无法添加进去,比如对象a添加2次,在添加第二次时候,add方法会返回一个false布尔类型,表示添加失败,打印的时候只会输出一次对象a。
创建Set集合
往集合中添加对象并遍历集合
Map集合的使用
Map是一种包含键值对(Entry)的元素集合,键值对实际上就是两个类,Map不能包含重复的键,比如你已经在前面往Map集合中添加了对象a,在后面又添加了对象a,后面会把前面的键值对覆盖掉,输出时只会输出后面的键值对。
Map集合示意图
现在有个要求
1. 某个超市有会员政策,同样购买一个商品,普通用户,需要花4000元,VIP会员需要花3000元,超级VIP只需要花2000元,其中普通会员,VIP会员,超级VIP都属于字符串类,而价格属于Double类,因此使用Map程序如下。
遍历Map集合
查看Msp集合中是否有某个键或值
Map小练习
创建一个人 类,然后创建两个对象悟空和八戒,分别为其设置名字和年龄,现在用Map集合为悟空和八戒分别起个外号。
创建人 类
在主方法中创建人物
创建Map集合,为悟空和八戒起外号
练习题升级
现在条件变了,指定某个人攻击另一个人,使用map集合的方式实现。
target.get(p2)是返回键值对中的值的对象。
Java集合架构
集合框架
黄色的都是接口,蓝色是接口实现类,Iterator是一个迭代器。
Collection接口方法
Collection集合元素的遍历方法
方法1遍历
方法2是使用迭代器Iterator遍历,请到下一节。
如何使用迭代器
对于Set集合
List集合的迭代器和Set的使用一模一样。
Map要先转为Collection中的Set才可以使用迭代器(请看Java集合框架)。
集合可以包含集合(重要)
首先先明确一个概念,将一个对象添加到一个集合中,是把整个对象移动到该集合中吗?答案是否定的,只是把这个对象的地址引用到该集合中,即将该对象的地址添加到集合中,对象原来在什么位置还是在什么位置,没有改
变。
那现在有两个List集合a和b,我想让a集合的集合中包含b集合,并不是把b集合整体移到a集合中,要知道集合本身也是对象,只是把集合b的首地址引用到a集合中,即将集合a的地址添加到b集合中。
示意图
那我该怎么往List集合b中添加对象呢? 从List集合a中取出集合b的地址,也可以称作集合b对象,就可以操作集合b了。
记住:集合并不是把其他的对象添加进来,只是引用地址而已。
程序示意
1. List集合包含List集合
Map集合包含List集合
Java集合练习
统计字符次数
创建一个字符串,值为一句英文,统计字符串中每个字符出现的次数,要求使用学习过的知识完成以上要求,例如HelloWorld结果如下:.H = 1,e = 1,l = 3,o = 2,r = 1,d = 1
实现思路
1. 根据Set、List、Map集合的特性完成
2. 不需要考虑汉字特殊字符等特殊情况
程序思路
程序实现
统计总分和平均分
某中学有若干学生(学生对象放在一个List中),每个学生有一个姓名属性、班级名称属性(String)和考试成绩属性(int),某次考试结束后,每个学生都获得了一个考试成绩。
请打印出所有学生的总分和平均分。
/**学生类*************************************************/
public class Students {
//学生的姓名
private String name;
//班级名称
private String className;
//学生的成绩
private int grade;
//构造方法
public Students(String name, String className, int grade) {
super();
this.name = name;
this.className = className;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
/**主方法*************************************************/
public class Test {
public static void main(String[] args) {
Students s1 = new Students("张三", "1班", 95);
Students s2 = new Students("张四", "1班", 87);
Students s3 = new Students("小明", "1班", 57);
Students s4 = new Students("赵柳", "2班", 32);
Students s5 = new Students("沈程", "2班", 90);
Students s6 = new Students("武汉将", "2班", 43);
Students s7 = new Students("无敌", "3班", 67);
Students s8 = new Students("小李", "3班", 79);
//创建一个集合存放学生
List<Students> li1 = new ArrayList<Students>();
li1.add(s1);
li1.add(s2);
li1.add(s3);
li1.add(s4);
li1.add(s5);
li1.add(s6);
li1.add(s7);
li1.add(s8);
//存放学生的分数和
int sum = 0;
//遍历集合,li1集合中存放的是Students对象
for(Students s : li1) {
sum += s.getGrade();
}
System.out.println("所有学生的总成绩为: " + sum);
System.out.println("所有学生的平均成绩为: " + sum/li1.size());
}
}
注意:使用size方法来计算List集合的对象数量。
请打印出每个班级的总分和平均分。
给一群人分班,示意图
/*******************学生类*******************/
public class Students {
//学生的姓名
private String name;
//班级名称
private String className;
//学生的成绩
private int grade;
//构造方法
public Students(String name, String className, int grade) {
super();
this.name = name;
this.className = className;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
/*******************主方法*******************/
public class Test {
public static void main(String[] args) {
Students s1 = new Students("张三", "1班", 95);
Students s2 = new Students("张四", "1班", 87);
Students s3 = new Students("小明", "1班", 57);
Students s4 = new Students("赵柳", "2班", 32);
Students s5 = new Students("沈程", "2班", 90);
Students s6 = new Students("武汉将", "2班", 43);
Students s7 = new Students("无敌", "3班", 67);
Students s8 = new Students("小李", "3班", 79);
//创建一个集合存放学生
List<Students> li1 = new ArrayList<Students>();
li1.add(s1);
li1.add(s2);
li1.add(s3);
li1.add(s4);
li1.add(s5);
li1.add(s6);
li1.add(s7);
li1.add(s8);
//为一群学生进行分班
Map< String, List<Students> > biaoGe = new HashMap<String, List<Students>>();
for(Students s : li1) {
String className = s.getClassName();
//判断 是否有这个班级
if(biaoGe.containsKey(className)) {
//有该班级
//获取Map集合中的List集合,往里面添加对象
List<Students> li2 = biaoGe.get(className);
//将该同学添加到List集合中
li2.add(s);
}else {
//没有该班级,创建一个班级,即在map中创建一个List集合
biaoGe.put(className, new ArrayList<Students>());
//获取List集合
List<Students> li2 = biaoGe.get(className);
li2.add(s);
}
}
//遍历集合,首先要将Map集合转为Set集合
Set<Entry<String, List<Students>>> se1 = biaoGe.entrySet();
for(Entry<String, List<Students>> en1 : se1) {
//获取键值对中的List集合(值)
List<Students> li = en1.getValue();
//遍历每个班的学生,Map中的List集合,计算总分
//班级总分
int classNum = 0;
for(Students s : li) {
classNum += s.getGrade();
}
//打印信息
System.out.println("班级名称: "+ en1.getKey() +"\t总分 : "+ classNum + "\t平均成绩: " + classNum/li.size());
}
}
}
//输出结果为
班级名称: 3班 总分 : 146 平均成绩: 73
班级名称: 2班 总分 : 165 平均成绩: 55
班级名称: 1班 总分 : 239 平均成绩: 79