黑马程序员Java知识回顾之集合_list与set

------------------ <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、

<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

1集合的由来

对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。就是使用集合容器进行存储:

2 集合的特点

集合作为一种容器:与数组不同,集合长度可变,数组中可以存储基本数据类型,集合缺只能存储对象。集合可以存不同类型的对象。

add方法的参数类型是object,以便于接收任意类型对象。

集合存储的都是对象的引用(内存地址);

集合容器因为内部的数据结构不同,有多种具体容器。不断向上抽取,就形成了集合框架。框架的顶层为Collection接口;

3集合框架:

       (顶)java.util.collection接口:    

                     (子)set接口 {      hashset , treeset    }      }

                            元素无序,元素不可重复,无索引

                     (子)list接口 {      arraylist , linkedlist , vector   }      }

                            元素有序、可重复,因为该集合体系有索引;

4Collection的常见方法;

       添加:boolean add ( Object obj ) ;

               boolean addAll ( Collection coll ) ;

       删除:boolean remove ( Object obj ) ;

               boolean removeAll ( Collection coll ) ;

               void clear( ) ;

       判断:boolean contains ( Object obj ) ;

               boolean containsAll ( Collection coll );

               boolean isEmpty ( ) ;

       获取:int size ( ) ;

               Iterator iterator ( ) ;

       其他:boolean retainAll ( Coolection coll ) ; //取交集

               Object[ ] toArray ( ) ; //将集合转成数组。

                     <T>[] toArray (<T>[ ] ) ;//要传入的数组多大呢?等于集合的size()最优。 

5 Set集合特点:

元素无序、存入取出的顺序不一定一致,元素不可重复;其子集合有HashSet,TreeSet;

6Hashset集合:底层数据结构是哈希表,线程不同步,其元素唯一的判断依据为,通过两个方法hashcode()和equals()方法来完成;即如果元素的hashcode()值相同,才会判断equals是否为true;(相同);如果hashcode()值不同,不会调用equals()方法;

所以;对于判断hashset元素是否存在,以及删除等操作,依赖于元素的hashcode()和equals()方法;

如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。建立判断对象是否相同的依据;

 

7 TreeSet集合的特点:元素有序,不重复;不同步。地层结构是二叉树;其保证元素唯一性的依据是:compareTo()方法;(return 0则为相同);

8      TreeSet排序的实现方式:

8.1让元素自身具备比较性,元素需要实现comparable接口,覆盖compareTo(…)方法;这种方式成为元素的自然排序或默认排序;

class Studentimplements Comparable//该接口强制让学生具备比较性。

{

       private String name;

       private int age;

       Student(String name,int age)

       {

              this.name = name;

              this.age = age;

       }

       public int compareTo(Object obj)

       {

              //return 0;            

              if(!(obj instanceof Student))

                     throw newRuntimeException("不是学生对象");

              Student s = (Student)obj;

              //System.out.println(this.name+"....compareto....."+s.name);

              if(this.age>s.age)

                     return 1;

              if(this.age==s.age)

              {

                     returnthis.name.compareTo(s.name);

              }

              return -1;      

       }

       public String getName()

       {

              return name;

       }

       public int getAge()

       {

              return age;

       }

}

 

 

8.2元素自身不具备比较性时,或具备的比较性不是所需要的排序方式,这时就需要让集合自身具备比较性;此时,要在集合初始化的时候,(将一个比较器对象作为参数传递给treeSet集合的构造函数)

 

9比较器的建立:

定义一个类,实现Comparator接口,覆盖compare()方法;当两种排序都存在时,以比较器为主;

class MyCompare implements Comparator

{

              publicint compare(Object o1,Object o2)

              {

                     Student s1 = (Student)o1;

                     Student s2 = (Student)o2;

 

                     int num =s1.getName().compareTo(s2.getName());

                     if(num==0) {

      

                            return new Integer(s1.getAge()).compareTo(newInteger(s2.getAge()));

                            /*

                            if(s1.getAge()>s2.getAge())

                                   return 1;

                            if(s1.getAge()==s2.getAge())

                                   return 0;

                            return -1;

                            */

                     }

              }

}

10list集合:有序(存入取出的顺序一致),元素都有索引(角标),元素可以重复。可

以完成对元素的增删改查。list下的子类有Vector,ArrayList,LinkedList

    对于ArrayList集合,判断元素是否存在,或者删元素底层依据都是equals方法。

 

11List特有方法:

其特有方法的共性特点是都可以操作角标。

       增:add(index , element ); addAll(index ,collection );

       删:remove( index );

       改:set(index , element );

       查:get(index); subList(from ,to); listIterator();

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

Iterator的方法有限,只能对元素进行判断、取出、删除操作;迭代取出的是object类型

ListIterator的方法在Iterator上增加了:添加、修改操作;该接口只能通过list集合的ListIterator()获取;

 

13 listIterator特有方法及iterator方法:

       add( E e ); 添加元素set( E e );替代元素 hasprevious() 逆向遍历(是否有前一个元素)

       previous()返回前一个元素

       同时也包含iterator的方法:

              hasNext(); 是否有下一个next();返回下一个 remove();移出当前元素

14vector特有的枚举操作:

       枚举是vector特有的取出方式,名称长,被迭代器取代,

       Enumeration en=vect.elements();

       While(en.hasMoreElements()) { sop (en.nextElement() ) };

15LinkedList特有方法:

       addFirst( E e); addLast( E e);getFirst();获取首元素不删除getLast();)获取尾元素不删除

       removeFirst()获取首元素并删除;removeLast()获取尾元素并删除

       以上如果集合中没有元素会抛NosuchElementException异常;

 

       在jdk1.6后的替代方法:

       OfferFirst( E e); 首添加OfferLast( E e);尾添加peekFirst()取首元素不删peekLast()取尾元素不删

       PollFirst();取首元素并删除 pollLast()取尾元素并删除

 

      

16定义多种类型容器是因为每种容器对数据的存储方式都有不同,即使用不同的数据结构。

Arrarylist底层的数据结构使用的是数组结构,特点:查询快,增删慢;线程不同步

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

Vector底层是使用数组数据结构,线程同步,

 

arrayList与vector默认数组元素为10个,超过长度自动new一个数组,copy原数组后在末尾添加,ArrayList是加长50%,vector是加长100% (不省空间)

             

17集合的迭代:

即集合的元素取出方式,通过集合类中的一个内部类iterator来实现,把取出方式定义在集合的内部,这样的取出方式就可以直接访问集合内容的元素;而每个容器旳数据结构不同,取出方式的细节也不同,但都有共性内容:判断hasNext(),取出next(),那么将共性内容提取出来即(iterator)接口,集合中通过一个对外方法iterator()返回此内部类对象(迭代器)要掌握此种设计思想;

迭代示例:

Iterator it=col.iterator();

While(it.hasNext()){       sop( it.next() ) };     //it变量在while结束后不直接回收;

 

       for( Iterator it=col.iterator() ;it.hasNext() ; ){ sop( it.next() ) }; //it变量在for结束后直接回收;

 

  18枚举的获取:

枚举和迭代的功能是将一个集合对象中所有元素顺序列举出来,它们分别由Enumeration接口和Iterator接口所定义。Enumeration接口是Java标准版1.0 所定义的,而Iterator接口则是从Java标准版1.2开始定义。两者之间既有相同之处,也存在不同,但目前在Java语言中推荐使用Iterator接口来替换Enumeration接口。下面详细介绍两者的不同。 Enumeration接口仅包含两个方法申明,其描述如下:

(1)       publicboolean hasMoreElements()

 测试此枚举是否包含更多的元素。

(2)       publicObject nextElement()

如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。

在实际使用中,采用nextElement()方法将一个个集合元素顺序列举出来。目前用到Enumeration接口的方法仅存在于历史集合类Vector和Hashtable中,如下所示:

Java.util.Hashtable类中的枚举方法:

(1)       publicEnumeration elements()

获取Hashtable对象中所有值的一个枚举

(2)       publicEnumeration keys()

获取Hashtable对象中所有键的一个枚举

Java.util.Vector类中的枚举方法:

public Enumeration elements()  获取Vector对象中所有元素的一个枚举

 

19集合的选择技巧:

       需要唯一吗?

       需要:set

              需要制定顺序吗?

                     需要:TreeSet;

                     不需要:HashSet;

                     不需要(但想要一个和存储顺序一致的(有序集合))LinkedHashSet;

       不需要:List

              需要频繁增删吗?

                     需要:LinkedList;

                     不需要:ArrayList;

       注:集合后缀名就是该集合所属的体系,前缀名就是该集合的数据结构;

------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、

<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值