Collection

////////////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));

      }   

 }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • Scala的集合类可以从三个维度进行切分: 可变与不可变集合(Immutable and mutable coll...
    时待吾阅读 5,807评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,604评论 18 399
  • Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为Stri...
    DreamerRzc阅读 236,792评论 26 273
  • 集合框架体系概述 为什么出现集合类?方便多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方法. 数组...
    acc8226阅读 769评论 0 1
  • 〖原视频地址〗分类器有很多种,比如神经网络、或支持向量机,决策树则是其中之一。决策树一大特点便是简单易读,便于理解...
    夏暮阅读 751评论 0 1