一、笔记:
数组:也可以存储对象
Person[] p = new Person[3];//3个Person对象
弊端:长度固定,类型固定,操作极其不方便
集合:用来专门存储一堆对象,可以存储不同类型的对象,长度是可变的
超市储货柜(有序)、超市购物车(无序)
Collection|--List(有序):ArrayList LinkedList Stack..
|--Set(无序):HashSet TreeSet
集合类就是数据结构的封装:
数据结构:存储数据的方式
数据结构:
1.集合
2.线性结构
3.树形结构
4.图形结构
对于数据的操作:
增: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;
}
}
}
}