黑马程序员——java之集合框架(Day14)

来源:互联网 发布:刘文元排奇门软件 编辑:程序博客网 时间:2024/06/05 16:32

------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ------

1、为什么要使用集合类?

面向对象的语言对事物都是以对象体现的,为了方便对多个对象的操作,隆重推出了集合类,也是一个容器,可以对对象进行操作。

2、数组和集合类同是容器有何不同?

数据虽然也可以存储对象,但是长度不可改变;集合是可改变的;另外数组能存基本数据类型,集合就不行。

3、集合类的特点

  1. 集合只用于存储对象。

  2. 长度可变

  3. 可以存储不储不同对象


4、集合框架


5、为什么会有这么多容器?


因为每个容器的存储方式都有不同,这种存储方式称为数据结构。

6、Collection定义了集合框架的共性功能。

7、查阅API文档后发现:

iterator是abstractlist的内部封装类,可以不用建立对象,直接迭 代出list内对象。加强for循环省内存,但是不能操作对象。

8、

|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
枚举就是Vector特有的取出方式。
发现枚举和迭代器很像。其实枚举和迭代是一样的。
Enumeration en = v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
|--Set:元素是无序,元素不可以重复。、
List:
特有方法。凡是可以操作角标的方法都是该体系特有的方法。

add(index,element);//在相应位置插入后,后面元素依次顺延
addAll(index,Collection);

remove(index);

set(index,element);

get(index):
subList(from,to);
Iterator();//当对象的引用存在集合时,用迭代方法的时候把对象的引用又传到迭代,这是对象有两个引用指向他,这时不能操作对象只能用其一个方法,否则会抛出:ConcurrentModificationException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();
List集合特有的迭代器(因为有角标)。ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。
所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。
if(obj.equals("java02"))
//al.add("java008");
it.remove();//将java02的引用从集合中删除了。
sop("obj="+obj);//还能打印是因为迭代器指向这个元素。

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的引用从集合中删除了。remove 本身就是iterator的方法              sop("obj="+obj);     }         sop(al);         */      }  }  


9、LinkedList:特有方法:   

addFirst();
addLast();
getFirst();
getLast();获取元素,但不删除元素。如果集合中没有元素,会出    NoSuchElementException
removeFirst();
removeLast();获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
   在JDK1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();//peek看一眼的意思
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();//poll剪短,修剪
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。

10. 练习:

使用LinkedList模拟一个堆栈或者队列数据结构。
堆栈:先进后出  如同一个杯子。
队列:先进先出 First in First out  FIFO 如同一个水管

package until.cn.itcast;   import static java.lang.System.*;   import java.util.*;      /*思路:定义一个静态方法,给方法singleElement传递一个集合,在方法中再创造一个集合,   * 在迭代时用contains方法判断元素是否存在,不存在则添加到新的集合中,并返回新的集合*/   public class SingleElement {          /**       * @param args       */       public static void main(String[] args) {           // TODO Auto-generated method stub           ArrayList<String> al = new ArrayList<String>();                      al.add("asd");           al.add("asdd");           al.add("dff");           al.add("asdsd");           al.add("asadd");           al.add("asd");                      out.println(al);                      al =singleElement(al);//调用去除重复元素方法。           out.println(al);       }       public static ArrayList<String> singleElement(ArrayList<String> l){           ArrayList<String> newal = new ArrayList<String>();           Iterator<String> it = l.iterator();           while(it.hasNext()){               String obj = it.next();               if(!newal.contains(obj))                   newal.add(obj);           }           return newal;       }      }  


12、练习:


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


比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。


思路:


1,对人描述,将数据封装进人对象。


2,定义容器,将人存入。


3,取出。


细节:Person p = (Person)it.next();


if(!(obj instanceof Person))   return false;


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

ArrayList al = new ArrayList();al.add("java01");al.add("java02");al.add("java01");al.add("java02");al.add("java01");//al.add("java03");/*在迭代时循环中next调用一次,就要hasNext判断一次。Iterator it = al.iterator();while(it.hasNext()){sop(it.next()+"...."+it.next());//这种方式最好不要出现,当集合是奇数时容易发生空指针异常。}






13|--Set元素是无序(存入和取出的顺序不一定一致),元素不可以重复。


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


|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。


    HashSet是如何保证元素唯一性的呢?


         是通过元素的两个方法,hashCodeequals来完成。


         如果元素的HashCode值相同,才会判断equals是否为true


         如果元素的hashcode值不同,不会调用equals


 


练习体现:  体现set集合的不重复性(通过hashcode()equals方法确定,对于hashCode建议类似name.hashCode()+age*37;


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


|--TreeSet:可以对Set集合中的元素进行排序。


          底层数据结构是二叉树。


         保证元素唯一性的依据:


         compareTo方法return 0.


TreeSet排序的第一种方式:


 让元素自身具备比较性。


    元素需要实现lang包中的Comparable接口,覆盖compareTo方法。


      也种方式也成为元素的自然顺序,或者叫做默认顺序。


TreeSet的第二种排序方式。


        当元素自身不具备比较性时,或者具备的比较性不是所需要的。


        这时就需要让集合自身具备比较性。Until包中的comparator接口覆盖 compare();方法


       在集合初始化时,就有了比较方式。

------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ------



0 0
原创粉丝点击