JavaSE基础复习五:集合和集合框架

来源:互联网 发布:飞宇网吧知乎 编辑:程序博客网 时间:2024/05/17 01:46

  ------- android培训、java培训、期待与您交流! ----------


Collection 接口

定义该接口的共性方法:
    add(obj); 
    addAll(col);   
    size();    isEmpty();
    clear();清空容器
    equals(obj);
    boolean retainAll(collection);保留与指定集合相同的元素
    contains(obj);是否包含obj   //---containsAll(collection);
    Object[] toArray();转换为数组,泛型方法
    boolean remove(obj);移除指定元素
    boolean removeAll(collection);移除相同的元素
    iterator();返回Iterator接口的一个实例;


1、List 接口(特有方法:可以操作角标)有顺序可以重复 

    add(index ,element);指定位置增加元素
    addAll(index,col),指定位置增加集合
    remove(index);删除指定位置  //---remove(obj);移除指定元素collection接口方法
    set(index,element);指定位置修改为指定元素
    get(index);获取指定位置
    subList(from,to);返回一个子list
    indexOf(obj);获取对象第一次出现的位置  lastIndexOf(obj)
    ListIterator  listIterator();列表迭代器 Iterator的子接口
      |---add(obj);在next后插入元素
      |---set(obj);将next或者previous返回的元素修改为指定元素
      |---hasPrevious();用来逆向遍历,是否有上一个元素  
      |---previous();返回上一个元素

1.1 ArrayList

    底层数据结构是数组;
    特点:查询速度快,插入和删除慢;线程不同步,效率高;
    ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。
    trimToSize();  
    ensureCapacity(int minCapacity);如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。 
    默认动态Object[]数组大小为10;                 
    在迭代时,循环中next取一次,就用hasNext判断一次

1.2 LinkedList

    底层数据结构是链表;
    特点:增删速度快,查询稍慢
    addFirst();  
    addLast();添加元素  
    getFirst(); 
    getLast();获取元素     
    removeFirst();获取并删除第一个元素,
    removeLast();
|---JDK1.6升级: 
    poll();获取并移除此列表的头 //---remove();   
    pollFirst();    //---removeFirst();
    pollLast();获取并移除元素,如果为空,返回Null.  //---removeLast();
    offer(e);将指定元素添加到此列表的末尾. //---add();
    offerFirst();   //---addFirst();
    offerLast();指定元素插入头或尾,返回true或者false   //---addLast();  
    peek();获取但不移除此列表的头  //---get(0);
    peekFirst(); 获取但不移除此列表的头   //---getFirst();
    peekLast();获取元素,相当远get,如果列表为空,返回null   //---getLast();
    pop();出栈,移除并返回此列表的第一个元素//---removeFirst();
    push();压栈,将该元素插入此列表的开头//---addFirst();
    
如果列表为空:
get(),remove()抛出异常
peek(),poll()返回null

1.3 Vector

    底层是数组数据结构,是同步的,效率较低;超过初始长度10,延长一倍,浪费空间;
    子类
    |---Stack栈功能
    
    Enumeration elements();返回枚举类型,和迭代功能相像。被Iterator取代

2、Set接口---无序,不重复

    方法和Collection一样
    不允许包含相同的元素,add(obj)--->如果equals(obj);返回true,则obj添加失败;

2.1 HashSet 

    底层数据结构是哈希表
    方法和Collectio一样,集合元素值可以是null;
    判断两个元素是否相同、某个元素是否存在、删除某个元素、通过元素自身的hashCode()和equals()方法;如果两个元素hashCode值相同,则在调用equals方法;
    |---LinkedHashSet  可以保证元素按照添加顺序保存

2.2 TreeSet 

    底层的数据结构:二叉树(红黑树)根据compareTo方法返回的结果可以实现元素的不同排序;
    想TreeSet中添加元素时,只有第一个元素不需要事先Comparable接口.
    元素需要有比较性,实现Compareable接口,并且重写compareTo方法(自然排序),
    否则,抛出非本类对象异常。
    排序时,当主要条件相同时,一定要判断次要条件。
    TreeSet排序两种方式:
    第一种方式:元素实现Compareable接口,覆盖compareTo方法
    第二种方式:元素自身不具备比较性,或者具备不需要的,这时需要让集合初始化时具备比较性。
    定义一个类,实现Comparator接口,覆盖compare方法;
    当两种方式都存在时,以比较器为主;
    
方法:
    Comparator comparator();返回定制比较器;如果采用自然排序,返回null;
    Object first();
    Object last();返回最后一个元素;
    Object lower(obj);返回小于obj的最大元素;
    Object higher(obj);返回大于obj的最小元素;


2.3 EnumSet枚举集合类

    内部为位向量的形式存储,特点是高效。
    通过静态方法返回EnumSet对象。
    

Map 集合:

    Map<K,V> 该集合存储键值对,并且保证键的唯一性
    1、添加:put(K key,V value); 返回该键所对应的原来的值 putAll(Map);
    2、删除:clear();    remove(Object key);
    3、获取:get(Object key); 可以通过get的返回值判断一个键是否存在   
             size();    
             Collection values();返回该Map的value集合
Map集合的两种取出方式:(将Map集合转成Set集合,在通过迭代器取出对应的值)
<1> Set<Map.Entry<k,v>>  entrySet():将key-value对存入到Set中,返回Map.Entry 类型的对象;;可以通过迭代器取出
    Map.Entry是一个内部接口,
    方法:getKey(),getValue(), equals(),hashCode(),setValue() 
    Entry是Map接口的内部接口
<2> Set<T>  keySet():将Map中key存入到Set集合;
    因为Set具备迭代器,所以可以迭代方式取出所有的key,在使用get(key)方法获取value。
    4、判断:containsValue(Object value);
             containsKey(Object key);
             isEmpty();


一、Hashtable:底层是哈希表数据结构,不可存入null作为键或值的情况;该集合线程同步;

  |---Properties属性类

    方法:String getProperty(String key);获取key对应的值
          String getProperty(key,value);获取key对应的值,如果没有key,则设置key-value值
          String setProperty(key,value);设置key-value值
          
          void load(InputStream is);从is中以追加方式加载key-value对;
          void store(OutputStream os,String comments);将Properties中的key-value存入os中;
          

二、HashMap:底层是哈希表数据结构,并允许实现null键null值;该集合是不同步的; (JDK1.2)

  |---LinkedHashMap类 

三、TreeMap:底层是二叉树数据结构,线层不同步。可以用于给Map集合中的键进行排序;

    方法:
    Map.Entry firstEntry();--->firstKey();
    tail...head
    lower...higher

四、EnumMap:

    不允许使用null作为key,但可以作为value;
和Set很像,其实Set集合底层使用了Map集合。


Collections工具类:

    sort(list,comparator);给list排序,比较器Comparator;--->sort(list);自然顺序
    binarySearch(list,obj);二分法查找obj在有序的list中的索引
    fill(list,obj);使用obj替换list中所有元素;
    replaceAll(list,old,new);使用new替换list中的old元素;
    reverse(list);反转    
    swap(list ,ni,n2);交换list中的n1和n2位置
    reverseOrder()返回比较器对象,强行逆转实现了comparable接口的对象collection集合的自然顺序
    shuffle(list);对list随机排序,洗牌
    rotate(list,distance);distance为正数,将后distance个元素移到list前;为负数,将前distance个元素移到list后面。
    
    frequency(collection,obj);返回obj在collection出现的次数;
    max(collection);
    max(collection,comparator);
    min(collection);
    min(collection,comparator);    


    synchronizedXxx(? implents Xxx);  
    Xxx可以是Collection Map Set  List,获得Xxx的一个同步对象。


Arrays工具类

asList(T... arr)

    将数组转成固定长度的List集合,可以使用集合的思想操作数组中的元素。但是不可以使用集合的增删方法,因为数组长度是固定的。
    如果数组中的元素是对象,转成数组后,这成为集合中的元素。
    如果数组中的元素是基本数据类型,那么转成数组后,该数组作为集合中的元素存在。

Collection接口中的toArray(); <T> T[] toArray(T[] a);

1、指定类型的数组定义多长?
   当数组a长度小于集合的size,该方法内部会创建一个新的数组长度为size的数组:T[size];
   当数组a长度大于集合的size,使用该数组长度。list.size 指定长度,后面为null;
2、为什么要集合变数组?
   是为了限定对元素的操作。


增强for循环:

方便对集合(Collection)或者数组遍历操作,但是不可以有增删修改操作;
是迭代器的简化,有局限性;


可变参数

show(int... arr) 
{
  sop(arr.length);
}
将操作的元素作为参数传递即可,隐式的将参数封装成了数组。
使用时可变参数一定要定义在参数列表的最后面。




------- android培训、java培训、期待与您交流! ----------