Java高级程序设计实战教程
上QQ阅读APP看书,第一时间看更新

2.3 任务实施

任务一 使用List存取用户信息,并做增删改查操作

1. 任务知识

(1)List接口

List继承自Collection接口。List是一种有序集合,List中的元素可以根据索引(顺序号:元素在集合中处于的位置信息)进行查询/删除/插入操作。

跟Set集合不同的是,List允许有重复元素。对于满足e1.equals(e2)条件的e1与e2对象元素,可以同时存在于List集合中。

(2)List实现类

List接口的实现类主要有ArrayList、LinkedList、Vector、Stack等。

(3)ArrayList常用方法

一般主要使用的ArrayList方法,如表2-2所示。

表2-2 ArrayList主要方法

(4)List一般用法

在使用List集合时,通常情况下声明为List类型,实例化时根据实际情况的需要,实例化为ArrayList或LinkedList。

① 声明一个list的示例如下:

List<String>  l1 = new ArrayList<String>();    //利用ArrayList类实例化List集合 
List<String>  l2 = new LinkedList<String>();   //利用LinkedList类实例化List集合 

② 向list中存值的示例如下:

l1.add("张三"); 
l2.set(1, "汪涵");    //将索引位置为1的对象e修改为对象“汪涵”

③ 遍历list的示例如下:

Iterator it = l2.iterator(); 
while (it.hasNext()) { 
     System.out.println(it.next()); 
  } 
} 

2. 任务需求

使用List存取用户信息,并做增删改查操作。

3. 任务分析

一个班级之中存在若干个学生,通过一个实体类定义一个学生相对应的基本信息,然后通过一个List集合进行存储,实现对学生基本信息的CURD。类图如图2-3所示。

图2-3 测试存取用户信息的类图

4. 任务实现

User.java

package com.daiinfo.seniorjava.ken2.implement.list; 
public class User { 
    String name; 
    String email; 
    public User(String name, String emailString) { 
        this.name = name; 
        this.email = emailString; 
    } 
    public String getName() { 
        return name; 
    } 
    public void setName(String name) { 
        this.name = name; 
    } 
    public String getEmail() { 
        return email; 
    } 
    public void setEmail(String email) { 
        this.email = email; 
    } 
} 

TestList.java

package com.daiinfo.seniorjava.ken2.implement.list; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import java.util.ListIterator; 
public class TestList { 
    public static void main(String[] args) { 
        List<User> list=new  ArrayList<User>(); 
        list.add(new User("小明", "xiaoming@qq.com")); 
         
        User xiaozhang=new User("小张","xiaozhang@qq.com"); 
        User xiaohu=new User("小胡", "xiaohu@qq.com"); 
        list.add(xiaozhang); 
        list.add(xiaohu); 
             
        //遍历 
        //方法1   
        ListIterator<User> it1 = list.listIterator(); 
        System.out.println("方法1 "); 
        while(it1.hasNext()){ 
           User user=it1.next(); 
           System.out.println(user.getName()+user.getEmail()); 
        } 
      //方法2 
        System.out.println("方法2 "); 
        for(Iterator<User> it2 = list.iterator();it2.hasNext();){ 
            User user=it2.next(); 
            System.out.println(user.getName()+user.getEmail()); 
        } 
         
      //方法3 
        System.out.println("方法3 "); 
        for(User tmp:list){ 
            System.out.println(tmp.getName()+tmp.getEmail()); 
        } 
        //方法4 
        System.out.println("方法4 "); 
        for(int i = 0;i < list.size(); i ++){ 
            System.out.println(list.get(i).getName()+list.get(i).getEmail()); 
        } 
         
        //移除列表中的元素 
        list.remove(1); 
         
        System.out.println("方法3 "); 
        for(User tmp:list){ 
            System.out.println(tmp.getName()+tmp.getEmail()); 
        } 
    } 
} 

运行结果如图2-4所示。

图2-4 ArrayList测试运行结果图

说明:

① 使用add()方法向列表的尾部或指定位置添加指定的元素。

list.add(new User("小明", "xiaoming@qq.com")); 
User xiaozhang=new User("小张","xiaozhang@qq.com"); 
list.add(xiaozhang); 

② 使用set()方法替换列表中指定位置的元素;使用get()方法返回列表中指定位置的元素。

list.get(i);
list.set(1,"小胡");

③ 使用remove(int index)方法移除列表中指定位置的元素。

④ 使用listIterator()方法返回此列表元素的列表迭代器。利用迭代最大的好处就程序员不用再去为了索引越界等等异常所苦恼了,只需在迭代过程中对列表元素进行操作即可。

ListIterator<Integer> iterator = list.listIterator();   
while (iterator.hasNext()) { 
   System.out.println(); 
} 

任务二 使用Set存取数据,并做增删改查操作

1. 任务知识

(1)Set接口

Set是继承于Collection的接口。Java中的set接口有如下特点。

• 不允许出现重复元素;

• 集合中的元素位置无顺序;

• 有且只有一个值为null的元素。

(2)Set接口的实现类

实现了Set接口的主要有HashSet、TreeSet、LinkedHashSet。

HashSet依赖于HashMap,它实际上是通过HashMap实现的。HashSet中的元素是无序的。

TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。TreeSet中的元素是有序的。

(3)HashSet常用方法

HashSet是存在于Java.util包中的类。同时也被称为集合,一般常用的方法如表2-3所示。

表2-3 HashSet常用方法

(4)Set接口的一般用法。

在使用Set集合时,通常情况下声明为Set类型,实例化时根据实际情况的需要,实例化为HashSet或TreeSet。

① 创建HashSet对象的示例如下:

HashSet hashSet=new HashSet(); 

② 添加元素的示例如下:

hashset.add("abc"); 

③ 删除元素的示例如下:

hashset.clear()             //从此 set 中移除所有元素。 
hashset.remove(Object o)    //如果指定元素存在于此 set 中,则将其移除。

④ 遍历HashSet的示例如下:

Iterator it = hashset.iterator();   
            while(it.hasNext()){} 

2. 任务需求

使用Set存储学生信息,并进行CRUD操作。

3. 任务分析

一个班级之中存在若干个学生,通过一个实体类定义一个学生相对应的基本信息,然后通过一个Set集合进行存储,实现对学生基本信息的CURD。

类图关系如图2-5所示。

图2-5 HashSet测试类图

4. 任务实现

Student.java

package com.daiinfo.seniorjava.ken2.implement.hashset; 
class Student { 
    private String name; 
    private int age; 
    public Student(String name, int age) { 
        this.name = name; 
        this.age = age; 
    } 
    // 复写hashCode方法     
     @Override 
    public int hashCode() { 
        return 60; 
    } 
    // 复写equals方法 
    @Override 
    public boolean equals(Object arg0) { 
        if (!(arg0 instanceof Student)) { 
            return false; 
        } 
        Student studet = (Student) arg0; 
        return this.name.equals(studet.name) && this.age == studet.age; 
    } 
    public String getName() { 
        return name; 
    } 
    public void setName(String name) { 
        this.name = name; 
    } 
    public int getAge() { 
        return age; 
    } 
    public void setAge(int age) { 
        this.age = age; 
    } 
} 

TestHashSet.java

package com.daiinfo.seniorjava.ken2.implement.hashset; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.Iterator; 
import java.util.Map.Entry; 
import java.util.Set; 
public class TestHashSet{ 
    public static void hashSet1() { 
        HashSet<String> hashSet = new HashSet<String>(); 
        hashSet.add("java001"); 
        hashSet.add("java01"); 
        hashSet.add("java011"); 
        hashSet.add("java002"); 
        hashSet.add("java004"); 
        // 使用常用迭代器获取输出内容 
        Iterator<String> iterator = hashSet.iterator(); 
        while (iterator.hasNext()) { 
            String next = iterator.next(); 
            System.out.println(next); 
        } 
    } 
    public static void hashSet2() { 
        HashSet<Student> hashSet = new HashSet<Student>(); 
        hashSet.add(new Student("zhangsan1", 21)); 
        hashSet.add(new Student("zhangsan1", 21)); 
        hashSet.add(new Student("zhangsan2", 21)); 
        hashSet.add(new Student("zhangsan3", 23)); 
        hashSet.add(new Student("zhangsan4", 24)); 
        // 使用常用迭代器获取值 
        Iterator<Student> iterator = hashSet.iterator(); 
        while (iterator.hasNext()) { 
            Student next = (Student) iterator.next(); 
            System.out.println(next.getName() + " " + next.getAge()); 
        } 
    } 
    public static void main(String[] args) { 
        hashSet1(); 
        hashSet2(); 
    } 
} 

运行结果如图2-6所示。

图2-6 HashSet测试运行结果图

任务三 使用Map存取数据,并做增删改查操作

1. 任务知识

(1)Map接口

Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value。Map中的键值对以Entry类型的对象实例形式存在。键值(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个键最多只能映射到一个值。Map支持泛型,形式如:Map<K,V>。Map中使用put(K key, V value)方法添加。

(2)已知实现类

在Java.util包中接口Map<K,V>存储键值对,作为一个元组存入。元组以键作为标记,键相同时,值覆盖。

类型参数有:

• K——此映射所维护的键的类型;

• V——映射值的类型。

其已知实现类为HashMap、TreeMap。

(3)HashMap常用操作说明

HashMap是一个散列表,它存储的内容是键值对(key-value)映射。HashMap继承于AbstractMap,实现了Map、Cloneable、Java.io.Serializable接口。HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。

HashMap的一般主要方法如表2-4所示。

表2-4 HashMap接口主要方法

(4)Map的一般用法

① 声明一个Map的示例如下:

Map map = new HashMap(); 

② 向map中存值的示例如下(注意map是以key-value的形式存放的):

map.put("sa","dd"); 

③ 从map中取值的示例如下:

String str = map.get("sa").toString, 

结果是:

str = "dd'

④ 遍历一个map,从中取得key和value的示例如下:

Map map = new HashMap(); 
for (Object obj : map.keySet()) { 
    Object value = map.get(obj); 
} 

2. 任务需求

使用Map存储学生信息,并进行CRUD操作。

3. 任务分析

一个班级之中存在若干个学生,通过一个实体类定义一个学生相对应的基本信息,然后通过一个Map集合进行key-value键值存储,实现对学生基本信息的CURD。类图如图2-7所示。

图2-7 HashMap测试类图

4. 任务实现

Student.java

package  com.daiinfo.seniorjava.ken2.implement.hashmap; 
import java.util.HashSet; 
import java.util.Set; 
/ ** 
 * 学生类 
 * @author daiyuanquan 
 * @version 1.0 
 * / 
public class Student { 
    public String id; 
    public String name; 
     
    / ** 
     * 构造函数 
     * @param id 
     * @param name 
     * / 
    public Student(String id,String name){ 
        this.id = id; 
        this.name = name; 
    } 
} 

TestMap.java

package com.daiinfo.seniorjava.ken2.implement.hashmap; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Scanner; 
import java.util.Set; 
/ ** 
 * 测试Map应用 
 * @author daiyuanquan 
 * 
 * / 
public class TestMap { 
    //创建一个Map属性用来承装学生对象 
    public Map<String,Student> student; 知识领域2
     
    / * 
     * 在构造器中初始化学生属性 
     * / 
    public TestMap(){ 
        this.student = new HashMap<String,Student>(); 
    } 
     
    / * 
     * 添加方法:输入学生ID,判断是否被占用, 
     * 如果未被占用,则输入姓名,创建新学生对象,添加到student中 
     * / 
    public void testPut(){ 
        //创建一个Scanner对象,输入学生ID 
        Scanner sc = new Scanner(System.in); 
        int i = 0; 
        while(i<3){ 
            System.out.println("请输入学生ID:"); 
            String stuID = sc.next(); 
            Student stu = student.get(stuID); 
            if(stu == null){ 
                System.out.println("请输入学生姓名:"); 
                String stuName = sc.next(); 
                Student newStudent = new Student(stuID,stuName); 
                student.put(stuID, newStudent); 
                System.out.println("成功添加学生:"+student.get(stuID).name); 
                i++; 
            }else{ 
                System.out.println("该学生ID已被占用!"); 
                continue; 
            } 
        } 
    } 
     
    / * 
     * 测试Map的keySet方法 
     * / 
    public void testKeySet(){ 
        //通过keySet方法,返回Map中所有“键”的Set集合 
        Set<String> keySet = student.keySet(); 
        //取得student的容量 
        System.out.println("总共有"+student.size()+"个学生;"); 
        //遍历keySet,取得每一个键,再调用get方法取得每个键对应的value 
        for (String stuID : keySet) { 
            Student stu = student.get(stuID); 
            if(stu != null){ 
                System.out.println("学生:"+stu.name); 
            } 
        } 
    } 
         
    / * 
     * 通过entrySet来遍历Map 
     * / 
    public void testEntrySet(){ 
        //通过entrySet返回Map中所有的键值对 
        Set<Entry<String,Student>> entrySet = student.entrySet(); 
        for(Entry<String,Student> entry:entrySet){ 
            System.out.println("取得键:"+entry.getKey()); 
            System.out.println("对应的值为:"+entry.getValue().name); 
        } 
    } 
         
    / * 
     * 删除Map中的映射 
     * / 
    public void testRemove(){ 
        Scanner sc = new Scanner(System.in); 
        while(true){ 
            System.out.println("请输入要删除的学生ID:"); 
            String stuID = sc.next(); 
            //判断输入的ID是否存在对应的学生对象 
            Student stu = student.get(stuID); 
            if(stu == null){ 
                System.out.println("输入的学生ID不存在!"); 
                continue; 
            } 
            student.remove(stuID); 
            System.out.println("成功删除学生"+stu.name); 
            break; 
        } 
        testEntrySet(); 
    }
        
    / * 
     * 使用put方法修改Map中已有的映射 
     * / 
    public void testModify(){ 
        System.out.println("请输入要修改的学生ID:"); 
        Scanner sc = new Scanner(System.in); 
        while(true){ 
            String id = sc.next(); 
            Student stu = student.get(id); 
            if(stu == null){ 
                System.out.println("ID不存在!"); 
                continue; 
            } 
            System.out.println("当前学生是:"+stu.name); 
            System.out.println("请输入新的学生:"); 
            String name = sc.next(); 
            Student newStu = new Student(id,name); 
            student.put(id, newStu); 
            System.out.println("修改成功!"); 
            break; 
        } 
    } 
         
    / * 
     * 测试Map中是否存在某个key值或value值 
     * / 
    public void testContainsKey(){ 
        System.out.println("请输入学生ID:"); 
        Scanner sc = new Scanner(System.in); 
        String stuID = sc.next(); 
        //用containsKey()方法来判断是否存在某个key值 
        System.out.println("输入的ID为:"+stuID+",在学生列表中是否存在:"+student.containsKey(stuID)); 
        if(student.containsKey(stuID)){ 
            System.out.println("学生的姓名为:"+student.get(stuID).name); 
        } 
         
        System.out.println("请输入学生姓名:"); 
        String name = sc.next(); 
        //用containsValue()方法来判断是否存在某个value值 
        if(student.containsValue(new Student(null,name))){ 
            System.out.println("存在学生"+name); 
        }else{ 
            System.out.println("学生不存在!"); 
        } 
    } 
         
    public static void main(String[] args) { 
        TestMap mt = new TestMap(); 
        mt.testPut(); 
        mt.testKeySet(); 
    } 
} 

运行结果如图2-8所示。

图2-8 HashMap测试结果图