黑马程序员--集合框架(1)

来源:互联网 发布:java判断函数是否存在 编辑:程序博客网 时间:2024/05/17 23:11

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

集合框架(1)


    集合:
    1,用于存储对象的容器。
    2,该容器的长度是可变的。
  
   集合和数组的区别?
   1,
       集合长度是可变的。
       数组长度是固定的。
   2,
       集合中只能存储对象。
       数组中即可以存储对象,又可以存储基本类型数值。
   3,
       集合中存储的对象可以是任意类型的。
       数组中只能存储同一类型的对象。

集合框架的由来:
    
    容器很多,因为每个容器中的数据结构是不同的。
    数据结构:就是数据在容器中存储方式
 
    容器虽然因为结构有不同,但是都具备着共性,可以不断地向上抽取。
    就形成集合框架,该框架的顶层之一就是Collection接口。
    该接口中定义了集合框架中最共性的功能。
   
    最终使用的时候,其实使用的该框架最子类的对象。

Collection
            List:列表
             特点
              1,有序(存储元素的顺序和取出元素的顺序一致)
              2,该集合中的元素都有索引,所以可以通过索引(角标)来访问元素。
              3,它可以存储重复元素。 
   
         常见子类对象:记住:具体的子类对象,我们要学习应该是该对象的特有的数据结构,以及相关的特点。


         1,Vector:jdk1.0就存在了。底层是数组结构的。可变长度数组,
          原理:一旦原数组长度不够,会创建新数组,将原数组的元素复制到新数组中,并将新元素添加到新数组中。
           Vector是同步的。
         2,ArrayList:底层是数组结构,也是支持长度可变数组的。是不同步的。替代了Vector 查询效率高,但是增删的效率很低。
         3,LinkedList:底层是链接列表结构,简称链表结构。是不同步的。这个中结构的好处:对元素的增删非常效率很高。 查询的效率很低。
   
                Set:集
                特点:
                1,不包含重复元素。(最大的特点)
                2,这个集合存入元素的顺序和取出元素的顺序不一定一致

              常见子类:

               1,HashSet:底层数据结构是哈希表,不保证顺序,是不同步的。
      
               特点
                1,不关系元素的顺序。
                2,提高了查询效率。
                3,不可能出现重复元素,因为哈希值都不同。即使相同,会再次判断两个元素的equals,内容是否相同。
                      如果内容也相同,不存,如果内容不同,存储。
                      所以哈希表要保证元素的唯一性,必须要依赖于两个方法。
                     1,hashCode
                     2,equals 
        
              2,TreeSet:可以给Set集合中的元素进行指定顺序的排序。非同步的。 
      
               TreeSet排序的方式一:让元素自身具备比较性,需要实现Comparable接口,覆盖compareTo方法。
               这种比较方式成为自然顺序排序。
      
     
               这时只能用第二种方式 。
               TreeSet排序的方式二:让容器自身具备比较性。容器一初始化就具备了比较功能。
               因为容器时在对象构造时完成的。通过查阅,有一个构造方法TreeSet(Comparator).
               在容器初始化时可以指定一个比较器。
               需要实现Comparator接口,覆盖compare方法即可。
               所以这种方式成为比较器排序。

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

看一下collection中有哪些常用方法:


    Collection中常用方法
    1,添加方法。 
      boolean add(object e):一次添加一个元素。
      boolean addAll(Collection):将一个参数容器中的元素添加到当前容器中。
      
    2,删除方法。
      boolean remove(object):删除一个指定对象。 
      boolean removeAll(Collection):删除指定collection中和本Collection中相同的元素。 
      void clear():直接将集合中的元素清空。
    3,判断方法:
      boolean contains(object):是否包含指定元素。
      boolean containsAll(Collection):是否包含指定容器中的元素。 
      boolean isEmpty():是否有元素。
    4,获取元素个数:
      int size():获取元素有几个。
    5,取交集。
      boolean retainAll(collection):保留和指定collection集合中相同的元素,不相同的元素会被删除。
    6,将集合转成数组。
      Object[] toArray():
    7,取出元素的方法:
      Iterator iterator():

 迭代器:取出集合中元素的方式的一个对象。该对象本身就内置在容器中
    
    如何获取到集合的迭代器呢?
    可以通过iterator()方法来完成。该方法返回一个Iterator类型对象。
    
    
    迭代器接口出现:将每一个容器中的取出方式进行了封装。并对外暴露。
    这样无论是什么容器或者数据结构,只要内部取出方式实现了Iterator接口,
    都可以通过该接口取出这些容器中的元素。
    
    它的出现,将容器的取出方式和容器的数据结构相分离,降低了耦合性。 
    而取出方式因为直接在访问容器中的元素,并依赖具体的数据结构,所以被定义在了容器中。
    通过内部类来实现Iterator接口。
    
  
    
    只要是Collection集合中的容器,迭代器是通用取出方式。

迭代器演示:

public class IteratorDemo {/** * @param args */public static void main(String[] args) {  *  *///创建集合。 Collection coll = new ArrayList();//添加元素。coll.add("abc1");coll.add("abc2");coll.add("abc3");/*//获取该集合的迭代器对象。Iterator it = coll.iterator();//使用迭代器对象中的方法完成元素的获取。 while(it.hasNext()){System.out.println(it.next());}*///将while改成for结构。开发的时候建议写for。for(Iterator it = coll.iterator(); it.hasNext(); ){System.out.println(it.next());}//System.out.println(it.next());//System.out.println(it.next());//System.out.println(it.next());//next()可以取出元素。而且自动往下取。}}


 演示List子接口中的特有方法。
    因为该接口的特点是 对元素有索引标示。
    所以它的特有方法应该都是围绕着索引定义的。 
    
    1,添加:
     void add(index,element);
     boolean addAll(index,collection);
     
    2,删除:
     object remove(index):获取并删除。记住大家,增加或者删除方法的成功都会改变集合的长度。
    
    3,获取:
     获取元素:
     Object get(index):获取
     获取元素索引:
     int indexOf(object);
     int lastIndexOf(object);
     获取子列表:
     List subList(fromIndex,toIndex):获取列表中的一部分,包含fromIndex位置,不包含toIndex位置。
    
    4,修改。
     object set(index,element):替换指定位置的元素,并返回被替换掉的元素。
    
    我们发现,List接口是可以对元素进行增删改查的操作的。
    注意:只有这个集合具备着增删改查。具备的原因:因为有索引

package cn.itcast.api.p1.list.demo;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.ListIterator;public class ListDemo {/** * @param args */public static void main(String[] args) {listMethodDemo(list);getAllElements(list);}/* * 需求:获取list集合中所有的元素。  *  */public static void getAllElements(List list){list.add("abc1");list.add("abc7");list.add("abc2");list.add("abc4");//迭代器。//Iterator it = list.iterator();//while(it.hasNext()){//System.out.println(it.next());//}//遍历。通过索引完成。for(int x=0; x<list.size(); x++){System.out.println("get:"+list.get(x));}}/* * 演示List中的特有方法。 */public static void listMethodDemo(List list){//默认给这个集合添加一些元素。list.add("abc1");list.add("abc2");list.add("abc3");System.out.println("原集合:"+list);//1,插入元素。//list.add(1,"nba");//System.out.println(list);//2,删除指定位置的元素。//System.out.println(list.remove(2));//3,获取指定位置的元素。//System.out.println(list.get(1));//4,修改指定位置上的元素。//System.out.println(list.set(1, "haha"));//5,索引元素的位置。//System.out.println(list.indexOf("abc22"));//6,获取子列表。//System.out.println(list.subList(1, 3));//System.out.println(list);}}


treeset演示

package cn.itcast.api.p3.set.demo;import java.util.Iterator;import java.util.TreeSet;public class TreeSetDemo {/** * @param args */public static void main(String[] args) {TreeSet ts = new TreeSet();ts.add("haha");ts.add("xixi");ts.add("heihei");ts.add("hehe");ts.add("hohoh");ts.add("hiahia");Iterator it = ts.iterator();while(it.hasNext()){System.out.println(it.next());}}}


 

HashSet

package cn.itcast.api.p3.set.demo;import java.util.HashSet;import java.util.Iterator;public class HashSetDemo {/** * @param args */public static void main(String[] args) {//创建容器。HashSet hs = new HashSet();hs.add("nba");hs.add("hahaha");hs.add("xixi");hs.add("abcd");Iterator it = hs.iterator();while(it.hasNext()){System.out.println(it.next());}}}



  

 

0 0