一、复习内部类
1、成员内部类
可以访问外部类的私有成员,外部类类名.this.属性
构造成员内部类对象,必须先构造一个外部类对象,外部类对象.new 构造内部类对象
2、静态内部类
只能访问外部类的静态成员
构造静态内部类对象时,不再需要构造外部类对象
3、局部内部类
在外部类方法内定义的内部类
不仅能访问外部类的私有成员,而且还能访问外部类的局部变量,但是要求局部变量是final的
4、匿名内部类
局部内部类,用于实现一个借口或者继承一个类,只会构造一次
内部类的作用:
访问外部类的私有成员,不破坏封装。可以给编程带来一些方便
我们可以把接口公开,把接口的实现类以内部类的形式隐藏起来。强制用户通过接口来实现弱耦合
接口+内部类实现多继承
二、List接口的实现类
1、ArrayList
底层使用数组实现
2、Vector
ArrayList 轻量级 快 线程不安全
Vector 重量级 慢 线程安全的
3、LinkedList
底层使用双向循环链表实现
ArrayList 数组 查询快 增删操作慢
LinkedList 链表 查询慢 增删操作快 栈
使用组合复用实现栈
三、Set接口
1、HashSet
Set的实现类的集合对象中不能够有重复元素,HashSet也一样是使用了一种标识来确定元素的不重复,是元素内容不重复
HashSet用一种算法来保证集合中的元素是不重复的,HashSet的底层实现还是数组。
Object类中的hashCode()的方法是所有子类都会继承这个方法,这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模,
模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。
Hash算法是一种散列算法。
注意:所有要存入HashSet的集合对象中的自定义类必须覆盖hashCode(),equals()两个方法,才能保证集合中元素容不重复。
在覆盖hashCode()方法时,要使相同对象的hashCode()方法返回相同值,覆盖equals()方法再判断其内容。为了保证效率,所以在覆盖hashCode()方法时,也要尽量使不同对象尽量返回不同的Hash码值。
如果数组中的元素和要加入的对象的hashCode()返回了相同的Hash值(相同对象返回相同整数),才会用equals()方法来判断两个对象的内容是否相同(不同对象返回不同整数)。
练习:
把若干Employee对象放在Set中并遍历,要求没有重复元素
2、SortedSet接口是Set的子接口。
TreeSet是SortedSet接口的实现类,他可以对集合中的元素进行排序。
要存放在TreeSet中自定义类的对象,这个类要么是已经实现了Comparable接口,要么是能给出Comparator比较器,
TreeSet可以自动过滤掉重复元素所以不用重载hashCode()方法,TreeSet会根据比较规则判断元素内容是否相同,TreeSet会在元素存入时就进行了排序。
判断对象重复的依据:compareTo()方法的返回值为0,就是重复元素
(在TreeSet给出排序规则时,一定要注意对象内容相等的条件,一定要注意在主观的认为两个对象内容相同时,才可以使用比较少的条件来进行判断)
在要排序时才使用TreeSet类(存储效率比较低),HashSet的存储效率比较高,在需要为HashSet的对象排序时,就可以把HashSet中的元素放入TreeSet。
四、Map
Map中只可以存放键值对(Key,value),其中Key是不可以重复的。Key和value是一一对应的。
HashMap,是Map接口的实现类,Key时无序存放的,其中Key是不可以重复的,它也是通过Hash码值来保证Key不重复的,Key和value是一一对应的。
如果要加入的键值对和HashMap中键值对的Key是相同的就会将这个集合中的Key所队应的value值进行覆盖,在使用自定义类型作为Key时,那就是要覆盖hashCode(),equals()方法,也就是和HashSet中要放入自定义类型是的处理方法相同。
这个类的对象是线程不安全的。
遍历:(1)vlaues() 返回所有值(value)的集合,是一个Collection
(2)keySet() 返回所有键对象的集合,是一个Set
过遍历这个Set,用get()方法来获得Key所对应的value,也就遍历了Map。
Hashtable,也是Map接口的实现类,他和HashMap比较相似,只不过这个类对象是重量级的,也是线程安全的。他不允许Key和value为null。
Properties,这个类是Hashtable的子类,他的Key和value只能是字符串。
SortedMap是Map的子接口
TreeMap,是SortedMap的实现类,他会按照Key进行排序。和TreeSet类一样,在使用自定义类作Key时,要用自定义类实现Comparable接口。
练习:
达内希望在学生毕业的时候统计出学生在校期间考试成绩的排名,写一个Student类,其中用集合来管理每个学生的各个科目的考试成绩,
将多个Student对象放在集合中,打印出学生的总分以及排名
(集合)
改写Bank类,采用集合的方式来管理多个Account对象
为Bank类添加一个方法
打印所有用户的总资产排名
说明:一个用户可能会有多个账号,以身份证号为准.总资产指多个账户余额的总和,不需要考虑贷款账户的贷款额
考试系统
Exam类 考试类
属性: 若干学生 一张考卷
提示:学生采用HashSet存放
Paper类 考卷类
属性:若干试题
提示:试题采用HashMap存放,key为String,表示题号,value为试题对象
Student类 学生类
属性:姓名 一张答卷 一张考卷
Question类 试题类
属性:题号 题目描述 若干选项 正确答案(多选)
提示:若干选项用ArrayList
AnswerSheet类 答卷类
属性:每道题的答案
提示:答卷中每道题的答案用HashMap存放,key为String,表示题号,value为学生的答案
问题:为Exam类添加一个方法,用来为所有学生判卷,并打印成绩排名(名次、姓名)
1、成员内部类
可以访问外部类的私有成员,外部类类名.this.属性
构造成员内部类对象,必须先构造一个外部类对象,外部类对象.new 构造内部类对象
2、静态内部类
只能访问外部类的静态成员
构造静态内部类对象时,不再需要构造外部类对象
3、局部内部类
在外部类方法内定义的内部类
不仅能访问外部类的私有成员,而且还能访问外部类的局部变量,但是要求局部变量是final的
4、匿名内部类
局部内部类,用于实现一个借口或者继承一个类,只会构造一次
内部类的作用:
访问外部类的私有成员,不破坏封装。可以给编程带来一些方便
我们可以把接口公开,把接口的实现类以内部类的形式隐藏起来。强制用户通过接口来实现弱耦合
接口+内部类实现多继承
二、List接口的实现类
1、ArrayList
底层使用数组实现
2、Vector
ArrayList 轻量级 快 线程不安全
Vector 重量级 慢 线程安全的
3、LinkedList
底层使用双向循环链表实现
ArrayList 数组 查询快 增删操作慢
LinkedList 链表 查询慢 增删操作快 栈
使用组合复用实现栈
三、Set接口
1、HashSet
Set的实现类的集合对象中不能够有重复元素,HashSet也一样是使用了一种标识来确定元素的不重复,是元素内容不重复
HashSet用一种算法来保证集合中的元素是不重复的,HashSet的底层实现还是数组。
Object类中的hashCode()的方法是所有子类都会继承这个方法,这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模,
模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。
Hash算法是一种散列算法。
注意:所有要存入HashSet的集合对象中的自定义类必须覆盖hashCode(),equals()两个方法,才能保证集合中元素容不重复。
在覆盖hashCode()方法时,要使相同对象的hashCode()方法返回相同值,覆盖equals()方法再判断其内容。为了保证效率,所以在覆盖hashCode()方法时,也要尽量使不同对象尽量返回不同的Hash码值。
如果数组中的元素和要加入的对象的hashCode()返回了相同的Hash值(相同对象返回相同整数),才会用equals()方法来判断两个对象的内容是否相同(不同对象返回不同整数)。
练习:
把若干Employee对象放在Set中并遍历,要求没有重复元素
2、SortedSet接口是Set的子接口。
TreeSet是SortedSet接口的实现类,他可以对集合中的元素进行排序。
要存放在TreeSet中自定义类的对象,这个类要么是已经实现了Comparable接口,要么是能给出Comparator比较器,
TreeSet可以自动过滤掉重复元素所以不用重载hashCode()方法,TreeSet会根据比较规则判断元素内容是否相同,TreeSet会在元素存入时就进行了排序。
判断对象重复的依据:compareTo()方法的返回值为0,就是重复元素
(在TreeSet给出排序规则时,一定要注意对象内容相等的条件,一定要注意在主观的认为两个对象内容相同时,才可以使用比较少的条件来进行判断)
在要排序时才使用TreeSet类(存储效率比较低),HashSet的存储效率比较高,在需要为HashSet的对象排序时,就可以把HashSet中的元素放入TreeSet。
四、Map
Map中只可以存放键值对(Key,value),其中Key是不可以重复的。Key和value是一一对应的。
HashMap,是Map接口的实现类,Key时无序存放的,其中Key是不可以重复的,它也是通过Hash码值来保证Key不重复的,Key和value是一一对应的。
如果要加入的键值对和HashMap中键值对的Key是相同的就会将这个集合中的Key所队应的value值进行覆盖,在使用自定义类型作为Key时,那就是要覆盖hashCode(),equals()方法,也就是和HashSet中要放入自定义类型是的处理方法相同。
这个类的对象是线程不安全的。
遍历:(1)vlaues() 返回所有值(value)的集合,是一个Collection
(2)keySet() 返回所有键对象的集合,是一个Set
过遍历这个Set,用get()方法来获得Key所对应的value,也就遍历了Map。
Hashtable,也是Map接口的实现类,他和HashMap比较相似,只不过这个类对象是重量级的,也是线程安全的。他不允许Key和value为null。
Properties,这个类是Hashtable的子类,他的Key和value只能是字符串。
SortedMap是Map的子接口
TreeMap,是SortedMap的实现类,他会按照Key进行排序。和TreeSet类一样,在使用自定义类作Key时,要用自定义类实现Comparable接口。
练习:
达内希望在学生毕业的时候统计出学生在校期间考试成绩的排名,写一个Student类,其中用集合来管理每个学生的各个科目的考试成绩,
将多个Student对象放在集合中,打印出学生的总分以及排名
(集合)
改写Bank类,采用集合的方式来管理多个Account对象
为Bank类添加一个方法
打印所有用户的总资产排名
说明:一个用户可能会有多个账号,以身份证号为准.总资产指多个账户余额的总和,不需要考虑贷款账户的贷款额
考试系统
Exam类 考试类
属性: 若干学生 一张考卷
提示:学生采用HashSet存放
Paper类 考卷类
属性:若干试题
提示:试题采用HashMap存放,key为String,表示题号,value为试题对象
Student类 学生类
属性:姓名 一张答卷 一张考卷
Question类 试题类
属性:题号 题目描述 若干选项 正确答案(多选)
提示:若干选项用ArrayList
AnswerSheet类 答卷类
属性:每道题的答案
提示:答卷中每道题的答案用HashMap存放,key为String,表示题号,value为学生的答案
问题:为Exam类添加一个方法,用来为所有学生判卷,并打印成绩排名(名次、姓名)