黑马程序员技术交流社区

标题: 纯手写集合框架总结 [打印本页]

作者: zc332750    时间: 2013-12-16 22:06
标题: 纯手写集合框架总结


1.集合概述

|--概念:集合是一种容器,专门存储对象,集合不储存基本数据类型

|--与数组的区别:
        1、集合的长度是可变的,数组的长度是固定的
        2、集合专门存储对象不能存储基本数据类型,数字可以存储对象也可以存储基本数据类型

2.Collection接口

|--它是集合的跟接口,它中的方法主要是储存对象的方法

|--collection中的方法
     建立一个集合:Collection coll = new ArrayList;
        1、add() 向集合中添加对象   coll.add();
        2、clean() 移除此collection中的所有元素
        3、equals(Object o) 比较collection与指定对象是否相等,区分大小写
        4、hashCode() 返回此collection中的哈希码值
        5、isEmpty() 如果此collection不包含元素则返回true
        6、iterator() 返回此collection的元素上进行迭代的迭代器(迭代器较重要,后面单独说)
        7、remove() 移除指定元素
        8、size() 返回Collection中的元素个数
        9、toArray() 返回包含此collection中所有元素的数组
        10、contains(Object o)如果collection中包含指定的元素返回true      
      迭代器         迭代器   Collection中的一个共性方法 返回值类型是一个接口类型 接口是Iterator
                   此方法用于取出集合中存储的对象的方法
                   方法的使用:
                        Collection coll = new Collectin();
                        Iterator it = coll.iterator();//1.调用集合中的Iterator方法,获取迭代器对象
                        while(it.hashNext()){//调用迭代器中的hasNext()方法来判断是否有对象被取出
                            sop(it.next());//调用集合中next方法获取集合中的元素
                         }

3.List派系
  |--List也是一个接口

  |--List派系中的集合容器是有序排列的(怎么存的怎么取出)

  |--List派系的集合是有下表的,可以利用数组的思想操作集合

  |--List派系中允许存储重复的元素

  |--List派系有自己特有的迭代器 ListIterator
        1、使用List特有的迭代器可以实现迭代器的过程添加,修改,删除
        2、正向迭代集合、反向迭代集合,反向迭代之前必须先正向迭代一次
        迭代器的示例:
                List list = new ArrayList();
                List.add("abc1");
                List.add("abc2");
                List.add("abc3");
                ListIterator it = list.listIterator();
                while(it.hasNext()){
                        if("abc3"equals(it.next()))
                                //it.remove();//迭代到谁就删谁
                                it.set("ABC123");//迭代到谁就该谁
                }
|--List派系中其他特有的方法
        1、add(int index,E element) 在列表的指定位置插入指定的元素
          2、get(int index) 返回列表指定位置的元素
        3、indexOf(Object 0) 返回此列表第一次出现指定元素的索引如果没有返回-1
        4、set(int index,E element) 用指定的元素替换指定位置的元素

  |--ArrayList它是List派系中的一个子类 ****(两个重要案例 存储自定义对象 去掉重复的元素)
     |--有序的

     |--有下标

     |--可以重复的

     |--底层数据结构是可变数组默认存数10个元素超出范围扩充50%线程不同步

  |--LinkedList它是List派系中的一个子类
     |--它的底层数据结构为链表式结构,增删快,查询慢

     |--线程不同步操作效率高

     |--特有方法
        1、addFirst() 将指定的元素插入到此列表的开头
        2、addLast() 将指定的元素插入到列表的结尾
        3、element() 获取但不移除第一个元素
        4、getFirst() 返回此列表的第一个元素
        5、getLast() 返回此列表的最后一个元素
        6、offer() 将制定的元素添加到此列表的末尾
        7、offerLast() 将列表末尾添加指定元素
        8、offerFirst() 在此列表的开头添加指定的元素
        9、pollFirst() 获取并移除列表的第一个元素
        10、pollLast() 获取并移除此列表的最后一个元素
        11、peekFirst() 获取不移除此列表的第一个元素
4.Set派系 集合的又一个派系   存储的元素不能重复的时候考虑使用set集合
  |--存储到set集合中的对象应该重写hashCode和equals方法

  |--元素是无序排列(存储顺序和取出顺序)

  |--这个派系没有下标

  |--Set集合不存储重复的元素

  |--取出方式只能用迭代器不可以和List用for

  |--线程不安全

  |--hashSet集合
     |--底层数据结构是哈希表,桶状结构
     |--调用的是hashMap来实现的
     |--线程不安全操作效率高
     |--存储到HashSet中的对象,重写hashCode和equals两个方法  *****
        |-- 重写equals方法的实现步骤
             1. 对本对象和彼对象(this obj)进行地址的判断,如果地址一样,直接返回true
             2. 对象obj这个参数进行类型的判断,再次进行类型的强制转换
             3. 使用this和被转后的obj,进行所有成员变量的比较
             4. 如果传递的obj参数,不是本类类型直接返回false
        |-- 重写hashCode方法的实现步骤
             将对象中的引用变量取哈希值,基本数据类型直接相加或者相乘
  |--treeSet具有排序功能的一个集合
     |--底层数据结构是二叉树,每一个分支只能分出两个
     |--排序的依据是对象的自然顺序(是否有自然顺序看描述对象的类是否实现了Comparable接口)
         |--覆盖接口中的抽象方法public intcomparaTo(){}
         |--字符串本身具备自然顺序因为String实现了Comparable接口覆盖了comparaTo方法

5.泛型
   |-- 安全机制

   |-- 出现在JDK1.5级以后版本

   |-- 将程序的问题由运行时期,提前到了编译时期

   |-- 避免了强制的类型转换

   |-- 就是限制数据类型

   |-- 格式:

       集合类<数据类型> 变量 = new 集合类<数据类型>();  

        |-- 自定义对象的Person,可以存储到List结合,HashSet,TreeSet 带泛型的 *****
        |-- 泛型的限定,明白上限和下限,不要求会写,能看的明白知道什么意思就行了
        |-- ? 集合的通配符,匹配任意的泛型
                import java.util.*;
                public class GenericDemo1{
                        public static void main(String[] args){
                                TreeSet<Person> al = new TreeSet<Person>();
                                //HashSet<Person> al = new HashSet<Person>();
                                //ArrayList<Person> al = new ArrayList<Person>();
                                al.add(new Person("zhangsan",22));
                                al.add(new Person("lisi",32));
                                al.add(new Person("wangwu",42));
                                Iterator<Person> it = al.iterator();
                                while(it.hashNext()){
                                        Person p = it.next();
                                        syso(p.getNext()+...+p.getAge());
                                }
                        }
                }

6.Map集合
  |--双列的集合,一次存储一对键值对象

  |--将键映射到值

  |--不允许存在重复的键允许存在重复的值

  |--每个键只能映射一个值

  |--Map集合中去处对象的两种方式
     |--keySet()开发中常用
                import java.util.*;
                public class MapDemo{
                        main{
                                Map<String,Integer> map = new HashMap<String,Integer>();
                                map.put("qq",123);
                                map.put("ww",456);
                                map.put("ee",789);
                //用keySet()将,Map集合中的链存储到Set集合中
                                Set<String> set = map.keySet();
                //用迭代器迭代set集合
                                Iterator<String> it = new Iterator();
                                while(it.hasNext()){
                                        String key = it.next();
                                        Interger value = map.get(key);
                                        syso(key+vaiue);
                                }
                        }
                }
        |--entrySet()面试可能会出现
                import java.util.*;
                public class MapDemo{
                        main{
                                Map<String,Integer> map = new HashMap<String,Integer>();
                                map.put("qq",123);
                                map.put("ww",456);
                                map.put("ee",789);
                        Set<Map.Entry<String,Integer>> set = map.entrySet();
                        Iterator it = new Iterator();
                        while(it.hasNext){
                                Map.Entry<String,Integer> me = it.next();
                                String key = me.getKey();
                                Integer value = me.getValue();
                                syso(key + value);
                        }
                        }
                }
  |-- Map集合中的常用方法
   |-- put(K,v)将对象存储到集合,如果有重复的键,put方法会返回被替换之间的值
   |-- get(K) 根据键获取对应的值,如果没有这个键,返回null
   |-- containsKey(K)判断集合中是否有这个键,有就返回true
   |-- containsValue(V)判断集合中是否有这个值,有就返回true
   |-- size() 返回集合中存储的键值对的个数
   |-- keySet() 将集合中的键存储到Set集合
   |-- entrySet() 将集合中的键值关系存储到Set集合,键值关系对象是Map.Entry
        import java.util.*;
        public class MapDemo{
                main{
                       
                }
                public static void method(){
                        Map<String,Integer>map = new HashMap<String,Integer>();
                        map.put("a",123);//向集合中存储对象,put(),
                        map.put("b",456);
                        map.put("c",789);
                        syso(map);
                //get方法根据指定的链获取对应的值
                Integer i = map.get("b");
                syso(i);
                //boolean containskey()判断有没有这个键
                //boolean containsValue()判断有没有这个值
                boolean b1 = map.containsKey("a");
                boolean b2 = map.containsValue(123);
                }

        }
6.HashMap集合
  |--底层数据结构是哈希表结构

  |--不允许重复的键

  |--线程不安全,操作效率高

  |--允许null值和null键

  |--案例,存储自定义对象并取出,需要实现2种方式  *****(见上)







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2