集合

来源:互联网 发布:淘宝王子团队怎么联系 编辑:程序博客网 时间:2024/05/17 23:25

集合的由来
     数组长度时固定的,当添加元素超过数组的长度时就需要重新定义数组,这样太麻烦,在java内部给我们提供了集合框架,也是一个储存容器,但是它的容量时可变的,随着元素的增加而增加,随着元素的减少而减少

数组和集合的区别
     区别1:
               1、数组可以储存基本数据类型和引用数据类型,基本数据类型是值,引用数据类型是地址值
               2、集合只可以储存引用数据类型,但是也可以储存基本数据类型,储存时需要装箱
     区别2:
               1、数组的长度是不可变的
               2、集合的长度是可变,随着数据的增长而增长

数组和集合什么时候使用
     当数据的长度是确定的时候使用数组
     当数据的长度是不确定的时候使用集合


单列集合继承体系
                    Collection (单列集合的根接口)
                          |
                         /   \
                    List    Set
                    /          \
                  /              \
               /                   \
     ArrayList             HashSet
     LinkedList           TreeSet
     Vector

List 和 Set 区别
     List 存取是有序的,有索引,可以重复储存 (指的是同一事物)
     Set 存取是无序的,无索引,不可以重复储存

collection基本方法
     boolean add(Object o) 添加一个元素 添加成功返回true 反之 false
     boolean remove(Object o) 删除一个与传入元素第一个匹配的元素 删除成功返回true 反之false
     void clean() 清空集合所有元素
     boolean contians(Object o) 传入一个元素,此元素在集合中是否存在 存在返回true 反之false
     boolean isEmpty() 判断集合是否为空 为空返回true 反之false
     int size() 获取当前集合元素的个数
     Object[] toArray() 把集合中的所有元素储存到数组并返回
     <T> T[] toArray(T[] … t)传入一个数组 返回传入类型的数组

    带All方法
     boolean removeAll(Collection c) 传入一个collection实现类对象 删除所有匹配的元素 只要有删除返回true 交集
     boolean addAll(Collection c) 传入一个collection实现类对象 把传入实现类对象中的所有成员添加到调用方法的对象
                    添加成功返回true 反之false
     boolean containsAll(Collection c)  传入collection实现类对象 如果调用方法的集合里的元素 都包含传入对象的元素
                    则返回true 反之false
     boolean retainAll(Collection c) 移除交集元素 如果有交集返回true  反之false

List基本方法
     void add(int index,Object element) 在指定索引处插入元素
     Object remove(int index)      删除指定索引的元素 返回删除的元素
     Object get(int index)     返回指定索引的元素
     Object set(int index,Object element)     在指定索引处替换元素

LinkedList特有方法
     addFirst(Object o) 在第一位添加元素
     addList(Object o) 在末位添加元素
     removeFirst(Object o) 删除第一位元素
     removeList(Object o) 删除末尾的元素
     
     get(int index) 表面上是用索引获取元素 查看底层代码知道通过链表一个一个去查元素

Vector
     Vector类概述
          和ArrayList一样底层都是由数组实现的,区别在于Vector是线程安全了,不过已经废弃不再使用
     Vector类特有功能
          public void addElement(E obj) 添加一个元素
          public E elementAt(int index) 传入索引获取一个元素
          public Enumeration elements() 返回一个类似迭代的对象
     
Enumeration使用方法
          Enumeration en = v.elements();   获取枚举
          while(en.hasMoreElements()) {   判断集合中是否有元素
          System.out.println(en.nextElement());  获取集合中的元素

Set
     Se特点
          存储无序,不可重复,无索引

HashSet
     HashSet概述
          无序存储,无索引,用hashcode 和 equals保持元素唯一性
     HashSet特点
          只有hashcode返回int值不重复,才会待用equals方法
          为了提高效率重写 hashcode 和 equals方法
     HashSet保证唯一性原理
          使用hashset是为了去除重复元素,如果equals逐个判断效率太低,所以加入hashcode判断,降低使用equals次数
          如果哈希值不相同的对象直接加入集合,在重写hashcode的时候尽量不让hashcode重复,提高效率
          如果哈希值相同就用equals进行比较,如果返回值是false的话,加入集合

LikedHashSet
          在set集合中,是唯一一个有序存储的

TreeSet
     TreeSet概述
          TreeSet是一个可以对元素进行排序的集合,且可以保持元素的唯一性
     TreeSet特点
          TreeSet会调用compareTo方法进行遍历
     TreeSet注意事项
          当compareTo方法返回值是0的时候只有一 个元素
          当compareTo方法返回值是1的时候怎么存怎么取
          当compareTo方法返回值是-1的时候集合会倒序储存
     TreeSet保持元素的唯一性,和排序的原理
          集合在存储元素的时候,第一个元素会被当成树根(二叉树数据结构),然后其他元素进入集合的时候回去调用
          compareTo方法(谁在往里面添加,就是谁在调用)进行比较,看方法的返回值,负数在左边,正数在右边,0不添
          加

     comparator
          有两个方法compara equals
          需要重写compara比较器才能实现排序
    TreeSet中排序有自然排序 与 比较器排序,两种排序的
     
collections
     collections概述
          collections是单列集合的工具类
     collections的常用方法
          public static <T> void sort(List<T> list)       传入一个集合进行排序
          public static <T> int binarySearch(List<?> list,T key)      集合的二分查找法
          public static <T> T max(Collection<?> coll)       获取集合中最大的元素
          public static void reverse(List<?> list)            将集合反转 
          public static void shuffle(List<?> list)            将集合中的顺序打乱

Map双列集合
     Map概述
             Map中的元素是 键和值 两者都是成对出现的,每一个键可以获取一个值,一个值不能有重复的键,一个键只能对
               应一个值
     Map注意事项
            键是唯一的 Set集合保证唯一性底层调用了Map集合
     Map共性方法
     添加功能
           V put(K key,V value)     
                    如果是第一次储存,直接储存元素,返回null        
                    如果不是第一次储存,把老的值替换成新的值,返回老的值
     删除功能
          void clean() 
                    删除集合中的所有元素
          V remove(Object key) 
                    删除键对应的值,返回被删除的值
     判断功能
          boolean containsKey(Object key)
                    判断传入的键在集合中是否存在
          boolean contains(Object value)
                    判断传入的值在集合中是否存在
          boolean isEmtyp 
                    判断集合是否为空
     获取功能
          Set<Map.Entry<K,V>> entrySet();
                    
         Object get(Object key)
               根据key获取值
          Set<K> keySet()
               获取集合中所有的键
          Collection<v> values()
               获取集合中所有的值
键找值思想
        获取集合中所有的键
        遍历集合,利用键获取值

HashMap与Hashtable的区别
     1、HashMap键与值可以为null  Hashtable键与值不能为null
     2、HashMap线程不安全的  Hashtable线程安全的



迭代器
迭代器概述
     集合是用来储存元素的,当要查看元素的时候就需要迭代器(遍历)   

定义格式
     Iterator it = arr.iterator();
     while(it.hasNext())
          System.out.println(it.next())

如果有另个对象同时操作集合中的元素 就会抛出一个 并发异常 需要用ListIterator 解决

ListIterator常用方法
     boolean hasNext() 是否有下一个
     boolean hasPrevious() 是否有前一个
     Object next() 返回下一个元素
     Object previous() 返回上一个元素
     void add(Object o) 添加一个元素


泛型
     泛型的概述
          泛型是方法或类一种约束方式
     泛型有什么好处
          1、提高了代码的安全型(把运行时的错误提取到编译期)
          2、省去了强转的麻烦
     <>尖括号中只能储存什么
          只能储存引用数据类型
     泛型的注意事项
          1、在JDK1.7之前 两对<>括号的内容要相同
          2、在JDK1.7之后 对象的<>括号可以不写东西
               在<>括号中写Object没有任何意义
          3、泛型里必须是引用数据类型
     
     泛型的定义格式
          类:
               class Test<T> T代表任意类型

          方法:
               public <T>void test(T t)[} 注意的是 泛型要在void 之前加

          接口:
               interface inter<T>

     泛型高级通配符
          <?> ? 代表任意类型 如果没有明确 就是Object类型
          <? extends E>   固定上边界 必需传入E以及E的子类
          <? super E>   固定下边界 必需传入E以及E的父类

     
增强for循环 foreach
     foreach概述
          简化遍历数组与collection集合 foreach是JDK1.5新特性
     格式:
          for(引用数据类型 变量名 :数组或者是collection集合){
               使用变量名即可
          }
     foreach底层由iterator (迭代) 实现的  

静态导入
     静态导入概述
          可以直接导入类中的静态方法 JDK1.5新特性
     格式
          import  java.util.Math.max;        

     注意事项
         1、导入的必须是静态方法
         2、调用时必需加方法名,如果不加方法名,如果和本类中的方法重名,就会报错  

可变参数
     可变参数概述
          定义方法的时候不知道外部调用我要传多少个参数,所以出现了可变参数
     格式
          public void method(int …  arr);

     注意事项
          1、在定参数列表的时候可变参数只能在最后一位
          2、可变参数其实就是一个数组



集合框架 数据结构(数组 链表)
     数组:
          查询修改快
          增删慢
     链表:
          查询修改慢
          增删块

集合框架List三个子类的特点

     ArrayList 
          底层是数组结构
          查询快,增删慢
          线程不安全,但效率高

    Vector
          底层是数组结构
          查询快,增删慢
          线程安全,但效率不高

     LinkedList
          底层是链表结构
          查询慢,增删块
          线程不安全,但效率高

List三个实现类,使用场景
          查询多用ArrayList
          增删多用LinkedList
          都多用ArrayList

0 0