《Java大学教程》—第17章 Java聚焦类框架

时间:2023-08-31 20:11:14

由所有聚焦类构成,在java.util包中,包含三个重要接口:
*    List列表:元素为单个对象,元素在列表中是有序、可重复
*    Set集合:元素为单个对象,元素在集合中无序、不可重复
*    Map映射:元素为成对对象(第一个对象是关键字,第二个对象是值),元素在映射中无序,关键字不可重复
注:JCF不能存储基本数据类型。

17.2 List接口和ArrayList类
*    ArrayList类
*    LinkedList类

17.2.1    泛型(generics):允许设定存在在特定聚焦类对象中的对象类型。可以将一个或多个类型作为参数发送到一个类(或接口)中,亦被称为参数化类型。
优点:允许编译检查类型;不必进行对象类型转换;避免产生ClassCastException异常。

17.2.2    使用接口类型代替实现类型作为函数的形参
允许将来修改实现的方式而不必修改形参中对象的类型。

17.2.3    List接口的方法
操作:增加(add)❶将元素插在列表的末尾;❷将元素插入到列表中指定的位置。
注:使用索引插入参数到列表中时,必须保证索引是当前列表中的有效位置
修改(set)、删除(delete)
列表:显示(toString)、总数(size)、是否空(isEmpty)
元素:位置(indexOf)返回指定对象在列表中第一次出现时的索引。
获取(get)、存在(contains)

17.3    增强的for循环:数组、List接口、Set接口
不能用于修改或删除原始集合中的元素,因为编译可以通过,但是有可能导致程序结果不可预测。

17.4    Set接口和HashSet类
*    HashSet类
*    TreeSet类

17.4.1    Set接口的方法
操作:增加和修改(add)、删除(remove)
列表:显示(toString)、总数(size)、是否空(isEmpty)
元素:获取(get)、存在(contains)

17.4.3    Iterator接口:用于修改和删除Set中的元素
使用Set对象中提供的Iterator对象。

17.5    Map接口和HashMap类
*    HashMap类
*    TreeMap类

Map接口的方法:
操作:增加和修改(put)、删除(remove)
元素:关键字存在(containsKey)、值存在(containsValue)、值获取(get)

17.6    JCF中使用自定义类
方法重写:toString();    equals();    hashCode()

自测题:
1. 三种接口的区别:
*    List列表:元素为单个对象,元素在列表中是有序、可重复
*    Set集合:元素为单个对象,元素在集合中无序、不可重复
*    Map映射:元素为成对对象(第一个对象是关键字,第二个对象是值),元素在映射中无序,关键字不可重复

2.    Map<String, Student> javaStudents = new HashMap<String, Student>();
a)    允许将来修改实现的方式而不必修改形参中对象的类型。

b)    可以将一个或多个类型作为参数发送到一个类(或接口)中,亦被称为参数化类型。
优点:允许编译检查类型;不必进行对象类型转换;避免产生ClassCastException异常。

c)    javaStudents.put("U0012345","Fadi");
javaStudents定义的是Student类型,不能接收String类型的数据。

3.    StockItem类
a)   

public String toString(){
return "("+stockNumber+","+name+","+price+","+totalStock+")\n";
}

b)

public boolean equals(Object objIn){
StockItem st = (StockItem) objIn;
return stockNumber.equals(st.stockNumber);

c)

public int hashCode(){
return stockNumber.hashCode();
}

4.
a)

String tmpString;
boolean first=true;
if (regNums.size()==0){
tmpString="{}";
} else {
StringBuilder sb = new StringBuilder();
for (String item: regNums){
if (first) {
sb.append("{"+item);
first = false;
} else {
sb.append(","+item);
}
}
sb.append("}");
System.out.println(sb);

b)

Iterator<String> elements = regNums.iterator();
while(elements.hasNext()){
String item = elements.next();
if (item.charAt(item.length()-1)=='S'
elements.remove();
}

编程练习:代码附件
1.    NameStack.java    NameStackException.java    NameStackTest.java
a)    因为需要可变大小的存储空间,而存储的对象必须是有序的,但是是可以重复的。

2.    CarRegister.java    CarRegisterException.java        CarRegisterTest.java
a)    因为需要可变大小的存储空间,而存储的对象可以是无序的,但是必须惟一。

3.    Book.java        Library.java    LibraryTest.java

4.    Bank.java        BankAccount.java        BankTest.java
a)    HashMap类适合代替数组实现Bank类。因为其可以满足成对对象集合的需要,还可以确定关键字。