黑马程序员技术交流社区

标题: 集合框架 [打印本页]

作者: a1ccwt    时间: 2015-8-21 21:00
标题: 集合框架
集合框架(用到集合类 首先要导包)
   面向对象语言对事物的体现都是以对象形式,所以为了方便对多个对象的操作
   就对对象进行存储,集合就是存储对象最常用的一种方式。
数组和集合类同事容器的区别。
   数组虽然可以存储对象,但长度是固定的集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点:
   集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象

集合框架的构成和分类

Collection
             List
                    ArrayList
                    LinkedList
                    Vector
             Set
                    HashSet
                    TreeSet

集合和对象都存的是地址

add方法的参数类型是Object,以便于接收任意类型对象
集合中存储的都是对象的引用(地址)

添加元素:
      x.add("aa");
删除元素:
      x.remove("aa");
      x.vlear();清空集合
判断元素:
      x.contains("aa"); 是否存在该元素
      x.isEmpty();元素是否为空
      x.size();元素和数
交集:
      x.retainAll(y);x集合和y集合都拥有

迭代器:
     就是集合的取出元素的方式。
就是把取出方式定义在集合内部
这样取出方式就可以直接访问集合内容的元素
那么取出方式就被定义成了内部类
而每一个容易的数据结构不同
所取出的动作细节也不一样,但是都有共性内容判断和取出,那么可以将写共性抽取
         Iterator  接口
那么这些内部类都符合一个规则,该规则是Iterater.

Collection
    List  元素是有序的,元素可以重复,因为该集合体系有索引
    Set 元素是无序,元素不可以重复

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

增:add(index,element)
    addAll(index,collection)
删:
    remove(index)
改:
    set(index,element);
查:
    get(index)
    subList(from,to)
    ListIterator();

List集合特有的迭代器,ListIterator是Iterator的子接口
在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生异常
所以在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的
只能对元素进行判断,取出,删除操作。
如果想要其他的操作如添加,修改等。就需要使用其子接口。(ListIterator)
该接口只能通过List集合的ListIterator方法获取
ListIterator元素都有角标

List:常见的三个子类对象

ArrayList 底层的数据结构使用的是数组结构 (查询速度快,但增删稍慢)(线程不同步)
LinkedList 底层是链表数据结构(增删速度快,查询慢)(线程同步)
Vector 底层是数组数据结构,被Array替代(增删慢,查询慢)


Vector:
枚举就是Vector的特有取出方式。和迭代器的方法一样,因为名称过长,被迭代器取代。

LinkedList特有方法
addFirst() 增加到头部
addLast()  增加到尾部
getFirst() 取头不删
getLast()  取尾不删
removeFirst() 取头删除
removeLast()取尾删除
如果集合中没有元素会出现异常


Set:元素是无序的,元素不可以重复(存入和取出的顺序不一定一致。)
HashSet:数据结构是哈希表,线程是非同步的
         保证元素唯一性原理,判断元素的HashCode值是否相同
         如果相同,还会继续判断元素的equals方法,是否为true
TreeSet 可以对Set集中的元素进行排序。(底层元素唯一的依据)
        底层数据结构是二叉树
TreeSet 排序的第一种方式:让元素自身具备比较性。(元素需要实现Comparable接口)
        这种方式也称为元素的自然顺序,或者叫做默认顺序
TreeSet 的第二种排序方法
        当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性,在集合初始化时,就有了比较方式
        这时需要让容器自身具备比较性,定义了比较器,将比较器对象作为参数传递。

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


泛型:用于解决安全问题,是一种安全机制
好处:将运行时期出现问题classCastException转移到了编译时期
      方便于程序员,解决问题,让运行时期问题减少
      避免了强制转换的麻烦
泛型的格式:通过<>来定义要操作的引用数据类型

使用泛型:
     当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可
定义泛型类
     当类中要操作的引用数据类型不确定的时候早起定义object来完成扩展
     现在定义泛型来完成扩展
泛型方法
     泛型类定义的泛型,在整个类中有效,如果被方法使用。
     那么泛型类的对象明确要操作的具体类型后,所以要操作的类型就已经固定了。
     为了让不同方法可以操作不同类型而且类型还不确定:那么可以就爱那个泛型定义在方法上

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


Map:该集合存储值对,一对一对往里存。而且要保证数据的唯一性

添加: put(k key,v value)
       putAll()
删除   clear()
       remove(object key)
判断   containsValue(object Value)
       containskey(object key)
获取   get(object key)
       size()
       values()
       entrySet()
       keySet()

Map子类的特点(和Set很像,Set底层用的Map集合)
      Hashtable 底层是哈希表数据结构,不可以存储null键,null值,该集合是线程同步的
      HashMap   底层是哈希表数据结构,继续是用null值和null键该集合是不同步的
      TreeMap   底层是二叉树数据结构,线程不同步,可以用于给map集合中键进行排序


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

Map-entrySet:将map集合中的映射关系存入到了Set集合中
              而这个关系的数据类型就是Map.Entry


Map扩展:被使用是因为具备映射关系。


数组变集合:
   Arrays:用于操作数组的工具类,里面都是静态方法

asList:将数组变成List集合
好处:可以用集合的思想和方法来操作数组中的元素。
注意:将数组变集合,不可以使用集合的增删方法,因为数组的长度是固定的


集合变数组:
Collection接口中的toArray方法
  当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的  数组,长度为集合的size
  当指定类型的数组长度大于了集合的size,就不会新创建了数组,而是使用  传递来的数组,所以创建一个刚刚好的数组最优。
集合变数组的好处:限定对元素的操作,不需要进行增删了

增强for循环
       格式:for(数据类型 变量名:被遍历的集合式数组){}
对集合进行遍历:只能获取集合元素,但不能对集合进行操作
               迭代器除了遍历,还可以进行remove集合中元素的动作,如               果使用ListIterator,还可以在遍历过程中进行增删改查的               动作。
传统for和增强for的区别
    高级for有一个局限性,必须有被遍历的目标
建议:在遍历数组的时候,还是希望使用传统for因为传统for可以定义角标。


Runntime对象
该类并没有提供构造函数
说明不可以new对象,那么会直接想到该类中的方法都是静态的
发现该类中还有非静态方法
说明了该类肯定会提供了方法获取本类对象,而且该方法是静态的,并返回值类型是本类类型。
该方法是:staicRunntime.getRunntime()
(由这个特点可以看出该类使用了单例设计模式)
  destroy() 杀掉子进程。

Math.Random
Math.Cell方法:返回最大于指定数据的最小整数。
Math.floor:返回小于指定数据的最小整数
Math.round 四舍五入
Math.random  返回0和1之间的随机数(和nextInt(10)相同)
作者: 段山虎    时间: 2015-8-21 21:08
黑马越来越6了。。
作者: 壊亊唑侭    时间: 2015-8-21 21:20
回复是一种美德
作者: burningzzy    时间: 2015-8-21 21:22
多总结,很好




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