您的位置:首页 > 职场人生

黑马程序员--集合框架

2015-07-24 21:44 671 查看

-----------------ASP.Net+Unity开发、.Net培训、期待与您交流! -----------------

 

集合框架

一,概述:

1、简述:

    所谓集合,就是为方便对多个对象的操作,对对象进行存储。集合就是存储对象最常用的一种方式。

2、集合与数组的区别:

    数组:可存储同种类型的数据,但长度固定,也可存储基本类型的数据

    集合:只可存储对象,长度可变,类型可以不同。

3、集合的特点:

    只用于存储对象,长度可变,也可存不同类型的对象。

    集合是一个接口,将每种容器的共性提取,形成的一个体系。

4、数据结构:

    由于每种容器对数据的存储方式都各不相同,所以出现了不同的容器。此种存储方式称之为数据结构。

5、集合中存储的都是对象的引用(地址)。

 

二,集合体系如下图所示



 

三,集合共性方法操作

1、增加:

  add(Object obj);  添加元素

 

2、删除:

  remove();      删除集合中指定参数的元素

  removeAll();  删除当前集合中与另一集合相同的元素,即只保留与另一集合不同的元素

  clear();    清空集合中的元素,集合还存在

  retainAll()  保留此collection中那些也包含在指定collection中的所有元素

 

3、获取集合长度:

  size();  获取集合长度,即集合元素的个数

 

4、修改:

  set(int index,e);  将指定位置(index)上的元素修改为给定的参数e

 

5、判断:

  boolean contains(e);  判断给定元素e是否存在于集合中

 

6、迭代器:iterator()    集合取出元素的方式

  boolean hasNext();    判断是否还有下一个元素

  next();  取出下一个元素

 

集合体系如下:

Collection

    |--List:元素是有序的,元素可以重复。因为该集合体系有索引。

|---ArrayList:底层的数据结构使用的是数据结构。特点:查询速度很快。但增删稍慢。线程不同步。

|---LinkedList:底层的数据结构使用的是链表结构。特点:增删速度很快,查询速度稍慢。

|---Vector:底层是数组数据结构。线程同步。被ArrayList替代。

|--Set:元素是无序的,元素不可以重复。Set集合的功能和Collection是一致的。

  |--HashSet:底层数据结构是哈希表。线程非同步。

    HashSet是如何保证元素唯一性呢?是通过元素的两个方法,hashcode、equals方法来比
1b0e2


    如果元素的hashcode值相同,则不会调用equals。

    注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法

  |--TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树。保证元素唯一性的依据是compareTo 

      方法;

  TreeSet 排序的两种方式: 

  TreeSet排序的第一种方式:让元素自身具有可比较性。元素要实现Comparable接口,覆盖compareTo方法。    

这种方式称为元素自然顺序,也叫默认排序。

  TreeSet排序的第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集    

合自身具备比较性。在集合初始化时,就有了比较方式。

              即定义一个类,实现Comparator接口,覆盖compare方法。

  当两种排序都存在时,以比较器为主。

 

四,List集合

List:

  特有方法,凡是可以操作角标的方法都是该体系特有的方法。



add(index,element);

addAll(index,Collection);



remove(index);



set(index,element);



get(index)

subList(from,to)

listItertor()

 

五,Set集合

如上。

 

六,泛型

JDK1.5版本以后出现新特性。用于解决安全问题,是一个安全机制。

优点:1.将运行时期出现的问题ClassCastException,转移到了编译时期。

  方便于程序员解决问题,让运行时期问题介绍,安全。

            2.避免了强制转换麻烦。

 

泛型格式:通过<>来定义要操作的引用数据类型。

泛型通常出现在集合框架框架中。<>其实就是用来接收类型的。

当使用集合时,将集合要存储的数据类型作为参数传递到<>中。

什么时候定义泛型类?

当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来完成扩展。

泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了

为了让不同的方法可以操作不同的类型,而且类型还不确定。那么可以将泛型定义在方法上

特殊之处:

静态方法不可以访问类上定义的泛型。

如果静态方法操作的应用数据类型不确定,可以将泛型定义在静态方法上。

 

七,Map集合

  该集合存储键值对。一对一对往里存。而且要保证键的唯一性。

常见操作

1,添加。

  put(K Key,V Value),添加元素,如果出现添加时是相同的键,那么后添加的值会覆盖原有键对应的值。并且put方法会返回被覆盖的值。

  putAll(Map<? extends K,? extends V>)

2,删除。

  clear()

  remove()

3,判断。

  cotainsKey(),

  cotainsValue()

  isEmpty()

4,获取。

  get(Object key)

  size()

  values()

  entrySet()

  keySet()

Map

|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。线程同步。jdk1.0,效率低

|--HashMap:底层是哈希表数据结构,可以使用null键null值。线程非同步。jdk1.2,效率高

|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于map集合中的键进行排序。

和Set很像。其实,Set底层使用的就是Map。

  map集合取出原理。

  将map集合转成SET集合。再通过迭代器取出。

  map集合的两种取出方式:

  1,Set<K> KeySet: 将map中所有键存入到Set集合。因为Set具备迭代器,所以可以根据get方法,获取每一

      个键的值。

  2,Set<Map.Entry<K,V>> entrySet: 将map集合中的映射关系存入到Set集合中,而这个关系的数据类型是       map.Entry.

Map.Entry 其实Entry也是一个借口,它是Map借口中的一个内部接口。

interface Map

{

public static interface Entry

{

public abstract Object getKey();

public abstract Object getValue();

}

}

 

八,集合框架的工具类

  Collections:常见方法:

(1)sort(List<T> list)

        根据元素的自然顺序 对指定列表按升序进行排序。

(2)sort(List<T> list, Comparator<? super T> c)

        根据指定比较器产生的顺序对指定列表进行排序。

(3)max(Collection<? extends T> coll, Comparator<? super T> comp)

        根据指定比较器产生的顺序,返回给定 collection 的最大元素。

(4)binarySearch(List<? extends Comparable<? super T>> list, T key)

        使用二分搜索法搜索指定列表,以获得指定对象。

(5)fill(List<? super T> list, T obj)

        使用指定元素替换指定列表中的所有元素。

(6)replaceAll(List<T> list, T oldVal, T newVal)

        使用另一个值替换列表中出现的所有某一指定值。

(7)reverseOrder(Comparator<T> cmp)

        返回一个比较器,它强行逆转指定比较器的顺序。

(8)synchronizedCollection(Collection<T> c)

        返回指定 collection 支持的同步(线程安全的)collection。

 

Arrays:用于操作数组的工具类

asList(T... a)

        返回一个受指定数组支持的固定大小的列表。

注意:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定的。否则会出现异常。

如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。

如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素。

 

集合变数组;为了限定对元素的操作。

Collection接口中的toArray方法。

 

九,JDK1.5新特性

高级for循环

格式:

for(数据类型 变量名 : 被遍历的集合(Collection)或者数组)

{

}

注意:

对集合进行遍历时,只能获取元素,但是不能对集合进行操作。

迭代器除了遍历,还可以进行remove集合中元素。

如果使用listIterator,还可以在遍历过程中对集合进行增删改查的动作。

传统for和高级for循环有什么区别呢?

高级for循环有一个局限性,必须有被遍历的目标。

建议在遍历数组时,建议使用传统for循环。

 

可变参数

  JDK1.5版本之后出现的新特性。

方法的可变参数,

在使用时注意,可变参数一定要定义在参数列表最后面。

 

静态导入

注意:

当类名重名时,需要指定具体的包名。

当方法重名时,指定具备所属的对象或者类。
-------------ASP.Net+Unity开发、.Net培训、期待与您交流! ------------
详情请查看:www.itheima.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: