黑马程序员——集合(上)

来源:互联网 发布:淘宝卖家温馨寄语 编辑:程序博客网 时间:2024/05/23 05:09

——- android培训、java培训、期待与您交流! ———-

1.1,为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。

1.2,数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。

1.3,集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

1.4,Collection
Collection集合框架中的一个顶层接口,它里面定义了单列集合的共性方法,
它有两个常用的子接口list和set。
Collection
|–List//元素是有序的,元素可以重复。因为该集合体系有索引。
|–Set//元素是无序的,元素不可以重复。

1.5,Collection接口中的常见操作
1、添加元素
add(Objectobj); //add方法的参数类型是Object。以便于接收任意类型对象。

2、删除元素
remove(Objectobj);
removeAll(另一集合);//调用者只保留另一集合中没有的元素。
clear();//清空集合

3、判断元素
contains(Objectobj);//判断是否存在obj这个元素
isEmpty();//是否为空

4、获取
iterator();
size();

5、获取交集
retainAll(另一集合);//调用者只保留两集合的共性元素。

6,集合变数组。
toArray();

1.6,迭代器
1,什么是迭代器呢?
其实就是集合的取出元素的方式。

2,迭代的常见操作
hasNext();//判断是否有下一个元素
next();//取出下一个元素
remove();//移除

2.1,List集合
List:元素是有序的,元素可以重复。因为该集合体系有索引。
—— |–ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
—— |–LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
—— |–Vector:底层是数组数据结构。线程同步。被ArrayList替代了。

2.1,List的特有方法
凡是可以操作角标的方法都是该体系特有的方法。

1、增
booleanadd(index,element);//指定位置添加元素
BooleanaddAll(index,Collection);//在指定位置增加给定集合中的所有元素

2、删
Booleanremove(index);//删除指定位置的元素

3、改
set(index,element);//修改指定位置的元素。

4、查
get(index);//通过角标获取元素
subList(from,to);//获取部分对象元素

5、其他
listIterator();//List特有的迭代器
indexOf(obj);//获取元素第一次出现的位置,如果没有则返回-1

注:List集合判断元素是否相同,移除等操作,依据的是元素的equals方法。

示例:
class ListDemo {    public static void sop(Object obj)    {        System.out.println(obj);    }    public static void method()    {        ArrayList al = new ArrayList();        //添加元素        al.add("java01");        al.add("java02");        al.add("java03");        sop("原集合是:"+al);        //在指定位置添加元素。        al.add(1,"java09");        //删除指定位置的元素。        //al.remove(2);        //修改元素。        //al.set(2,"java007");        //通过角标获取元素。        sop("get(1):"+al.get(1));        sop(al);        //获取所有元素。        for(int x=0; x<al.size(); x++)        {            System.out.println("al("+x+")="+al.get(x));        }        Iterator it = al.iterator();        while(it.hasNext())        {            sop("next:"+it.next());        }        //通过indexOf获取对象的位置。        sop("index="+al.indexOf("java02"));        List sub = al.subList(1,3);        sop("sub="+sub);    }    public static void main(String[] args)     {        //演示列表迭代器。        ArrayList al = new ArrayList();        //添加元素        al.add("java01");        al.add("java02");        al.add("java03");        sop(al);        ListIterator li = al.listIterator();        //sop("hasPrevious():"+li.hasPrevious());        while(li.hasNext())        {            Object obj = li.next();            if(obj.equals("java02"))                //li.add("java009");                li.set("java006");        }        while(li.hasPrevious())        {            sop("pre::"+li.previous());        }        //sop("hasNext():"+li.hasNext());        //sop("hasPrevious():"+li.hasPrevious());        sop(al);        /*        //在迭代过程中,准备添加或者删除元素。        Iterator it = al.iterator();        while(it.hasNext())        {            Object obj = it.next();            if(obj.equals("java02"))                //al.add("java008");                it.remove();//将java02的引用从集合中删除了。            sop("obj="+obj);        }        sop(al);        */    }}这里写代码片

2.2,ListIterator
1,ListIterator是List集合特有的迭代器,是Iterator的子接口。

2、ListIterator特有的方法
add(obj);//增加
set(obj);//修改为obj
hasPrevious();//判断前面有没有元素
previous();//取前一个元素

2.3,枚举(Enumeration)
1,枚举就是Vector特有的取出方式,其实枚举和迭代是一样的。
因为枚举的名称以及方法的名称都过长,所以被迭代器取代了。

2,特有方法:
addElement(obj);//添加元素,相当于add(obj);
Enumerationelements();//Vector特有取出方式(枚举)
hasMoreElements();//相当于Iterator的hasNext()方法
nextElements();//相当于Iterator的next()方法

2.4,LinkedList
LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。

特有方法:
1、增
addFirst();
addLast();

2、获取
//获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
getFirst();

3、删
//获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();

在JDK1.6以后,出现了替代方法。
1、增
offFirst();
offLast();

2、获取
//获取元素,但是不删除。如果集合中没有元素,会返回null。
peekFirst();
peekLast();

3、删
//获取元素,并删除元素。如果集合中没有元素,会返回null。
pollFirst();
pollLast();

示例:
/*使用LinkedList模拟一个堆栈或者队列数据结构。堆栈:先进后出  如同一个杯子。队列:先进先出 First in First out  FIFO 如同一个水管。*/import java.util.*;class DuiLie{    private LinkedList link;    DuiLie()    {        link = new LinkedList();    }    public void myAdd(Object obj)    {        link.addFirst(obj);    }    public Object myGet()    {        return link.removeFirst();    }    public boolean isNull()    {        return link.isEmpty();    }}class  LinkedListTest{    public static void main(String[] args)     {        DuiLie dl = new DuiLie();        dl.myAdd("java01");        dl.myAdd("java02");        dl.myAdd("java03");        dl.myAdd("java04");        while(!dl.isNull())        {            System.out.println(dl.myGet());        }    }}

3.1,Set
|–Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
——|—HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

——|—TreeSet:

Set集合的功能和Collection是一致的。

3.1,HasSet
HashSet:线程不安全,存取速度快。

HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。

示例:
import java.util.*;/*往hashSet集合中存入自定对象姓名和年龄相同为同一个人,重复元素。*/class HashSetTest {    public static void sop(Object obj)    {        System.out.println(obj);    }    public static void main(String[] args)     {        HashSet hs = new HashSet();        hs.add(new Person("a1",11));        hs.add(new Person("a2",12));        hs.add(new Person("a3",13));//      hs.add(new Person("a2",12));//      hs.add(new Person("a4",14));        //sop("a1:"+hs.contains(new Person("a2",12)));//      hs.remove(new Person("a4",13));        Iterator it = hs.iterator();        while(it.hasNext())        {            Person p = (Person)it.next();            sop(p.getName()+"::"+p.getAge());        }    }}class Person{    private String name;    private int age;    Person(String name,int age)    {        this.name = name;        this.age = age;    }    public int hashCode()    {        System.out.println(this.name+"....hashCode");        return name.hashCode()+age*37;    }    public boolean equals(Object obj)    {        if(!(obj instanceof Person))            return false;        Person p = (Person)obj;        System.out.println(this.name+"...equals.."+p.name);        return this.name.equals(p.name) && this.age == p.age;    }    public String getName()    {        return name;    }    public int getAge()    {        return age;    }}/**/

——- android培训、java培训、期待与您交流! ———-

0 0
原创粉丝点击