java中的集合

1. java集合类简介

  集合类存放于java.util包中,集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference),集合类型主要有3种:set(集)、list(列表)和map(映射)。

通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器,而且不限制对象的数量。

2. 集合和数组的区别

  数组也可以把许多对象放在一起管理和维护,但是数组的长度是固定的,长度和空间创建之后不能进行修改。

我们可以认为集合是一个长度自动化的数组,更易用,更智能。

3. List集合的使用

List是有序集合,允许重复添加对象。

  在使用List集合前要导入java.util包,下面的程序展示了创建集合且里面存放的全是字符串,往集合中添加对象方法add,以及获取集合中的某个对象方法get,还有两种遍历集合方法。

在这里插入图片描述

在这里插入图片描述

删除集合中对象
 1. listTest.remove(2);

4. Set集合的使用

  Set是无序集合,无法使用get方法获取指定的对象,Set集合重复对象无法添加进去,比如对象a添加2次,在添加第二次时候,add方法会返回一个false布尔类型,表示添加失败,打印的时候只会输出一次对象a。

创建Set集合

在这里插入图片描述

往集合中添加对象并遍历集合

在这里插入图片描述

5. Map集合的使用

  Map是一种包含键值对(Entry)的元素集合,键值对实际上就是两个类,Map不能包含重复的键,比如你已经在前面往Map集合中添加了对象a,在后面又添加了对象a,后面会把前面的键值对覆盖掉,输出时只会输出后面的键值对。

5.1. Map集合示意图

在这里插入图片描述

现在有个要求
 1. 某个超市有会员政策,同样购买一个商品,普通用户,需要花4000元,VIP会员需要花3000元,超级VIP只需要花2000元,其中普通会员,VIP会员,超级VIP都属于字符串类,而价格属于Double类,因此使用Map程序如下。

在这里插入图片描述

5.2. 遍历Map集合

在这里插入图片描述

查看Msp集合中是否有某个键或值

在这里插入图片描述

5.3. Map小练习

  创建一个人 类,然后创建两个对象悟空和八戒,分别为其设置名字和年龄,现在用Map集合为悟空和八戒分别起个外号。

创建人 类

在这里插入图片描述

在主方法中创建人物

在这里插入图片描述

创建Map集合,为悟空和八戒起外号

在这里插入图片描述

5.4. 练习题升级

现在条件变了,指定某个人攻击另一个人,使用map集合的方式实现。

在这里插入图片描述

target.get(p2)是返回键值对中的值的对象。

6. Java集合架构

6.1. 集合框架

黄色的都是接口,蓝色是接口实现类,Iterator是一个迭代器。

在这里插入图片描述

6.2. Collection接口方法

在这里插入图片描述

在这里插入图片描述

6.3. Collection集合元素的遍历方法

方法1遍历

在这里插入图片描述

方法2是使用迭代器Iterator遍历,请到下一节。

7. 如何使用迭代器

对于Set集合

在这里插入图片描述

List集合的迭代器和Set的使用一模一样。

Map要先转为Collection中的Set才可以使用迭代器(请看Java集合框架)。

在这里插入图片描述

8. 集合可以包含集合(重要)

  首先先明确一个概念,将一个对象添加到一个集合中,是把整个对象移动到该集合中吗?答案是否定的,只是把这个对象的地址引用到该集合中,即将该对象的地址添加到集合中,对象原来在什么位置还是在什么位置,没有改
变。

  那现在有两个List集合a和b,我想让a集合的集合中包含b集合,并不是把b集合整体移到a集合中,要知道集合本身也是对象,只是把集合b的首地址引用到a集合中,即将集合a的地址添加到b集合中。

示意图

在这里插入图片描述

  那我该怎么往List集合b中添加对象呢? 从List集合a中取出集合b的地址,也可以称作集合b对象,就可以操作集合b了。

记住:集合并不是把其他的对象添加进来,只是引用地址而已。

程序示意
 1. List集合包含List集合

在这里插入图片描述

Map集合包含List集合

在这里插入图片描述

9. Java集合练习

9.1. 统计字符次数

  创建一个字符串,值为一句英文,统计字符串中每个字符出现的次数,要求使用学习过的知识完成以上要求,例如HelloWorld结果如下:.H = 1,e = 1,l = 3,o = 2,r = 1,d = 1

实现思路
 1. 根据Set、List、Map集合的特性完成
 2. 不需要考虑汉字特殊字符等特殊情况

程序思路

在这里插入图片描述

程序实现

在这里插入图片描述

在这里插入图片描述

9.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sgy_yuebin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值