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

——- 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值