A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 清风木扬 中级黑马   /  2014-3-27 11:26  /  1528 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

-集合框架
1.框架结构
    Collection
             List    元素有序的,元素可以重复,因为该集合体系有索引
                            ArrayList : 底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢。线程不 同步。
                            LinkedList 底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
                            Vector        底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
             Set   无序,不可以重复元素
                         HashSet   数据结构是哈希表.线程是非同步的,
                                       保证元素唯一性的原理:判断元素的hashCode值是否相同 如果相同,还会继续判断元素的equals方法,是否为true.
                        TreeSet  可以对Set集合中的元素进行排序,数据结构是二叉树.保证元素唯一性的依据:
                                       compareTo方法return 0.
                                      两个方式.元素实现Comparable接口,覆盖public int compareTo(Object obj)方法。
                                                     集合对象在创建时,传入比较器(实现Comparator接口覆盖public int
                                                    compare(Object o1,Object o2)覆盖                  
             Map 存储键值对,一对一对往里存.而且保证键的唯一性.
                     HashTable 底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的.
                    HashMap    底层是哈希表数据结构,允许使用null值和null键,线程不同步  
                    TreeMap    底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。
    Iterator(迭代器) ListIterator(List独有的迭代器) for
    Arrays Collections
2.Collection共性功能
   添加
       add(e)
       addAll(collection)
   删除
       remove(e)
       removeAll(collection)
       clear()
   判断
       contains(e)
       isEmpty()
   获取
       iterator()
       size()
   获取交集
       A.retainAll(B) 去除A集合中不在B集合的元素。如果A变化返回true,否则false
   集合变数组
       toArray()  //al.toArray(new String[al.size()]);

3.List特有方法。凡是可以操作角标的方法都是该体系特有的方法。
    增
       add(index,element);
       addAll(index,Collection);  
   删
         remove(index);
   改
        set(index,element);
   查
        get(index):
        subList(from,to);
        listIterator();
        int indexOf(obj):获取指定元素的位置。
        ListIterator listIterator();


List集合特有的迭代器。ListIterator是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。

所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。

4.LinkedList特有方法
    addFirst()
    addLast()
   getFirst()
   getLast()
   获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

  removeFirst()
  removeLast()
  获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

   在JDK1.6出现了替代方法。

   offerFirst();
   offerLast();

   peekFirst();
   peekLast();
   获取元素,但不删除元素。如果集合中没有元素,会返回null。

   pollFirst();
   pollLast();
   获取元素,但是元素被删除。如果集合中没有元素,会返回null。
5.Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
1,添加。
  put(K key, V value)
  putAll(Map<? extends K,? extends V> m)
2,删除。
  clear()
  remove(Object key)
3,判断。
  containsValue(Object value)
  containsKey(Object key)
  isEmpty()

4,获取。
  get(Object key)
  size()
  values()
  entrySet()
  keySet()

    map集合的两种取出方式:
     1,Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
                                    所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
  
                              Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。

     2,Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
     而这个关系的数据类型就是:Map.Entry
    Entry其实就是Map中的一个static内部接口。
    为什么要定义在内部呢?
    因为只有有了Map集合,有了键值对,才会有键值的映射关系。
    关系属于Map集合中的一个内部事物。
    而且该事物在直接访问Map集合中的元素。
     Map<String,String> map=new TreeMap<String,String>();
     map.put("lisi", "lisi");
     map.put("lisi01", "lisi01");
     map.put("lisi02", "lisi02");
     
     Set<Map.Entry<String, String>> entry=map.entrySet();
     for(Map.Entry<String, String> m:entry)
     {
         System.out.println(m.getKey()+m.getValue());
     }
     
     
     Set<String> key=map.keySet();
     for(Iterator<String> itr=key.iterator();itr.hasNext();)
     {  
         String st=itr.next();
         System.out.println(st+":"+map.get(st));
     }

二.泛型
   泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
  1. 好处
      1.1.将运行时期出现问题ClassCastException,转移到了编译时期。,
方便于程序员解决问题。让运行时问题减少,安全。,
      1.2,避免了强制转换麻烦。
  2.什么时候定义泛型类?
    当类中要操作的引用数据类型不确定的时候,
    早期定义Object来完成扩展。
  3.泛型的定义
   泛型类定义的泛型,在整个类中有效。如果被方法使用,
   那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
   
   为了让不同方法可以操作不同类型,而且类型还不确定。
   那么可以将泛型定义在方法上。
   特殊之处:
   静态方法不可以访问类上定义的泛型。
   如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
*/
class Demo<T>
{
public  void show(T t)
{
  System.out.println("show:"+t);
}
public <Q> void print(Q q)
{
  System.out.println("print:"+q);
}
public  static <W> void method(W t)
{
  System.out.println("method:"+t);
}
}
    4.泛型限定    泛型的限定;
    ? extends E: 可以接收E类型或者E的子类型。上限。
    ? super E: 可以接收E类型或者E的父类型。下限
三,其它
    Arrays
    Arrays.asList(数组)将数组变成list集合
    /*
    注意:将数组变成集合,不可以使用集合的增删方法。
    如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。
    如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
   */

    String[] arr = {"abc","cc","kkkk"};
  //把数组变成list集合有什么好处?
  可以使用集合的思想和方法来操作数组中的元素。
  注意:将数组变成集合,不可以使用集合的增删方法。
  因为数组的长度是固定。
  contains。
  get
  indexOf()
  subList();
  如果你增删。那么会反生UnsupportedOperationException */
  List<String> list = Arrays.asList(arr);
  //sop("contains:"+list.contains("cc"));
  //list.add("qq");//UnsupportedOperationException,


  Collections:集合框架的工具类。里面定义的都是静态方法。
  Collections.sort(list,new StrLenComparator());
  TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder(new StrLenComparator()));
Collections和Collection有什么区别?
Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。
  它有两个常用的子接口,
  List:对元素都有定义索引。有序的。可以重复元素。
  Set:不可以重复元素。无序。
Collections是集合框架中的一个工具类。该类中的方法都是静态的
  提供的方法中有可以对list集合进行排序,二分查找等方法。
  通常常用的集合都是线程不安全的。因为要提高效率。
  如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全
的。
static <E> Collection<E>
checkedCollection(Collection<E> c, Class<E> type)
          返回指定 collection 的一个动态类型安全视图。

        

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马