java集合类简介

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

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

集合和数组的区别

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

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

List集合的使用

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

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

1610803474139.png

1610803474175.png

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

Set集合的使用

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

创建Set集合

1610803474223.png

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

1610803474271.png

Map集合的使用

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

Map集合示意图

1610803474305.png

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

1610803474357.png

遍历Map集合

1610803474402.png

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

1610803474449.png

Map小练习

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

创建人 类

1610803474485.png

在主方法中创建人物

1610803474527.png

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

1610803474571.png

练习题升级

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

1610803474625.png

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

Java集合架构

集合框架

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

1610803474689.png

Collection接口方法

1610803474752.png

1610803474805.png

Collection集合元素的遍历方法

方法1遍历

1610803474861.png

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

如何使用迭代器

对于Set集合

1610803474933.png

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

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

1610803475008.png

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

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

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

示意图

1610803475065.png

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

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

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

1610803475144.png

Map集合包含List集合

1610803475195.png

Java集合练习

统计字符次数

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

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

程序思路

1610803475239.png

程序实现

1610803475287.png

1610803475325.png

统计总分和平均分

  某中学有若干学生(学生对象放在一个List中),每个学生有一个姓名属性、班级名称属性(String)和考试成绩属性(int),某次考试结束后,每个学生都获得了一个考试成绩。

请打印出所有学生的总分和平均分。

  1. /**学生类*************************************************/
  2. public class Students {
  3. //学生的姓名
  4. private String name;
  5. //班级名称
  6. private String className;
  7. //学生的成绩
  8. private int grade;
  9. //构造方法
  10. public Students(String name, String className, int grade) {
  11. super();
  12. this.name = name;
  13. this.className = className;
  14. this.grade = grade;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public String getClassName() {
  23. return className;
  24. }
  25. public void setClassName(String className) {
  26. this.className = className;
  27. }
  28. public int getGrade() {
  29. return grade;
  30. }
  31. public void setGrade(int grade) {
  32. this.grade = grade;
  33. }
  34. }
  35. /**主方法*************************************************/
  36. public class Test {
  37. public static void main(String[] args) {
  38. Students s1 = new Students("张三", "1班", 95);
  39. Students s2 = new Students("张四", "1班", 87);
  40. Students s3 = new Students("小明", "1班", 57);
  41. Students s4 = new Students("赵柳", "2班", 32);
  42. Students s5 = new Students("沈程", "2班", 90);
  43. Students s6 = new Students("武汉将", "2班", 43);
  44. Students s7 = new Students("无敌", "3班", 67);
  45. Students s8 = new Students("小李", "3班", 79);
  46. //创建一个集合存放学生
  47. List<Students> li1 = new ArrayList<Students>();
  48. li1.add(s1);
  49. li1.add(s2);
  50. li1.add(s3);
  51. li1.add(s4);
  52. li1.add(s5);
  53. li1.add(s6);
  54. li1.add(s7);
  55. li1.add(s8);
  56. //存放学生的分数和
  57. int sum = 0;
  58. //遍历集合,li1集合中存放的是Students对象
  59. for(Students s : li1) {
  60. sum += s.getGrade();
  61. }
  62. System.out.println("所有学生的总成绩为: " + sum);
  63. System.out.println("所有学生的平均成绩为: " + sum/li1.size());
  64. }
  65. }

注意:使用size方法来计算List集合的对象数量。

请打印出每个班级的总分和平均分。

给一群人分班,示意图

1610803475359.png

  1. /*******************学生类*******************/
  2. public class Students {
  3. //学生的姓名
  4. private String name;
  5. //班级名称
  6. private String className;
  7. //学生的成绩
  8. private int grade;
  9. //构造方法
  10. public Students(String name, String className, int grade) {
  11. super();
  12. this.name = name;
  13. this.className = className;
  14. this.grade = grade;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public String getClassName() {
  23. return className;
  24. }
  25. public void setClassName(String className) {
  26. this.className = className;
  27. }
  28. public int getGrade() {
  29. return grade;
  30. }
  31. public void setGrade(int grade) {
  32. this.grade = grade;
  33. }
  34. }
  35. /*******************主方法*******************/
  36. public class Test {
  37. public static void main(String[] args) {
  38. Students s1 = new Students("张三", "1班", 95);
  39. Students s2 = new Students("张四", "1班", 87);
  40. Students s3 = new Students("小明", "1班", 57);
  41. Students s4 = new Students("赵柳", "2班", 32);
  42. Students s5 = new Students("沈程", "2班", 90);
  43. Students s6 = new Students("武汉将", "2班", 43);
  44. Students s7 = new Students("无敌", "3班", 67);
  45. Students s8 = new Students("小李", "3班", 79);
  46. //创建一个集合存放学生
  47. List<Students> li1 = new ArrayList<Students>();
  48. li1.add(s1);
  49. li1.add(s2);
  50. li1.add(s3);
  51. li1.add(s4);
  52. li1.add(s5);
  53. li1.add(s6);
  54. li1.add(s7);
  55. li1.add(s8);
  56. //为一群学生进行分班
  57. Map< String, List<Students> > biaoGe = new HashMap<String, List<Students>>();
  58. for(Students s : li1) {
  59. String className = s.getClassName();
  60. //判断 是否有这个班级
  61. if(biaoGe.containsKey(className)) {
  62. //有该班级
  63. //获取Map集合中的List集合,往里面添加对象
  64. List<Students> li2 = biaoGe.get(className);
  65. //将该同学添加到List集合中
  66. li2.add(s);
  67. }else {
  68. //没有该班级,创建一个班级,即在map中创建一个List集合
  69. biaoGe.put(className, new ArrayList<Students>());
  70. //获取List集合
  71. List<Students> li2 = biaoGe.get(className);
  72. li2.add(s);
  73. }
  74. }
  75. //遍历集合,首先要将Map集合转为Set集合
  76. Set<Entry<String, List<Students>>> se1 = biaoGe.entrySet();
  77. for(Entry<String, List<Students>> en1 : se1) {
  78. //获取键值对中的List集合(值)
  79. List<Students> li = en1.getValue();
  80. //遍历每个班的学生,Map中的List集合,计算总分
  81. //班级总分
  82. int classNum = 0;
  83. for(Students s : li) {
  84. classNum += s.getGrade();
  85. }
  86. //打印信息
  87. System.out.println("班级名称: "+ en1.getKey() +"\t总分 : "+ classNum + "\t平均成绩: " + classNum/li.size());
  88. }
  89. }
  90. }
  91. //输出结果为
  92. 班级名称: 3 总分 : 146 平均成绩: 73
  93. 班级名称: 2 总分 : 165 平均成绩: 55
  94. 班级名称: 1 总分 : 239 平均成绩: 79