Java-类集

类集(java.util)是一种动态的对象数组,属于各个数据结构的实现类。核心操作接口:Collection、List、Set、Map、Iterator、Enumeration

一、单值保存的最大父接口Collection

  1. 数据增加:public boolean add(E e)
  2. 为Iterator接口实例化:public Iterator<E> iterator()

允许重复的子接口:List

(子接口:ArrayList—不用自行实现List类了)

List 接口对Collection接口进行扩充,主要方法有:
1. public E get(int index):取得指定索引位置上的数据
2. public E set(int index, E element):修改指定索引位置上的数据
3. public ListIterator<E> listIterator():为ListIterator接口实例化
package com.joeaaa.demo16;

/*
* 使用ArrayList进行List接口功能验证
*/
import java.util.ArrayList;
import java.util.List;

public class CollectionArrayList {
    public static void main(String[] args) {
        List<String> all = new ArrayList<String>();
        all.add("hello");
        all.add("hello");
        all.add("you");
        System.out.println(all); // [hello, hello, you]
        for (String str : all) {
            System.out.println(str + ","); // hello, hello, you,
        }
    }
}

Q:ArrayList与Vector 的区别

A:ArrayList采用异步处理,性能更高,非线程安全;Vector采用同步处理,性能相对较低,线程安全。在开发一步程序时,首选ArrayList子类。

不允许重复的子接口:Set

Set子接口常用:

  1. HashSet:散列存放的子类,没有顺序,不重复的保存
  2. TreeSet:存放不重复,但有顺序
package com.joeaaa.demo16;

/*
 * HashSet保存数据,不允许重复,无序
 */
import java.util.HashSet;
import java.util.Set;

public class CollectionHashSet {
    public static void main(String[] args) {
        Set<String> all = new HashSet<String>();
        all.add("hello");
        all.add("hello");
        all.add("you");
        all.add("zero");
        System.out.println(all); // [zero, hello, you]
    }
}

package com.joeaaa.demo16;

/*
 * TreeSet保存数据,不允许重复,有序
 */
import java.util.Set;
import java.util.TreeSet;

public class CollectionTreeSet {
    public static void main(String[] args) {
        Set<String> all = new TreeSet<>();
        all.add("A");
        all.add("A");
        all.add("C");
        all.add("B");
        System.out.println(all); // [A, B, C]
    }
}

如果TreeSet要对自定义类的对象进行排序,需要定义Comparable接口,从而指定排序规则。

⚠️注意:

  • Comparable中的compareTo()是用来排序的;
  • 元素重复与否是通过Object的public int hashCode()哈希码和public boolean equals(Object obj)进行比较;
package com.joeaaa.demo16;

/*
 * TreeSet保存数据,不允许重复,有序
 * 实现Comparable接口,进行排序
 */
import java.util.Set;
import java.util.TreeSet;

class Person implements Comparable<Person>{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}'+ "\n";
    }

    @Override
    public int compareTo(Person o) {
        if(this.age > o.age){
            return 1;
        }else if (this.age < o.age){
            return -1;
        }else {
            // return 0;// 只能进行按照int age排序
            return this.name.compareTo(o.name); // 实现年龄+姓名一起排序
        }
    }
}

public class CollectionTreeSet {
    public static void main(String[] args) {
        Set<Person> all = new TreeSet<>();
        all.add(new Person("Joe",20)); // 重复元素,不显示
        all.add(new Person("Alex",20));
        all.add(new Person("Alex",22));
        all.add(new Person("Fio",18));
        System.out.println(all); //
    }
}
[Person{name='Fio', age=18}
 , Person{name='Alex', age=20}
 , Person{name='Joe', age=20}
 , Person{name='Alex', age=22}
 ]

偶对象保存:Map接口

Map保存Key-Value值,有两个子类:HashMap、HashTable

实例化对象:
Map<Integer, String> map = new HashMap<Integer, String>()
  1. 存数据:map.put()
  2. 取数据:map.get()

Connection与Map相比,差别

  • Collection接口设置完对内容目的是为了输出
  • Map接口设置完内容对目的是为了查找

Hashtable

JDK1.2后Hashtable实现了Map接口,使用Hashtable时,与Map相比,Key-value数据不能有空null。


Map使用Iterator输出的操作步骤:

  1. 使用Map接口中的entrySet()方法,将Map集合变为Set集合
  2. 取得Set接口实例之后,用Iterator()方法取得Iterator实例化对象
  3. 利用Iterator迭代,找到每一个Map.Entry对象,并进行key-value分离
package com.joeaaa.demo16;

/*
 * Map使用Iterator输出
 */

import java.util.*;

public class HashMapTest {
    public static void main(String[] args) {
        Map<Integer, String> map = new Hashtable<Integer, String>();
        map.put(1,"hello");
        map.put(0,"helo");
        map.put(3,"you");

        //输出全部的key
        Set<Map.Entry<Integer, String>> set = map.entrySet(); // 取得所有的key
        Iterator<Map.Entry<Integer, String>>iter = set.iterator();
        while (iter.hasNext()){
            Map.Entry<Integer, String> me = iter.next();
            System.out.println(me.getKey()+ me.getValue());
//            3you
//            1hello
//            0helo
        }
    }
}

Q:在一个List中保存了多个String对象,要求将这个List集合转化为Set集合,再将这个Set集合中全部数据保存在Map集合的value中,Map集合的key通过UUID生成,最后将Map中数据进行迭代输出。

package com.joeaaa.demo16;

import java.util.*;

public class UUIDTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("Hello");
        list.add("UUID");
        Set<String> set = new HashSet<String>();
        set.addAll(list); // 将List集合加到Set中
        Map<UUID, String> map = new HashMap<UUID, String>();
        for (String s : set) { // 将数据保存到Map集合
            map.put(UUID.randomUUID(), s);
        }
        for (Map.Entry<UUID, String> me : map.entrySet()) {
            System.out.println(me.getKey() + " --> " + me.getValue());
        }
    }
}
// a5b91e8f-8db3-45e2-a273-808f3fc58cbd --> UUID
// cec50837-6912-4a34-b975-5acff1cf354a --> Hello

三、集合的输出操作

迭代输出:Iterator

  1. 判断是否有下一个元素:public boolean hasNext()
  2. 取得下一个元素:public E next()

对集合进行输出操作,使用Iterator接口完成

package com.joeaaa.demo16;

/*
 * 使用Iterator对集合进行循环输出
 */
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {
    public static void main(String[] args) {
        List<String> all = new ArrayList<String>();
        all.add("hello");
        all.add("hello");
        all.add("you");
        for (String s : all) {
            System.out.println(s); // hello hello you
        } 
    }
}

Enumeration枚举输出

  1. 判断是否有下一个元素:public boolean hasMoreElements()
  2. 取得当前元素:public E nextElement()

通过Vector子类 public Enumeration<E> elements() 获取实例化对象

package com.joeaaa.demo16;

/*
 * 使用Enumeration对Vector类进行输出
 */
import java.util.*;

public class EnumerationTest {
    public static void main(String[] args) {
        Vector<String> all = new Vector<>();
        all.add("hello");
        all.add("helo");
        all.add("you");
        Enumeration<String> enu = all.elements();
        while (enu.hasMoreElements()){
            System.out.println(enu.nextElement()); // hello helo you
        }
    }
}