Java第十三课

  • 1 集合:
    • 1.1 回顾
    • 1.2 作业讲解:
    • 1.3 集合框架:
      • 1.3.1 总体说明:
      • 1.3.2 ArrayList:
      • 1.3.3 课堂练习:员工管理
      • 1.3.4 简单的泛型介绍:
      • 1.3.5 LinkedList:
      • 1.3.6 LinkedList和ArrayList相比:
      • 1.3.7 Vector:
      • 1.3.8 List接口:
      • 1.3.9 迭代器Iterator:
      • 1.3.10 课堂练习(Iterator):
      • 1.3.11 SET接口介绍
      • 1.3.12 HashSet
      • 1.3.13 Collection层次结构图:
      • 1.3.14 Map
      • 1.3.15 HashMap:
      • 1.3.16 课堂练习:
      • 1.3.17 小问题
    • 1.4 总结:
    • 1.5 作业布置:

1 集合:

1.1 回顾

1) 静态的关键字static: 类,方法,属性(是属于类所有的,所有对象共享),静态代码段(执行时机 类加载)
2) 内部类:基本应用swing中的事件的监听 内部类中可以直接访问外部类的成员,反之则不行; 闭包; 还是多继承的一种处理方式
3) 方法的调用: 递归调用
4) 方法的参数传递: 值传递 对于基本类型和引用类型传递规律(String 的不变性)
5) 方法的可变参数: … void t(int … args){}
6) 断言:了解 assert Boolean: “提示信息”;
7) Arrays的常见方法

1.2 作业讲解:

还行,就是老师没讲我昨天碰到的困惑,就是哪个calendar方法中的set:

package day13;

import java.util.Calendar;

public class TestCalendar {

    public static void main(String[] args) {

        Calendar calendar = Calendar.getInstance();

        System.out.println(calendar);
        //重新设置了year的部分
        //此处只是秀给了某个对象的属性值
        calendar.set(Calendar.YEAR, 2016);
        System.out.println(calendar);

    }

}
package day13;

import java.util.Arrays;
import java.util.Comparator;

public class TestArrays {
    public static void main(String[] args) {

        String[] array = { "2", "12", "123", "4" };

        Arrays.sort(array, new Comparator() {
            @Override
            public int compare(String o1, String o2) {
                // TODO Auto-generated method stub
                return Integer.parseInt(o1) - Integer.parseInt(o2);
            }
        });

        for (String string : array) {
            System.out.println(string);
        }

    }

}

Arrays的sort方法还没懂: 先会应用

课后作业
预习 : 集合
编码实现对一个公司的员工进行简单的访问: 增加员工,删除员工,修改员工,查询员工(姓名 查询所有 根据员工编号等);

分析: 每个员工都应该是一个对象(Employee) ->一个公司有多个员工(数组或者集合来处理) ->针对数组的操作: ->增加员工,删除员工,修改员工,查询员工(姓名 查询所有 根据员工编号等

后续将上面的案例使用集合来处理 ->将数据和数据库-> Java+JDBC

实体类

package homework;

/**
 * 公司员工(雇员) 实体类
 * 
 * @author Administrator
 *
 */
public class Employee {

    // 员工编号
    private String empNo;
    // 姓名
    private String empName;
    // 部门
    private String deptName;// 这里后面会变化
    // 工资
    private double salary;

    public Employee() {
        // TODO Auto-generated constructor stub
    }

    public Employee(String empNo, String empName, String deptName, double salary) {
        super();
        this.empNo = empNo;
        this.empName = empName;
        this.deptName = deptName;
        this.salary = salary;
    }

    public String getEmpNo() {
        return empNo;
    }

    public void setEmpNo(String empNo) {
        this.empNo = empNo;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee [empNo=" + empNo + ", empName=" + empName + ", deptName=" + deptName + ", salary=" + salary
                + "]";
    }

}

员工管理类

package homework;

import java.util.Scanner;

/**
 * 员工管理
 * 
 * @author Administrator
 *
 */
public class EmpManage {
    // 有几个员工?多个员工?
    // 我们使用数组可以解决,但是如果数组一旦定义长度就固定了,以后不好扩展
    private Employee emps[] = new Employee[20]; // 默认值 null

    // 通常 增加的操作会写成一个方法
    public void addEmp(Employee emp) {

        for (int i = 0; i < emps.length; i++) {
            if (emps[i] == null) {
                emps[i] = emp;
                System.out.println("增加成功");
                break;
            }
        }

    }

    /**
     * 输入
     */
    public void inputEmp() {

        Scanner input = new Scanner(System.in);
        System.out.println("*********请输入 员工编号,姓名,部门,基本工资**********");
        String empNo = input.nextLine();
        String empName = input.nextLine();
        String deptName = input.nextLine();
        double salary = input.nextDouble();

        Employee emp = new Employee(empNo, empName, deptName, salary);
        addEmp(emp);

    }

    /**
     * 员工的
     */
    public void showEmp() {

        System.out.println("***********公司员工列表如下*****************");
        for (Employee employee : emps) {
            if (employee == null) {
                break;
            }
            System.out.println(employee);
        }

    }

}

测试类:

package homework;

public class TestEmp {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        EmpManage em = new EmpManage();
        //先输入
        em.inputEmp();
        //再显示
        em.showEmp();

    }

}

1.3 集合框架:

1.3.1 总体说明:

主要的是学习集合框架中常见的接口,接口的实现类,以及对应的方法和应用场景;

1.3.2 ArrayList:

先从最简单的一个类入手: ArrayList
Java第十三课_第1张图片

构造方法摘要
ArrayList()
构造一个初始容量为 10 的空列表
ArrayList(int initialCapacity)
构造一个具有指定初始容量的空列表。
重要的方法:

boolean add(E e)
将指定的元素添加到此列表的尾部。
void add(int index, E element)
将指定的元素插入此列表中的指定位置。
void clear()
移除此列表中的所有元素。
boolean contains(Object o)
如果此列表中包含指定的元素,则返回 true。
E
get(int index)
返回此列表中指定位置上的元素。
E
remove(int index)
移除此列表中指定位置上的元素。
boolean remove(Object o)
移除此列表中首次出现的指定元素(如果存在)。
int size()
返回此列表中的元素数。
Object[]
toArray()
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。

常见的方法

package arraylist_package;

import java.util.ArrayList;
import java.util.Date;

import homework.Employee;

public class TestArrayList01 {

    public static void main(String[] args) {

        // 创建一个ArrayList对象
        ArrayList list01 = new ArrayList();
        // 向对象中增加一个元素 参数类型Object
        list01.add(1);
        list01.add("我喜欢学习,不学习就难受");
        list01.add(new Date());
        list01.add(null);
        list01.add(12.25);

        // 能否添加重复的元素?
        list01.add("我喜欢学习,不学习就难受");

        // 添加一个Employee对象
        list01.add(new Employee()); // 这个自定义对象 new

        System.out.println("size :" + list01.size());

        // 将集合中的某个元素删除
        // 索引0表示的是集合中的第一个元素
        list01.remove(0);

        System.out.println("size :" + list01.size());

        // 继续删除
        list01.remove(new Date());
        System.out.println("size :" + list01.size());

        // 继续删除(? 没成功?)
        list01.remove(new Employee());// 这个自定义对象 new 注意一下
        System.out.println("size :" + list01.size());

        if (list01.contains(12.25)) {
            System.out.println("找到了12.25");
        }

        // 遍历集合并输出
        for (int i = 0; i < list01.size(); i++) {
            System.out.println(list01.get(i));
        }

    }

}

一个问题:
Add(任何类型) ->当一个对象存放到ArrayList中的时候,这个对象就自动被装箱(Object),

我们发现,刚刚的代码有效了补充了我们之前案例中高数组的不足:
1. 长度可变 ,
2. 数组定义,数组类型是固定的 ;ArrayList的类型是Ojbect,随意添加各种类型
3. ArrayList中提供了大量已经实现的方法 例如添加add remove 等等,让我们更多的时间去关注业务而不是算法 ;

package arraylist_package;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 员工管理
 * 
 * @author Administrator
 *
 */
public class EmpManage {
    // 有几个员工?多个员工?
    //
    // ArrayList
    private ArrayList emps = new ArrayList();

    /**
     * 增加员工
     * 
     * @param emp
     */
    private void addEmp(Employee emp) {
        emps.add(emp);
        System.out.println("增加成功");

    }

    /**
     * 输入
     */
    private void inputEmp() {

        Scanner input = new Scanner(System.in);
        System.out.println("*********请输入 员工编号,姓名,部门,基本工资**********");
        String empNo = input.nextLine();
        String empName = input.nextLine();
        String deptName = input.nextLine();
        double salary = input.nextDouble();

        Employee emp = new Employee(empNo, empName, deptName, salary);
        addEmp(emp);

    }

    /**
     * 员工的
     */
    private void showEmp() {

        System.out.println("***********公司员工列表如下*****************");
        for (Object employee : emps) {
            System.out.println(employee);
        }

    }

    /**
     * 按照empNo查找并显示结果
     * 
     * @param empNo
     */
    private void findEmp(String empNo) {

        boolean flag = false;

        for (Object object : emps) {

            // 实际的类型是Employee
            if (object instanceof Employee) {
                Employee emp = (Employee) object;
                if (empNo.equals(emp.getEmpNo())) {
                    flag = true;// 找到这个员工
                    System.out.println(emp);
                    break;
                }
            }
        }

        if (!flag) {
            System.out.println("查无此人");
        }
    }

    /**
     * 查询员工编号的 菜单方法
     */
    private void findMenu() {

        Scanner input = new Scanner(System.in);
        System.out.println("*********请输入要查找的 员工编号**********");
        String empNo = input.nextLine(); 
        findEmp(empNo);

    }

    /**
     * 显示主菜单
     */
    public void ShowMenu() {

        while (1 == 1) {

            System.out.println("请输入您的选择0 退出  1 增加员工 2 显示所有员工 3 根据员工编号查询员工 4 删除员工  5修改员工");
            Scanner input = new Scanner(System.in);
            // String choice = input.nextLine();//?可能会有问题
            int choice = input.nextInt();// ?可能会有问题
            switch (choice) {
            case 0:
                System.out.println("系统退出,再见了您~");
                System.exit(0);
                break;
            case 1:
                inputEmp();
                break;
            case 2:
                showEmp();
                break;
            case 3:
                findMenu();
                break;

            default:
                System.out.println("输入有错误~");
                break;
            }
        }
    }

}

查询所有,增加 ; 查找单个员工,和之前的菜单的功能整合到一起;

1.3.3 课堂练习:员工管理

完整的代码

package arraylist_package;

/**
 * 公司员工(雇员) 实体类
 * 
 * @author Administrator
 *
 */
public class Employee {

    // 员工编号
    private String empNo;
    // 姓名
    private String empName;
    // 部门
    private String deptName;// 这里后面会变化
    // 工资
    private double salary;

    public Employee() {
        // TODO Auto-generated constructor stub
    }

    public Employee(String empNo, String empName, String deptName, double salary) {
        super();
        this.empNo = empNo;
        this.empName = empName;
        this.deptName = deptName;
        this.salary = salary;
    }

    public String getEmpNo() {
        return empNo;
    }

    public void setEmpNo(String empNo) {
        this.empNo = empNo;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee [empNo=" + empNo + ", empName=" + empName + ", deptName=" + deptName + ", salary=" + salary
                + "]";
    }

}

创建Emp的管理类(后面还会在分)

package arraylist_package;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 员工管理
 * 
 * @author Administrator
 *
 */
public class EmpManage {
    // 有几个员工?多个员工?
    //
    // ArrayList
    private ArrayList emps = new ArrayList();

    /**
     * 增加员工
     * 
     * @param emp
     */
    private void addEmp(Employee emp) {
        emps.add(emp);
        System.out.println("增加成功");

    }

    /**
     * 输入
     */
    private void inputEmp() {

        Scanner input = new Scanner(System.in);
        System.out.println("*********请输入 员工编号,姓名,部门,基本工资**********");
        String empNo = input.nextLine();
        String empName = input.nextLine();
        String deptName = input.nextLine();
        double salary = input.nextDouble();

        Employee emp = new Employee(empNo, empName, deptName, salary);
        addEmp(emp);

    }

    /**
     * 员工的
     */
    private void showEmp() {

        System.out.println("***********公司员工列表如下*****************");
        for (Object employee : emps) {
            System.out.println(employee);
        }

    }

    /**
     * 按照empNo查找并显示结果
     * 
     * @param empNo
     */
    private void findEmp(String empNo) {

        boolean flag = false;

        for (Object object : emps) {

            // 实际的类型是Employee
            if (object instanceof Employee) {
                Employee emp = (Employee) object;
                if (empNo.equals(emp.getEmpNo())) {
                    flag = true;// 找到这个员工
                    System.out.println(emp);
                    break;
                }
            }
        }

        if (!flag) {
            System.out.println("查无此人");
        }
    }

    /**
     * 查询员工编号的 菜单方法
     */
    private void findMenu() {

        Scanner input = new Scanner(System.in);
        System.out.println("*********请输入要查找的 员工编号**********");
        String empNo = input.nextLine(); 
        findEmp(empNo);

    }

    /**
     * 显示主菜单
     */
    public void ShowMenu() {

        while (1 == 1) {

            System.out.println("请输入您的选择0 退出  1 增加员工 2 显示所有员工 3 根据员工编号查询员工 4 删除员工  5修改员工");
            Scanner input = new Scanner(System.in);
            // String choice = input.nextLine();//?可能会有问题
            int choice = input.nextInt();// ?可能会有问题
            switch (choice) {
            case 0:
                System.out.println("系统退出,再见了您~");
                System.exit(0);
                break;
            case 1:
                inputEmp();
                break;
            case 2:
                showEmp();
                break;
            case 3:
                findMenu();
                break;

            default:
                System.out.println("输入有错误~");
                break;
            }
        }
    }

}
package arraylist_package;

public class TestEmp {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        EmpManage em = new EmpManage();
        //先输入
        //em.inputEmp();
        //再显示
        //em.showEmp();

        em.ShowMenu();

    }

}

创建集合ArrayList对象之后,存放进去的元素都变成了Object;取出来的时候可能需要类型的转换;

1.3.4 简单的泛型介绍:

泛型 本质上认为是一个种类型检查的机制,存放元素到集合要进行检查,取出来不需要强制转型了;

package arraylist_package;

import java.util.ArrayList;

public class TestArrayList02 {

    public static void main(String[] args) {

        // ArrayList is a raw type. References to generic type ArrayList should be
        // parameterized

        ArrayList list = new ArrayList();
        list.add(1);
        list.add(new Object());


        //ArrayList
        //此时 存放数据岛list中的时候 会检测是否是特定的类型 String
        //ArrayList list1 = new ArrayList();
        //<> 泛型  本质上认为是一个种类型检查的机制
        ArrayList list1 = new ArrayList();
        //无法通过编译
        /*list1.add(1);
        list1.add(new Object());*/

        list1.add("abc");

        list1.add("abcd");

        //遍历集合
        for (String string : list1) {
            System.out.println(string);
        }

    }

}

Java第十三课_第2张图片
后面我们会介绍比较复杂的泛型,支持继承关系的,自定义泛型等等

1.3.5 LinkedList:

Java第十三课_第3张图片
构造方法摘要
LinkedList()
构造一个空列表。
Java第十三课_第4张图片
Java第十三课_第5张图片

1.3.6 LinkedList和ArrayList相比:

1) LinkedList增加了很多方法,addFirst,addLast,removeFirst,removeLast等方法;
也正是LinkedList提供了这些方法,所以我们执行删除,插入操作的时候,优先选择使用LinkedLIist;如果是查询的操作,优先选择的是ArrayList;
2) ArrayList是可变长度的数组实现; LInkedList是一个可变长度的链表的实现

package linkedList_package;

import java.util.LinkedList;

public class TestLinkedList {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        LinkedList list = new LinkedList<>();

        list.add("abc");

        list.add("xyyz");

        System.out.println("list .size :" + list.size());

        // 删除
        list.remove(0);
        System.out.println("list .size :" + list.size());

        // 差别来了
        list.addFirst("first");
        System.out.println("list .size :" + list.size());
        list.addLast("last");
        // 输出 list
        // 为什么使用sysout list对象直接得到集合中的元素? 因为Linkedlist类中重写了toString的方法
        System.out.println(list);

        // 删除first last
        list.removeFirst();
        list.removeLast();

        System.out.println("删除first 和last之后的结果 :"+list);

    }

}

1.3.7 Vector:

Java第十三课_第6张图片
支持线程的同步

Java第十三课_第7张图片
其他方法:见api文档

0,10
2,10
1
abc

1.3.8 List接口:

List接口是ArrayList,LinkedList,以及Vector类的父接口;
这个接口的特性如下:

Java第十三课_第8张图片
//父接口 引用名 = new 子类[实现类]对象();
List list = new ArrayList();
List list = new LinkedList();
List list = new Vector();
List list = new List(); 这样是错误的,接口不能直接实例化

简单认识一下collection接口;是list接口的父接口;

1.3.9 迭代器Iterator:

我们前面遍历集合(ArrayList LinkedList Vector) 我们使用的是Foreach接口(for(类型 对象:集合)) ;除此之外,集合ListApi中还提供了一种新的迭代器;

Java第十三课_第9张图片
Java第十三课_第10张图片
思考题
Java第十三课_第11张图片

1.3.10 课堂练习(Iterator):

请使用Iterator来完成对ArrayList和LinkedList的迭代;目的:熟悉其Iterator的语法;
Java第十三课_第12张图片

1.3.11 SET接口介绍

Java第十三课_第13张图片
Java第十三课_第14张图片

1.3.12 HashSet

Java第十三课_第15张图片

package hashset_package;

import java.util.HashSet;
import java.util.Iterator;

import arraylist_package.Employee;

public class TestHashSet {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        HashSet hs = new HashSet<>();

        Employee emp1 = new Employee("001", "张三疯", "安保部", 3);
        Employee emp2 = new Employee("002", "潘安", "公关部", 3000000);
        // 增加数据到集合中
        hs.add(emp1);
        //hs.add(null);
        hs.add(emp2);

        System.out.println("hashset的大小: " + hs.size());

        // 遍历 foreach
        for (Employee employee : hs) {
            System.out.println(employee);
        }
        System.out.println("********");
        // 迭代器
        Iterator itor = hs.iterator();
        while (itor.hasNext()) {
            System.out.println(itor.next());
        }

    }

}

hashset的大小: 2
Employee [empNo=001, empName=张三疯, deptName=安保部, salary=3.0]
Employee [empNo=002, empName=潘安, deptName=公关部, salary=3000000.0]


Employee [empNo=001, empName=张三疯, deptName=安保部, salary=3.0]
Employee [empNo=002, empName=潘安, deptName=公关部, salary=3000000.0]

1.3.13 Collection层次结构图:

层次结构要熟记;各自的特点;
Java第十三课_第16张图片

1.3.14 Map

Java第十三课_第17张图片

1.3.15 HashMap:

Java第十三课_第18张图片
构造方法摘要
HashMap()
构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity)
构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity, float loadFactor)
构造一个带指定初始容量和加载因子的空 HashMap。
HashMap(Map

package hashmap_package;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

public class TestHashMap {
    public static void main(String[] args) {

        // 创建一个HashMap对象
        HashMap hm = new HashMap<>();

        // 添加元素
        hm.put(1, "xyz");
        hm.put(2, "abc");

        // 键 不能重复(如果重复了,喜新厌旧)
        hm.put(1, "我就重复了,怎么地");

        // 大小
        System.out.println("size :" + hm.size());

        // 获取键集合
        Set keyset = hm.keySet();
        System.out.println(keyset);

        // 获取value集合
        Collection valueset = hm.values();
        System.out.println(valueset);

        // 键值对
        // Set> entrySet()
        Set> entis = hm.entrySet();
        System.out.println(entis);

        // 如果我们要通过key得到我们的value?
        String value = hm.get(1);
        System.out.println(value);

        // 遍历? Entry
        for (Entry entry : entis) {
            System.out.println(entry);
        }

        // 先得到keyset ,根据keyset得到value
        /*
         * for (Iterator itor = hm.keySet().iterator(); itor.hasNext();) {
         * Integer key = itor.next(); // 通过key得到value System.out.println("key :" + key);
         * System.out.println("value :" + hm.get(key)); }
         */

        // 写个 while
        Iterator itor = hm.keySet().iterator();
        while (itor.hasNext()) {
            Integer key = itor.next();
            // 通过key得到value
            System.out.println("key :" + key);
            System.out.println("value :" + hm.get(key));
        }

    }

}

1.3.16 课堂练习:

将我们之前的EmpManage改成使用HashMap来实现;

1.3.17 小问题

Java第十三课_第19张图片
Java第十三课_第20张图片

1.4 总结:

1) 集合框架中的接口和类以及方法应用;
2) Collection系列: List(ArrayList LinkedList Vector) List特征? 有序,可重复Set(HashSet) set特征?无序,不可重复
3) Map系列: HashMap key-value
4) 泛型的支持: <类型> 存放数据的时候有验证 ;提取数据的时候 不需要再强制转换

1.5 作业布置:

将我们之前的EmpManage改成使用HashMap来实现

你可能感兴趣的:(JavaSE)