Collection

2016-11-22  本文已影响0人  javaMonkey

////////////2016-11-9 ~ 2016-11-11///////////

int study_data(){

Collection接口:

Collection是最基本的集合接口,

所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这 个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。

如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。

典型的用法如下:

Iterator it = collection.iterator();// 获得一个迭代子

while(it.hasNext()) {

    Object obj = it.next();// 得到下一个元素

}

List接口:

List继承自Collection接口。List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

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

除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素, 还能向前或向后遍历。

实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

LinkedList类:

LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法。insert方法能插入元素在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:

List list = Collections.synchronizedList(newLinkedList(...));

ArrayList类:

ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。

size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。

每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并 没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。

和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

Set接口:

Set继承自Collection接口。Set是一种不能包含有重复元素的集合,即对于满足e1.equals(e2)条件的e1与e2对象元素,不能同时存在于同一个Set集合里,换句话说,Set集合里任意两个元素e1和e2都满足e1.equals(e2)==false条件,Set最多有一个null元素。

因为Set的这个制约,在使用Set集合的时候,应该注意:

1,为Set集合里的元素的实现类实现一个有效的equals(Object)方法。

2,对Set的构造函数,传入的Collection参数不能包含重复的元素。

HashSet类:

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

HashSet不是同步的,需要用以下语句来进行S同步转换:

Set s = Collections.synchronizedSet(new HashSet(...));

TreeSet:

Comparable排序:由类实现Comparable接口,重写CompareTo方法进行排序

public int compareTo(Dog o) {

    return name.compareTo(o.name);

}

Set set4 = new TreeSet();

Comparator排序:自己定义一个实现了 Comparator接口的排序方法进行排序

class AgeNameComparator implements Comparator{

    public int compare(Dog o1, Dog o2) {

        if(o1.age == o2.age)return o1.name.compareTo(o2.name);

        else if(o1.age < o2.age)return -1;

        else return 1;

    }

}

Set set5 = new TreeSet(new AgeNameComparator());

Map:

map作为一个重要的数据结构,最大的优点是支持随机访问。即通过key随机访问值。

在java中的map是一个接口,不能直接实例化,所以需要把实现了map的实现类对象给map赋值。比如可以这样实例化一个map:

Map map = new HashMap();

当map中不存在对应的键时返回null

HashMap实现的map实例是无序的

TreeMap:

Comparable排序:

Map map3 = new TreeMap();

System.out.println("这是一个放入引用数据类型的TreeMap(Comparable排序):");

for(Map.Entry entry:map3.entrySet()){

        System.out.println(entry);

    }

}

Comparator排序:

ValueComparator value = new ValueComparator(map3);

TreeMap map4 = new TreeMap(value);

System.out.println("这是一个放入引用数据类型的TreeMap(Comparator排序):");

map4.putAll(map3);

for(Map.Entry entry:map4.entrySet()){

          System.out.println(entry);

 }

int misson(){

已知有一个Worker类,包括name(String), age(int)和salary(double)三个属性,toString()方法,以及一个work()方法,work方法打印如下格式的句子:

#姓名#开始工作。。。

#姓名#完成工作。。。

任务:

1) 完成一个list,在List 中增加3个工人,基本信息如下:

姓名 年龄 工资

张三 18 3000

李四 25 3500

王五 22 3200

2) 在李四之前插入一个工人,信息为:

姓名:赵六,年龄:24,工资3300

3) 删除王五 的信息

4) 利用for 循环遍历,打印List 中所有工人的信息

5) 利用迭代遍历,对List 中所有的工人调用work 方法。

6) 为Worker 类重写equals 方法,当姓名、年龄、工资全部相等时候才返回true

代码如下:

public class Worker {

    String name;

    int age;

    double salary;

    public Worker(String name,int age,double salary){

        this.name = name;

        this.age = age;

        this.salary = salary;

     }

    public void work(){

        System.out.println(name+"开始工作----");

        System.out.println(name+"完成工作----");

    }

    public String toString(){

        return "[name="+name+",age="+age+",salary="+salary+"]";

    }

    public boolean equals(Object o){

        if(!(o instanceof Worker)){

        return false;

        }else if(o == this){

            return true;

        }else{

            return this.name==((Worker)o).name&&this.age==((Worker)o).age&&

            this.salary==((Worker)o).salary;

        }

     }

}

TestWorker:

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class TestWorker {

    public static void main(String[] args) {

        Listworklist = new ArrayList();

        System.out.println("在List 中增加3个工人");        

        Worker w = new Worker("张三",18,3000);        

        Worker w1 = new Worker("李四",25,3500);       

        Worker w2 = new Worker("王五",22,3200);        

        System.out.println("==================");        

        worklist.add(w);

        worklist.add(w1);

        worklist.add(w2);

        System.out.println("在李四之前插入一个工人赵六");

        Worker w3 = new Worker("赵六",24,3300);

        worklist.add(1,w3);

        System.out.println("==================");

        System.out.println("删除王五 的信息");

        worklist.remove(w2);

        System.out.println("==================");

        System.out.println("利用for 循环遍历,打印List 中所有工人的信息:");

        for(Worker worker:worklist){

            System.out.println(worker);

        }

        System.out.println("==================");

        System.out.println("利用迭代遍历,对List 中所有的工人调用work 方法:");

        Iteratorit = worklist.iterator();

        while(it.hasNext()){

            it.next().work();

        }

        System.out.println("==================");

        System.out.println("为Worker 类重写equals 方法,当姓名、年龄、工资全部相等时候才返回true:");

        Worker w4 = new Worker("王五",22,3200);

        Worker w5 = new Worker("王五",23,3200);

        System.out.println(w4.equals(w2));

        System.out.println(w5.equals(w2));

      }   

 }

}

上一篇下一篇

猜你喜欢

热点阅读