您的位置:首页 > 职场人生

黑马程序员——————java中的集合框架

2013-06-11 17:44 218 查看
------- android培训、java培训、期待与您交流! ----------


集合:

面向对象所操作的重点事物是对象,我们可以将属性和方法封装成对象,那么对象多了就需要对对象进行存储,集合就是用来存储对象最常用的方式。

集合和数组都是容器,二者的不同是数组的长度是固定的,而集合的长度是可变的,数组可以存储基本数据类型,集合只能存储对象。

 

我们知道在java的集合框架中有很多的容器,之所以会有这么多不同的容器是

因为每一个容器底层的实现的数据结构不同。

 

集合中的迭代器:

迭代器是集合中取出元素的一种方法,他是定义在集合类中的一个内部类,而且不同容器中的迭代器进行共性的抽取,形成了一个接口Iterator

 

我们在学习中应该重点掌握的部分如下所示:

Collection

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

                |----ArrayList底层的数据结构使用的是数组结构。特点:查询速度很快。但是增 

                                          删稍慢,线程不同步;

                |----LinkedList:底层使用的数据结构是链表数据结构。特点:增删速度很快,

                                              查询稍慢,线程不同步;

                |---- Vector:底层是数组数据结构,线程同步,现在已经很少使用它了,如果

                                     需要线程同步的话,我们可 以对集合手动加锁

       |----Set:元素无序,不可以重复;

               |----HashSet:底层数据结构是哈希表,线程是非同步的。保证元素唯一性

                                          的原理:判断元素的 hashcode值是否相同;如果相同, 还 

                                          会继续判断元素的equals方法,是否true

                                                                                                  

               |----TreeSet:可以对Set集合中的元素进行排序;底层数据结构是二叉树,

                                       保证元素唯一性的依  据:compareTo方法return 0 ;

                                       TreeSet排序的第一种方式:让元素自身具备比较性。元素

                                       需要实现Comparable接口, 覆盖compareTo方法。也种方

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

                                     TreeSet 的第二种排序方式:当元素自身不具备比 较性时,

                                     者具备的比较性不是所 需要  的。这时   就需 要让集合自身

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

                                       

 Map

  |-----------------HashMap:底层是hash表数据结,它允许null键和null值,并且该

                                               集合是线程同步的。

                                               

  |-----------------HashTable:底层也是hash表数据结构,但是它不允许null键和

                                                  null值,该集合是线程同步的。

                                                

  |-----------------TreeMap: 底层是二叉树数据结构,线程不同步,可以用于给Map

                                                集合的键值排序

                  

 

下面我们看一下集合存储自定义的对象时一些注意点:

若存储对象时没有要求对象不能重复,则选用List集合,若要求集合中的元素不能重复,则选用Set集合。在定义

一个要被集合存储的类的时候要做的事情就比以前多了不少,如实现Comparable接口,覆写equals方法,

覆写hashCode方法等,看下面的例子:

 

我们定义一个Person类:

class Person implements Comparable

{

       private String name;

       private int age;

       Person(String name,int age)

       {

            this.name=name;

               this.age=age;

       }

 

       public int comparaTo(Object obj)

       {

            if(!(obj instanceof Person))

                throw new RuntimeException("不是Person对象");

               Person p=(Person)obj;

               if(this.age<p.age)

                      return -1;

               if(this.age>p.age)

             return 1;

               return 0;

       }

 

       public int hashCode()

       {

         return name.hashCode()+age*27;

       }

 

       public boolean equals(Object obj)

       {

           if(!(obj instanceof Perosn))

                     throw new RuntimeException("不是Person对象");

              Person p=(Person)obj;

              return this.name.equals(p.name)&&this.age==age;

       }

       public String getName()

       {

           return name;

       }

       public int getAge()

       {

            return age;

       }

}

现在我们用TreeSet集合存储上述自定义的对象:

class SetDemo2

{

       public static void main(String[]args)

       {

            TreeSet<Person> ts=new TreeSet<Person>();

               ts.add(new Perosn("zhangsan",23));

               ts.add(new Person("lisi",23));

               ts.add(new Person("wangwu",24));

               ts.add(new Person("zhaoliu",54));

 

               Iterator<Person> it=ts.iterator();

               while(it.hasNext())

              {

                   Person p=it.next();

                      System.out.println(p.name+"......"+p.age);

              }

      

       }

}

注:TreeSet集合对元素进行排序是通过comparaTo方法,所以执行程序后lishi 23并没有存进集合。

 

再用HashSet集合存储:

class SetDemo2

{

       public static void main(String[]args)

       {

            HashSet<Person> hs=new HashSet<Person>();

               hs.add(new Perosn("zhangsan",23));

               hs.add(new Person("lisi",23));

               hs.add(new Person("wangwu",24));

               hs.add(new Person("zhaoliu",54));

               hs.add(new Person("lisi",23));

 

               Iterator<Person> it=ts.iterator();

               while(it.hasNext())

              {

                   Person p=it.next();

                      System.out.println(p.name+"......"+p.age);

              }

      

       }

}

注:HashSet判断元素是否相同的依据是hashCode和equals方法,所以最后添加的lisi
23没有添加进去。


 

 

Map集合的两种取出方式总结:

看如下代码示例:

import java.util.*;

class MapDemo

{

       public static void main(String[]args)

       {

           Map<String,String> map=new HashMap<String,String>();

              map.put("1","zhangsan1");

              map.put("2","lisi");

              map.put("3","wangwu");

 

              method_1(map);

              method_2(map);

       }

 

       public static void method_1(Map<String,String> map)

       {

          Set<String> keyset=map.keySet();

          Iterator<String> it=keyset.iterator();

          while(it.hasNext())

              {

              String key=it.next();

                 String Value=map.get(key);

                 System.out.println("key:"+key+"....value:"+value);

           }

       }

 

       public static void method_2(Map<String,String> map)

       {

         Set<Map.Entry<String,String> entryset=map.entryset();

         Iterator<Map.Entry<String,String>>it=entryset.iterator();

         while(it.hasNext())

              {

              Map.entry<String,String>me=it.next();

                 String key=me.getKey();

                 String value=me.getValue();

                 System.out.println(key+"......"+value);

           }

       }

}

 ------- android培训、java培训、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: