javaday17集合和作业

1、集合

1.1、概述

集合是一种容器工具,可以用来存储多个数据。

  • 集合和数组的区别

    1. 数组的长度是固定的(可以通过复制进行扩容),集合的长度是可变的
    2. 数组储存的是同一类型的元素,集合可以储存可以存储不同类型的
    3. 数组可以存放基本类型数据或者对象,集合种只能存放对象
    4. 数组本身只有一个length属性,还有就是从Object中继承过来的方法
    5. 集合是由javaAPI中的java.util包里面所提供的接口和实现类组成的,这里面定义并实现了很多方法,可以使用集合对象直接调用这些方法,从而操作集合存放的数据
  • 集合框架中的三要素

    1. 接口

      整个集合框架的上层结构,都是用接口进行组织的

      接口中定义了集合中必须要有的基本方法

      通过接口还把集合划分成了几种不同的类型,每一种都有自己对应的接口

    2. 实现类

      对于上层使用接口划分成了几种不同的类型,每一种集合都有自己对应的接口

      每一种接口的实现类很可能有多个,每一个的实现方式也会各有不同

    3. 数据结构

      每一个实现类都实现了接口中所定义的最基本的方法,例如对数据的存储,检索,操作等方法

      但是不同的实现类,它们存储数据的方式不同,也就是使用的数据结构不同

  • 集合按照其存储结构可以分为两大类:

    1. Java.util.Collection

      一次存储一个数据,单列数据

    2. java.util.Map

      一次存储两个数据,双列数据

  • 其他的集合接口,都是由这两个接口派生出来的

    Collection---->{List,Set----->(SortedSet),Queue------>(Deque)}

    Map----->SortedMap

    1. 这些都是Java集合框架中的主要接口,他们之间是继承关系
    2. 接口中定义该种集合具有的主要方法,以及集合的基本特点
    3. 最终要使用的是接口的实现类,每种实现类对接口的实现方式不同,那么其特点也不同

1.2、Collection接口

Collection接口时单列集合类的父接口,这种集合可以将数据一个个的存放到集合中

重要的子接口

  • java.util.List
  • java.util.Set

Collection是父接口,其中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合对象。

Collection类型集合必须要有的基本的方法:

//向集合中添加元素	
boolean 	add(E e)
//把一个指定集合中的所有数据,添加到当前集合中    
boolean 	addAll(Collection<? extends E> c)
//清空集合中所有的元素。    
void 		clear()
//判断当前集合中是否包含给定的对象。
boolean 	contains(Object o)
//判断当前集合中是否包含给定的集合的所有元素。    
boolean 	containsAll(Collection<?> c)
//判断当前集合是否为空。
boolean 	isEmpty()
//返回遍历这个集合的迭代器对象    
Iterator<E> iterator()
//把给定的对象,在当前集合中删除。
boolean 	remove(Object o)
//把给定的集合中的所有元素,在当前集合中删除。    
boolean 	removeAll(Collection<?> c)
//判断俩个集合中是否有相同的元素,如果有当前集合只保留相同元素,如果没有当前集合元素清空    
boolean 	retainAll(Collection<?> c)
//返回集合中元素的个数。    
int 		size()
//把集合中的元素,存储到数组中。    
Object[] 	toArray()
//把集合中的元素,存储到数组中,并指定数组的类型  
<T> T[] 	toArray(T[] a)

1.3、数据接口

集合接口都会有不同的实现类,每种实现类的底层,采用了不同的数据结构对数据元素进行存储

数据存储的常用结构有:

  • 队列
  • 数组
  • 链表
  • 红黑树
  • 哈希表
  1. 栈,仅允许在栈的一段进行插入删除操作,并且不允许在其他任何位置进行操作

    特点:先进先出,入栈的方式称为压栈,把数据存放到栈的顶端位置;出栈称为弹栈,将栈顶位置的数据取出来

    在jvm的栈区,main是程序的入口所以是最先入栈,并且当main方法弹栈,也就代表这个类运行结束

  2. 队列

    仅允许在队列的一段进行插入,在另外一段进行删除

    特点:先进先出

  3. 数组

    在堆内存中一块连续的空间,元素数据在其中按照下标索引依次存储,比较常用的数据结构

    特点:通过下标索引,可以快速访问执行位置的元素,但是在数组中间靠前的位置添加,删除数据会比较慢

  4. 链表

    是由一个一个node节点组成,每一个node节点中存储了一个数据,以及一个指向下一个node节点对象的引用(单向链表),如果是双向链表的化,还会存储另一个引用,指向上一个node节点

    特点:查找元素慢,新增和删除元素较快

  5. 红黑树

    二叉树是树形结构的一个重要类型,

    特点:每个节点最多只能有两颗子树,且有左右之分(左边为小于上一个节点,否则放在右边节点)

    二叉树中有一种叫做红黑树(Red/Black Tree),它最早被称为平衡二叉B树(symmetric binary B-trees),后来被称为红黑树。

    红黑树是一种特殊化的平衡二叉树,它可以在进行插入和删除的时候,如果左右子数的高度相差较大,那么就通过特定操作(左旋、右旋)保持二叉查找树的平衡(动态平衡),从而获得较高的查找性能。

    红黑树的每一个节点的左子树的所有数据都比自己小,而右子树的所有数据都比自己大,并且左右子树的高度近似

    红黑树的约束:

    1. 根节点必须是黑色
    2. 其他节点可以是红色的或者黑色
    3. 叶子节点(特指null节点)是黑色的
    4. 每个红色节点的子节点都是黑色的
    5. 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同

    注意,红黑树的指定颜色的目的,是利用颜色值作为二叉树的平衡对称性的检查

  6. 哈希表

    java中的哈希表(hash),在JDK1.8之前是采用数组+链表进行实现,根据数据的哈希值,把数据存在数组中,但是当前哈希值冲突的时候,再使用链表进行存储,那么在数组中,同一hash值的数据都存在一个链表里。

    注意,之前学习过Object中hashCode方法的作用,hash值的特点以及和对象之间的关系

    例如,
    image-20200804020521179

    例如,如果数据的哈希值相同,在数组使用使用链表存储哈希值相同的几个数据
    image-20200804020823526

    可以看出,当链表中元素过多,即hash值相等的元素较多时,查找的效率会变低

    JDK1.8中,哈希表存储采用数组+链表+红黑树进行实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样可以大大提高查找的性能。

    例如,
    image-20200804021504751

    思考,java的集合框架中,三个重要组成部分是什么?

    接口、实现类、数据结构

    1.6 List集合

    java.util.List 接口继承了Collection 接口,是常用的一种集合类型。

    List集合具有Collection集合的特点之外,还具有自己的一些特点:

    • List是一种有序的集合

      例如,向集合中存储的元素顺序是8、2、5。那么集合中就是按照这个顺序进行存储的

    • List是一种带索引的集合

      可以通过元素的下标索引,精确查找对应的元素数据

    • List是一种可以存放重复数据的集合

      可以把相同的数据,在List集合中多次保存

    List接口中常用方法:

    //返回集合中指定位置的元素。
    E		get(int index);
    //用指定元素替换集合中指定位置的元素,并返回被替代的旧元素。
    E		set(int index, E element);
    //将指定的元素,添加到该集合中的指定位置上。
    void	add(int index, E element);
    //从指定位置开始,把另一个集合的所有元素添加进来
    boolean addAll(int index, Collection<? extends E> c);
    //移除列表中指定位置的元素, 并返回被移除的元素。
    E		remove(int index);
    //查收指定元素在集合中的所有,从前往后查到的第一个元素(List集合可以重复存放数据)
    int		indexOf(Object o);
    //查收指定元素在集合中的所有,从后往前查到的第一个元素(List集合可以重复存放数据)
    int		lastIndexOf(Object o);
    //根据指定开始和结束位置,截取出集合中的一部分数据
    List<E> subList(int fromIndex, int toIndex);
    

    注意,除了这些方法之外,还有从父接口Collection中继承过来的方法

    List集合的方法使用:

    public static void main(String[] args) {
    
        // 创建List集合对象
        List list = new ArrayList();
        // 往 尾部添加 指定元素
        list.add("hello1");
        list.add("hello2");
        list.add("hello3");
        System.out.println(list);
        // add(int index,String s) 往指定位置添加
        list.add(1, "world");
        System.out.println(list);
    
        // 删除索引位置为2的元素
        System.out.println("删除索引位置为2的元素");
        System.out.println(list.remove(2));
        System.out.println(list);
    
        // 修改指定位置元素
        list.set(0, "briup");
        System.out.println(list);
    
        //遍历集合
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    
        System.out.println("-----------------");
        //使用foreach遍历
        for(Object obj : list){
            System.out.println(obj);
        }
    
        System.out.println("-----------------");
        //使用迭代器进行遍历集合
        Iterator it = list.iterator();
        while(it.hasNext()){
            Object obj = it.next();
            System.out.println(obj);
        }
    
    }
    

    作业:

    3.完成一个学生管理系统功能如下
    1.在控制台输入以下界面
    🐉🐉🐉🐉🐉🐉 学生管理系统 🐉🐉🐉🐉🐉🐉
    ☆ 1.添加学生 ★
    ☆ 2.查询所有的学生 ★
    ☆ 3.根据学号删除学生 ★
    🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉
    根据不同的标号实现其功能
    功能可以增加
    注意:
    添加学生时,如果学生的名字是"蒙鑫",给予特殊照顾,
    无论学生成绩多差都需要排第一位

    学号 姓名 成绩
    按照成绩进行排序 蒙鑫需要排在第一位
    根据学号进行删除

    很粗糙,还没有完善

    
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class StudentManagementSystem {
    	int count = 0;
    	Object[][] arr = new Object[5][3];
    	public void choose(){
    		Scanner scanner = new Scanner(System.in);
    		int a = scanner.nextInt();
    		if(a==1) {
    			System.out.println("请按照下列顺序依次添加学生信息\n学号,姓名,成绩.\n输入end结束添加");
    			addStudent();
    		}else if(a==2) {
    			getAll(arr);
    		}else if(a==3) {
    			System.out.println("请输入要删除的学生的学号");
    			Scanner scanner2 = new Scanner(System.in);
    			int id = scanner2.nextInt();
    			String sum =""+id;
    			idDelete(sum);
    		}else {
    			System.out.println("输入有误");
    		}
    		
    	}
    	public void addStudent(){
    		Scanner scanner2 = new Scanner(System.in);
    		Object[] str = scanner2.nextLine().split(" ");
    		if(str.length!=3) {
    			System.out.println("添加结束");
    			System.out.println("功能选择:");
    			choose();
    		}else {
    			int num = 0;
    				for(int j = 0;j<arr[count].length;j++) {
    					arr[count][j] = str[num];
    					num++;
    					
    				}
    				count+=1;
    				
    				System.out.println("添加成功,请继续添加");
    				addStudent();
    		}
    	}
    	
    	public void getAll(Object[][] arr){
    		System.out.println("学号 姓名 成绩");
    		for(int i = 0;i<count;i++) {
    			for(int j = 0;j<arr[i].length;j++) {
    				String temp =""+arr[i][j];
    				String name = "蒙鑫";
    				if(temp.equals(name)) {
    					Object[][] s = new Object[1][3];
    					s[0]=arr[0];
    					arr[0]=arr[i];
    					arr[i]=s[0];
    				}
    			}
    		}
    		for(int i = 0;i<count;i++) {
    			for(int j = 0;j<arr[i].length;j++) {
    				System.out.print(arr[i][j]);
    				}
    			System.out.println();
    			}
    		System.out.println("功能选择:");
    		choose();
    	}
    	
    	public void idDelete(String sum) {
    		int temp =0;
    		ArrayList<Object> list = new ArrayList<Object>();
    		for(int i =0;i<count;i++) {
    			for(int j = 0;j<arr[i].length;j++) {
    				if(arr[i][0].equals(sum)) {
    					break;
    				}else {
    					list.add(arr[i][j]);	
    				}
    			}
    		}
    		count-=1;
    		for(int i =0;i<count;i++) {
    			for(int j = 0;j<arr[i].length;j++) {
    				arr[i][j]=list.get(temp);
    				temp+=1;
    			}
    		}
    		System.out.println("删除成功");
    		System.out.println("功能选择:");
    		choose();
    	}
    	public static void main(String[] args) {
    		StudentManagementSystem stu = new StudentManagementSystem();
    		System.out.println("\t🐉🐉🐉🐉🐉🐉 学生管理系统 🐉🐉🐉🐉🐉🐉🐉🐉🐉\r\n" + 
    				"	☆	  1.添加学生		      ★\r\n" + 
    				"	☆	  2.查询所有的学生		      ★\r\n" + 
    				"	☆	  3.根据学号删除学生	                              ★\r\n" + 
    				"	🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉🐉");
    		System.out.println("功能选择:");
    		stu.choose();
    	}
    }
     
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值