黑马程序员_List集合容器

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


第一部分:Collection集合容器与Iterator迭代器

 

Collection集合容器

 

1.add方法的参数类型是Object,以便于接受任意类型的对象。

2.集合中存储的都是对象的引用(地址)

 

什么是迭代器: 就是集合的取出元素的方式。

    把取出方式定义在集合的内部,这样取出方式就可以直接访问集合的元素。因此取出方式被定义成内部类

    而每一个容器的数据结构不同,取出的动作细节也不一样。但都有共性内容:判断和取出。

              那么可以将这些共性抽取,封装成一个接口:Iterator。

              如何获取集合的取出对象?

              通过一个对外提供的方法:c.iterator();

             

             

              Iterator it =al.iterator();

              while(it.hasNext()){

                     sop(it.next());

              }

             

              高效的用法(for循环结束后迭代器会释放,节省内存空间):

              for (Iteratoritr = al.iterator(); itr.hasNext(); )

                    sop(itr.next());     

       }

     

       public static voidmethod_retain(){

              ArrayList al1 =new ArrayList();

             al1.add("java01");

             al1.add("java02");

             al1.add("java03");

             al1.add("java04");

 

              ArrayList al2 =new ArrayList();

             al2.add("java01");

             al2.add("java02");

              al2.add("java05");

             al2.add("java06");

            

              //在操作集合中保留两个集合的交集

             al1.retainAll(al2);

              sop(al1);

       }

       public static voidbase_Method(){

              //创建一个集合容器,使用Collection接口的子类:ArrayList

              ArrayList al =new ArrayList();

            

              //1.添加元素:

              //add(Objectobj);addAll(Collection c)将c中所有元素添加到当前集合中

             al.add("java01");

             al.add("java02");

             al.add("java03");

             al.add("java04");

              sop(al);

            

              //2.获取集合长度(对象个数)

              //sop(al.size);

 

              //3.删除元素

             //al.remove("java02");

             //al.removeAll(Collection c);删除两个集合交集

              //al.clear();//清空集合

 

              //4.判断

              //al.contains("java03");//boolean

             //al.isEmpty();//boolean

       }

 

       public static voidsop(Object obj){

             System.out.println(obj);

       }

}

 

--------------------------------------------------------------------------------------------------

第二部分:List集合容器(Vector,ArrayList以及LinkedList)

 

Collection

       |--List:元素是有序的,元素可以重复。因为该集合体系有索引。

              |--ArrayList:底层是数组数据结构。特点:查询快,增删慢。[线程不同步]

              |--LinkedList:底层使用的是链表结构。特点:查询慢,增删快。

              |--Vector:底层是数组数据结构。[线程同步]

       |--Set:元素是无序的,元素不可以重复。

 

List:

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

 

       add(int index,element);

       addAll(intindex,Collection);

       remove(int index);

       set(int index,element);

       get(int index);

       subList(int from,intto);

       listInterator();

       int indexOf(obj);//获取元素的指定位置

       ListIteratorlistIterator()

--------------------------------------------------------------------------------------------------

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

 

在迭代时,不可以通过集合对象的方法操作集合中的元素。

因为会发生ConcurrentModificationException(并发修改异常)

所以在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法有限。

如过想要其他的操作如添加,修改等,就需要使用其接口,ListIterator。

 

该接口只能通过List集合的listIterator方法获取。

 

ListIterator(API方法摘要):

 void add(E e)

          将指定的元素插入列表(可选操作)。

 boolean hasNext()

          以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。

 boolean hasPrevious()

          如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

 E next()

          返回列表中的下一个元素。

 int nextIndex()

          返回对 next 的后续调用所返回元素的索引。

 E previous()

          返回列表中的前一个元素。

 int previousIndex()

          返回对 previous 的后续调用所返回元素的索引。

 void remove()

          从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。

 void set(E e)

 

 

 

import java.util.*;

 

class ListDemo

{

       public static voidmain(String[] args)

       {

              //演示列表迭代器。

              ArrayList al = new ArrayList();

 

             al.add("java01");

             al.add("java02");

             al.add("java03");

 

              //在迭代过程中,准备添加或者删除元素。

              / *

              for(Iterator it= al.iterator();it.hasNext();)

              {

                     Objectobj = it.next();

                    if(obj.equals("java02"))

                           al.add("java008");

                     //在迭代器操作元素的同时,利用集合操作元素,抛出并发修改异常

                     sop(obj);

              }* /

              for(ListIteratorlit = al.listIterator();lit.hasNext();)

              {

                     Objectobj = lit.next();

                    if(obj.equals("java02"))

                           //lit.add("java04");

                            lit.set("java006");

                     sop(obj);

              }

              sop(al);

       }

 

       public static voiddisplayMethod(){

              ArrayList al =new ArrayList();

 

             al.add("java01");

             al.add("java02");

             al.add("java03");

            

              //在指定位置添加元素。

             al.add(1,"java09");

              //删除指定位置的元素。

              al.remove(2);

              //修改元素

             al.set(2,"java007");

 

              //通过角标获取元素

              sop(al.get(1));

              //获取所有元素

              for (int i =0;i<al.size() ;i++ )

              {

                    sop(al.get(i));

              }

              //迭代器获取所有元素

              for(Iterator it= al.iterator();it.hasNext();)

                     sop(it.next());

 

              //通过indexOf获取对象的位置

             sop(al.indexOf("java007"));

              //获取列表的子列表

              List sub =al.subList(0,2);

              sop(sub);

       }

 

 

       public static voidsop(Object obj){

              System.out.println(obj);

       }

}

--------------------------------------------------------------------------------------------------

LinkedList特有方法:

addFirst();addLast();

 

getFirst();getLast();

获取元素,但是不删除元素。如果集合中没有元素,则抛出无此元素异常

 

removeFirst();

removeLast();

获取元素,但是元素被删除。如果集合中没有元素,则抛出无此元素异常

 

JDK1.6后出现的替代方法:

 

offerFirst();offerLast();

peekFirst();peekLast();

获取元素,但是不删除元素。如果集合中没有元素,则返回null。

pollFirst();pollLast();

获取元素,但是元素被删除。如果集合中没有元素,则返回null。

--------------------------------------------------------------------------------------------------

使用LinkedList模拟一个堆栈或者队列数据结构。

堆栈:LIFO   队列:FIFO

 

import java.util.*;

 

class StackDemo

{

       private  LinkedList link ;

 

       StackDemo(LinkedListlink){

              this.link =link;

       }

       public void push(Object obj){

             link.offerFirst(obj);

       }

       public Object pop(){

              returnlink.pollFirst();

       }

       public booleanisNull(){

              returnlink.isEmpty();

       }

}

class QueueDemo

{

       private LinkedList  link = new LinkedList();

 

       QueueDemo(LinkedListlink){

              this.link =link;

       }

       public void in(Objectobj){

             link.offerFirst(obj);

       }

       public Object out(){

              return link.pollLast();

       }

       public booleanisNull(){

              returnlink.isEmpty();

       }

}

class Test

{

       public static voidmain(String[] args){

          LinkedList link1=new LinkedList();

LinkedListlink2 = new LinkedList();

              StackDemo stack = new StackDemo(link1);

              QueueDemo queue= new QueueDemo(link2);

                   

             stack.push("java01");

             stack.push("java03");

             stack.push("java05");

             stack.push("java07");

              sop(link1);

             queue.in("java02");

             queue.in("java04");

             queue.in("java06");

             queue.in("java08");

              sop(link2);

             sop(stack.pop());

              sop(queue.out());

              sop(link1);

              sop(link2);

 

       }

       public static voidsop(Object obj){

             System.out.println(obj);

       }

}

 

(***重要***2012/4/25)

练习二:将自定义对象作用为元素存到ArrayList集合中,并去除重复元素。

如:存人为对象,同名同年龄视为同一人。

 

List集合判断元素是否相同,依据的是元素的equals方法。

!!!判断元素是否相同的场合:booleanremove(obj);boolean contains(obj);

import java.util.*;

class Person

{

       private String name;

       private int age;

       Person(String name, intage){

              this.name =name;

              this.age = age;

       }

       public StringgetName(){

              return name;

       }

       public int getAge(){

              return age;

       }

       public booleanequals(Object obj){//重写才能进行自定义的条件比较

              //更严谨的话,可以直接抛异常

              if (objinstanceof Person) return false;

              Person p=newPerson();

              if ( this.name .equals(p.name)&&this.age==p.age)

                     returntrue;

             else returnfalse;

       }

}

class ArrayListTest

{

       public static voidmain(String[] args){

              ArrayList al =new ArrayList();

              al.add(newPerson("mike01",20));

              al.add(newPerson("mike02",30));

              al.add(newPerson("mike02",30));

              al.add(newPerson("mike03",25));

              al.add(newPerson("mike04",35));

              al.add(newPerson("mike04",35));

            

              al =removeSame(al);

              Iterator it =al.iterator();

              while(it.hasNext())

              {

                     Person p =(Person)it.next();//需要将Object向下转型成Person

                    sop(p.getName()+":"+p.getAge());

              }

       }

       public static voidsop(Object obj){

             System.out.println(obj);

       }

       public static ArrayListremoveSame(ArrayList al){

              //临时容器

              ArrayList newAl= new ArrayList();

     

              Iterator it =al.iterator();

              while(it.hasNext())

              {

                     Objectobj = it.next();

                    

                    if(!newAl.contains(obj))//contains里调用了equals方法,Person类里需要重写该方法。

                           newAl.add(obj);

              }

              return newAl;

       }

}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值