天天看点

java复习第十天

一、复习内部类

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类添加一个方法,用来为所有学生判卷,并打印成绩排名(名次、姓名)