码迷,mamicode.com
首页 > 编程语言 > 详细

Java基础-集合框架

时间:2015-03-19 21:51:12      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

首先,集合与数组的区别?
          1. 长度:     数组固定;集合可变。
          2. 存储类型:     数组存储基本数据类型和对象;集合只能存储基本数据类型。
                                        数组存储的元素必须是一个数据类型;集合存储对象可以是不同类型。
                                       
集合类(为什么出现集合类??)
     面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,
     集合就是存储对象最常用的一个方式。



Collection接口
     |--List:     有序,元素都有索引。     元素可以重复。
          |--ArrayList:     底层的数据结构是数组,线程不同步
          |--LinkedList:     底层的数据结构是链表,线程不同步
          |--Vector:     底层的数据结构是数组,线程同步
          取出list集合中元素的方式:
               get(int index):通过脚标获取元素
               iterator():通过迭代方法获取迭代器对象
         
     |--Set:     无序,不可以存储重复元素。     必须保证元素唯一性。
          |--HashSet:     底层数据结构是哈希表,线程不同步,无序高效。
                    HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成。
          |--TreeSet:     底层数据结构是二叉树,对集合中的元素进行指定顺序的排序,不同步
                    用于对set集合进行元素的指定顺序排序,排序需要依据元素自身具备的比较性。
                    1. 让元素自身具备比较性,元素实现comparable接口,覆盖compareTo方法。这种方式也称为元素的自然排序
                   
                    class Student implements Comparable{     //该接口强制让学生具备比较性
                         private String name;
                         private int age;
                        
                         Student(String name, int age){
                              this.name = name;
                              this.age = age;
                         }
                        
                         public int compateTo(Object obj){
                              if(!(obj instanceof Student))
                                   throw new RuntimeException("not a student");
                              Student s = (Student)obj;    
                             
                              if(this.age > s.age)
                                   return 1;
                              if(this.age = s.age)
                                   return this.name.compareTo(s.name);
                                  
                              return -1;
                         }
                    }
                   
                    2. 当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让集合自身具备比较性。
                         定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
                        
                    class StrLenComparator implements Comparator{     //元素自身具备比较性不是所需要的,定义比较器
                         public int compare(Object o1, Object o2){
                              String s1 = (String)o1;
                              String s2 = (String)o2;
                             
                              int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
                              if(num == 0)
                                   return s1.compareTo(s2);
                                  
                              return num;
                         }
                    }

Iterator接口:     用于取集合中的元素。
          Iterator it = coll.iterator();
          while(it.hasNext()){
               System.out.println(it.next());
          }

Map集合
     |--Hashtable:     底层是哈希表数据结构,是线程同步的。     不可以存储null键null值
     |--HashMap:     底层是哈希表数据结构,是线程不同步的。     可以存储null,替代了Hashtable
     |--TreeMap:     底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。
    
Map和Collection区别???
     |--Collection一次存一个元素;Map一次存一对元素。
     |--Map存储元素用put方法;Collection使用add方法。
     |--Collection是单列集合;Map是双列集合。
     |--Map中的存储的一对元素:一个是键,一个是值,键与值之间有映射关系。
     |--Map集合没有取出元素的方法,需要先转成set集合,再通过迭代器取出元素。

    
     特点:要保证map集合中键的唯一性。
    
把Map集合转成set的方法(map中没有迭代器,所以想要取出map中的所有元素,需要将map集合转成set集合)
     Set     keySet();
     Set     entrySet();     //取的是键和值的映射关系

     注:Entry就是Map接口中的内部接口:
          为什么要定义在map内部呢?entry是访问键值关系的入口,是map的入口,访问的是map中的键值对。
    

使用集合的技巧:
     |--看到Array就是数组结构,有角标,查询速度很快;
     |--看到link就是链表结构:增删速度快,
                    而且有特有方法:addFirst,     addLast,     removeFirst(),     removeLast(),     getFirst(),     getLast()
     |--看到hash就是哈希表,
                    就要想到哈希值,
                    就要想到唯一性,
                    就要想到存入到该结构中的元素必须覆盖hashCode,equals方法
     |--看到tree就是二叉树,就要想到排序,就想到要用比较。
                    比较的两种方式:实现Comparable接口,覆盖compareTo方法
                                                            实现Comparable接口的比较器,覆盖compare方法
     |--LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表存入顺序和取出顺序一致,保证哈希表有序。
    
集合什么时候用??
     |--当存储的是一个元素时,就用Collection。当存储对象之间存在映射关系时,就使用map集合
     |--保证唯一,就用set;不保证唯一,就要list
    
Collection和Collections区别??
     |--Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的操作。
     |--Collection是个java.util下的接口,是各种集合结构的父接口。


                   
泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制。

 
泛型格式:通过<>来定义要操作的引用数据类型。<>就是用来接受类型的。
 
好处:
     1. 将运行时期出现的问题,转移到了编译时期,方便程序员解决问题,让运行时问题减少,安全。
     2. 避免了强制转换的麻烦。
 
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见。
 
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来完成扩展。
 
泛型类定义的泛型,在整个类中有效。如果被方法使用,
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。

为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。
 
 
静态泛型:
     静态方法不可以访问类上定义的泛型,如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
 
泛型接口:泛型定义在接口上


     

Java基础-集合框架

标签:

原文地址:http://www.cnblogs.com/troy-sxj/p/4351510.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!