1) 静态的关键字static: 类,方法,属性(是属于类所有的,所有对象共享),静态代码段(执行时机 类加载)
2) 内部类:基本应用swing中的事件的监听 内部类中可以直接访问外部类的成员,反之则不行; 闭包; 还是多继承的一种处理方式
3) 方法的调用: 递归调用
4) 方法的参数传递: 值传递 对于基本类型和引用类型传递规律(String 的不变性)
5) 方法的可变参数: … void t(int … args){}
6) 断言:了解 assert Boolean: “提示信息”;
7) Arrays的常见方法
还行,就是老师没讲我昨天碰到的困惑,就是哪个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();
}
}
主要的是学习集合框架中常见的接口,接口的实现类,以及对应的方法和应用场景;
构造方法摘要
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;
}
}
}
}
查询所有,增加 ; 查找单个员工,和之前的菜单的功能整合到一起;
完整的代码
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;取出来的时候可能需要类型的转换;
泛型 本质上认为是一个种类型检查的机制,存放元素到集合要进行检查,取出来不需要强制转型了;
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);
}
}
}
后面我们会介绍比较复杂的泛型,支持继承关系的,自定义泛型等等
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);
}
}
0,10
2,10
1
abc
List接口是ArrayList,LinkedList,以及Vector类的父接口;
这个接口的特性如下:
//父接口 引用名 = new 子类[实现类]对象();
List list = new ArrayList();
List list = new LinkedList();
List list = new Vector();
List list = new List(); 这样是错误的,接口不能直接实例化
简单认识一下collection接口;是list接口的父接口;
我们前面遍历集合(ArrayList LinkedList Vector) 我们使用的是Foreach接口(for(类型 对象:集合)) ;除此之外,集合ListApi中还提供了一种新的迭代器;
请使用Iterator来完成对ArrayList和LinkedList的迭代;目的:熟悉其Iterator的语法;
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]
构造方法摘要
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));
}
}
}
将我们之前的EmpManage改成使用HashMap来实现;
1) 集合框架中的接口和类以及方法应用;
2) Collection系列: List(ArrayList LinkedList Vector) List特征? 有序,可重复Set(HashSet) set特征?无序,不可重复
3) Map系列: HashMap key-value
4) 泛型的支持: <类型> 存放数据的时候有验证 ;提取数据的时候 不需要再强制转换
将我们之前的EmpManage改成使用HashMap来实现