欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Day15

程序员文章站 2024-03-21 23:40:28
...

一、笔记:

数组:也可以存储对象
Person[] p = new Person[3];//3个Person对象
弊端:长度固定,类型固定,操作极其不方便


集合:用来专门存储一堆对象,可以存储不同类型的对象,长度是可变的

超市储货柜(有序)、超市购物车(无序)

Collection|--List(有序):ArrayList LinkedList  Stack..
      |--Set(无序):HashSet TreeSet

集合类就是数据结构的封装:
数据结构:存储数据的方式


数据结构:
1.集合
2.线性结构
3.树形结构
4.图形结构

Day15
对于数据的操作:
增:add  addAll  
删:remove  clear
改:set  
查:get  size   
插:add重载方法。两个参数

List集合:
将存入的数据有序的进行编号(类似数组的角标)
存储的数据可以重复

主要实现类:
ArrayList :列表式
LinkedList:链表式.双向的
Stack:知道即可  LIFO

泛型:强制指定集合中的数据类型

遍历集合的方式:
迭代器:Iterator
hasNext():判断是否有元素,有返回true  没有返回false
next():取出集合中的元素
for循环
forEach循环

面试题数组和集合的特点

数组的特点:

数组的本质上是一段连续的存储单元,用于记录多个类型相同的数据内容

数组一旦声明,则长度固定无法更改

数组的增删元素不方便,可能会造成大量的数据进行移动

数组使用下标访问,可以实现随机访问

数组的元素可以是基本数据类型,也可以是引用数据类型

集合的特点:

集合的空间可以是连续或者不连续,元素类型可以相同也可以不相同

集合一旦声明完毕,则长度可以随时动态调整

集合增删元素可以不移动大量元素

集合一部分支持下标访问一部分不支持下标访问

集合中的元素必须是引用数据类型,可以借助包装类

集合框架:专门用来存储对象的容器

在Java中集合的最顶层的类为Collection  和 Map

其中Collection 中存储元素为:单个存储

Map集合中存储元素为:单对存储

在以后的开发中很少去使用Collection进行存储,通常使用子类:List Set 进行存储

集合类就是数据结构的封装

数据结构:存储数据的方式方法

 

Collection集合的常用方法(练熟、记住)

   boolean add(E e) - 用于将参数指定的元素e放入当前集合中。

        - 若放入成功则返回true,否则返回false。

   boolean addAll(Collection<? extends E> c)

        - 用于将参数指定集合c中的所有元素一个个放入当前集合中。

        - 当前集合中的元素发生改变则返回true,否则返回false。 

   boolean contains(Object o)

        - 用于判断当前集合中是否包含参数指定的单个元素。

   boolean containsAll(Collection<?> c)

        - 用于判断当前集合中是否包含参数指定的所有元素。

   boolean remove(Object o)

        - 用于从当前集合中删除参数指定的单个元素。

   boolean removeAll(Collection<?> c)

        - 用于从当前集合中删除参数指定集合中的所有元素。

   void clear()

        - 用于清空当前集合中的所有元素。

   boolean retainAll(Collection<?> c)

        - 用于计算当前集合和参数集合的交集并保留到当前集合中,覆盖当前集合原来内容

        - 若当前集合中的元素发生改变则返回true,否则返回false。

   int size() - 用于返回集合中元素的个数。

   boolean isEmpty() - 用于判断当前集合是否为空。

List集合

基本概念

java.util.List接口是Collection接口的子接口,该接口中元素有先后放入次序并允许重复

该接口的主要实现类:ArrayList类、LinkedList类、Stack类以及Vector类(笔试题)。

其中ArrayList类的底层是采用动态数组实现的,因此访问元素方便,增删元素不方便。

其中LinkedList类的底层是采用双向链表实现的,因此增删元素方便,访问元素不方便。

其中Stack类的底层是采用动态数组实现的,该类通常用于描述具有后进先出特征的数据结构,叫做栈(last in first out  LIFO)。

其中Vector类的底层是采用动态数组实现的,与ArrayList类相比,属于线程安全的类,因此操作元素的效率比较低,因此推荐使用ArrayList类。

常用方法

void add(int index, E element) - 用于将元素element插入到当前集合index位置。

boolean addAll(int index, Collection<? extends E> c)

      - 用于将集合c中的所有元素插入到当前集合中index位置。

E get(int index) - 根据参数指定的下标获取对应的元素并返回。

E set(int index, E element) - 用于将下标index位置的元素替换element。

       - 返回被替换的元素值。

E remove(int index) - 用于删除当前集合中index位置的元素并返回。

List<E> subList(int fromIndex, int toIndex)

        - 用于获取当前集合中从fromIndex(含)开始到toIndex(不含)之间的部分视图。

        - 视图简单来说就是获取元素并返回,但没有申请独立内存空间去存储。

 

Stack

Stack类是List的子实现类

该类主要用于描述具有先进后出特征的数据结构,(last in fist out LIFO).

常见方法:

E peek()  - 用于查看当前栈中的首元素,若栈为空则返回null。

E pop()  -- 用于获取并移除当前栈中的首元素,若栈为空则返回null。

E push(E item) -用于将参数指定的元素加入到当前栈的顶端,

Queue接口(重点)

基本概念

java.util.Queue接口是Collection接口的子接口,与List接口是平级关系。

该接口主要用于描述具有先进先出特征的数据结构,叫做队列(first in first out FIFO).

该接口的主要实现类为:LinkedList类,该类在增删方法有很大的优势。

 

常见的方法

boolean offer(E e) - 用于将参数指定的元素e插入当前队列的末尾,成功返回true,否则返回false。

E poll() - 用于获取并移除当前队列中的队首元素,若队列为空则返回null。

E peek() - 用于查看当前队列的队首元素,若队列为空则返回null。

       泛型机制(理解即可)

目前集合中之所以可以放入不同类型的元素,是因为集合将所有放入的元素都看做Object类型处理的,当从集合中获取元素时得到的也是Object类型,为了表达该元素真实的数据类型就需要强制类型转换,而该方式可能引发类型转换异常。

    为了避免上述错误的发生,从jdk1.5开始提出泛型机制,也就是在集合名称的右侧使用<数据类型>的方式明确要求该集合可以存放的数据内容,若放入其他内容则编译报错。

如:

    List<Integer> lt1 = new LinkedList<Integer>(); 

原理(尽量理解):

    泛型机制的本质就是参数化类型,也就是在集合的定义中使用<E>作为形式参数负责占位,当创建集合的对象时<>中的数据类型作为实际参数来初始化形式参数E,此时集合内部的所有E就被替换为<>中的数据类型,从而实现了数据类型作为参数的传递。

    由于实际参数的类型可以有多种选择,从而使得同一个集合可以支持广泛的数据类型,因此得名为"泛型机制"。

 

Collection与Collections

接口Collection代表所有集合的根类

Collections 是一个包装类

它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

二、学生管理系统

package com.qfedu.zhuguangyi.homework;

public class Students {
	private String stuNum;
	private String name;
	private String sex;
	public String getStuNum() {
		return stuNum;
	}
	public void setStuNum(String stuNum) {
		this.stuNum = stuNum;
	}
	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;				
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getGrade() {
		return grade;
	}
	public void setGrade(int grade) {
		if(grade>0&&grade<100)
			this.grade = grade;
	}
	private int age;
	private int grade;
	public String toString(){
		return getStuNum()+"\t"+getName()+"\t"+getSex()+"\t"+getAge()+"\t"+getGrade();
	}
	
 
}
package com.qfedu.zhuguangyi.homework;

import java.util.Scanner;
 
 
public class Tools {
	private static Students[] stus = new Students[20];
	
	private static int dataIndex = 0;
	public void printMenu(){
		System.out.println("1、添加学生信息");
		System.out.println("2、修改学生信息");
		System.out.println("3、删除学生信息");
		System.out.println("4、查找学生信息");
		System.out.println("5、打印学生信息");
		System.out.println("6、退出");
	}
	//输入学生数据
	public Students stuSet(){
		Scanner scan = new Scanner(System.in);
		Students stu = new Students();
		String stuNum=stu.getStuNum();
		System.out.print("请输入学号:  ");
		stuNum = scan.next();
		stu.setStuNum(stuNum);
		String name=stu.getName();
		System.out.print("请输入姓名:  ");
		name = scan.next();
		stu.setName(name);
		while (true){
			String sex=stu.getSex();
			System.out.print("请输入性别:  ");
			sex = scan.next();
			if("男".equals(sex)||"女".equals(sex)){
				stu.setSex(sex);
				break;
			}
			else{
				System.out.println("输入性别格式错误,只能输入男或女");
			}
		}
		int age=stu.getAge();
		System.out.print("请输入年龄:  ");
		age = scan.nextInt();
		stu.setAge(age);
		while (true){
			int grade=stu.getGrade();
			System.out.print("请输入分数:  ");
			grade = scan.nextInt();
			if(grade<=100&&grade>=0){
				stu.setGrade(grade);
				break;
			}
			else{
				System.out.println("输入成绩格式错误,只能输入0到100间整数");
			}
			
		}
		return stu;
		}
	//输入学号
	public Students findByStuNum(){
		Scanner scan = new Scanner(System.in);
		Students stu = new Students();
		String stuNum=stu.getStuNum();
		stuNum = scan.next();
		stu.setStuNum(stuNum);
		return stu;
	}
	//输入姓名
	public Students findByName(){
		Scanner scan = new Scanner(System.in);
		Students stu = new Students();
		String stuName=stu.getName();
		stuName = scan.next();
		stu.setName(stuName);
		return stu;
	}
	//录入数据
	public void insertStu(Students stu){
		if(dataIndex >= stus.length){
			Students[] tempStus = new Students[stus.length + stus.length >> 1];
			for(int i = 0; i < stus.length; i++){
				tempStus[i] = stus[i];
			}
			stus = tempStus;
		}
		stus[dataIndex] = stu;
		dataIndex++;
	}
	//更改学生数据
	public void changeStu(Students stu){
		for(int i = 0; i < dataIndex; i++){
			if(stus[i].getStuNum().equals(stu.getStuNum())){
				stus[i] = stu;
			}
		}
	}
	//删除学生
	public void deleteStu(Students stu){
		for(int i = 0; i < dataIndex; i++){
			if(stus[i].getStuNum().equals(stu.getStuNum())){
				for(int s = 0;s<dataIndex;s++){
					if(s<dataIndex-1){
						stus[i]=stus[i+1];
					}
				}
				dataIndex--;
			}
		}
	}
	//查找学生
	public void findStu(Students stu){
		for(int i = 0; i < dataIndex; i++){
			if(stus[i].getStuNum().equals(stu.getStuNum())){
				System.out.println(stus[i]);
			}
			else if(stus[i].getName().equals(stu.getName())){
				System.out.println(stus[i]);
			}
		}
	}
	//打印学生信息
	public void printStuMenus(){
		for(int i =0;i<dataIndex;i++){
			System.out.println(stus[i]);
		}
	}
}
package com.qfedu.zhuguangyi.homework;

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
 
		Scanner sc = new Scanner(System.in);
		System.out.println("欢迎来到XXX学生信息管理系统!");
		Tools tool = new Tools();		
		title:	while(true){
			tool.printMenu();
		System.out.println("请选择操作");
			switch(sc.nextInt()){
			case 1:
				Students stu = tool.stuSet();
				tool.insertStu(stu);
				System.out.println("数据保存成功\n");
				break ;
			case 2://修改学生信息
				System.out.println("请需要修改的学生信息:");
				Students stu1 = tool.stuSet();
				tool.changeStu(stu1);
				break;
					
			case 3://删除学生信息
				System.out.println("请输入需要删除的学生学号:");
				Students stu2 = tool.findByStuNum();
				tool.deleteStu(stu2);
				System.out.println("删除成功");
				break;
					
			case 4:
				System.out.println("请选择查找方式:");
				System.out.println("1.根据姓名查找学生信息");
				System.out.println("2.根据学号查找学生信息");
				int b = sc.nextInt();
				if(b==1){					
					System.out.println("请输入学生姓名:");
					Students stu3 = tool.findByName();
					tool.findStu(stu3);
					break;
				}
				else if(b==2){
					System.out.println("请输入学生学号:");
					Students stu4 = tool.findByStuNum();
					tool.findStu(stu4);
					break;
				}
					
			case 5:
					
				tool.printStuMenus();;
				break;
			case 6:
				System.out.println("欢迎再次使用本系统,再见!!!");
				break title;
			default:
				break;
			}
		}
 
	}
 
}