码迷,mamicode.com
首页 > 其他好文 > 详细

集合框架和泛型框架

时间:2016-07-31 10:16:56      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:

本文出自:http://blog.csdn.net/dt235201314/article/details/52075211

一丶基本概念

一、集合框架概述

        1、集合类的出现:面向对象语言对事物的体现的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。

        2、数组与集合的异同:数组和集合同是容器,数组既能存储基本数据类型,也能存储对象,集合只能存储对象,数组的长度是固定的,集合的长度是可变的,数组内存储的对象类型在创建时就已经确定了,而集合可以存储多种不同类对象。

        3、集合类中有众多的子类对象,它们作为容器对数据的存储方式都不同,这种方式叫做数据结构。

二、Collection

       Collection是集合的根接口,其中定义了集合这一体系的共性功能,在集合中存储的都是对象的引用,既地址。

       1、增加:往集合中加入元素的方法有add、addAll,其中add方法的参数类型是object,以便于接收任意类型的对象,addAll方法的参数类型是集合,用于将集合中的元素全部加入到指定集合中,这两种方法的返回值类型均为boolean。

       2、删除:集合中控制删除的方法有remove、removeAll()、clear(),clear方法用于清空集合,没有具体的返回值类型,remove用于删除某个对象,removeAll用于删除集合参数内存在于调用该方法集合内的对象,这两种方法返回值类型均为boolean。

       3、判断:contains方法有两个重载函数,用于判断是否存在某个对象或者某个集合。

       4、获取:iterator方法获取迭代器用于取出集合中的元素。迭代器定义于集合内部,是一个内部类,这样就可以直接访问结合内部的元素,每一个容器的数据结构不同,所以取出的动作的细节也不同,但是都有共性的内容,判断和取出,将这么共性的内容进行抽取就形成了接口iterator。

       5、查询:size方法用于获取集合元素的个数。

三、List

       1、List类是Collection类一个子类,是一个抽象类,它存储对象的特点是有序的,元素可以重复,我们经常使用的List子类对象是ArrayList、LinkedList、Vector。因为List集合体系是有序列的,所以List集合可以通过角标操作集合内的元素。

       2、List集合的特性

      (1)特有方法:增加:add(int index,element):在指定位置增加元素,没有具体的返回值类型。

                                            add(int index,Collection):在指定位置增加集合,返回值类型为boolean。

                                 删除:remove(int index):删除指定位置的元素,并返回删除的元素。

                                 更改:set(int index,element):将指定位置的元素用给定的元素替换,并返回被替换的元素。

                                 查询:get(int index):获取指定位置的元素。

                                            subList(int from,int end):获取指定区间内的所有元素。

       (2)List特有迭代器:ListIterator是Iterator的子接口,在迭代时,我们不可以通过集合对象的方法操作集合中的元素,因为会发生并发修改异常,所以只能使用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素就行判断、取出和删除操作,弱国想要对元素进行修改、增加等,我们就可以使用ListIterator实现,它的另一个特殊方法是逆向遍历集合,通过hasProvious和privious方法实现。

       (3)ArrayList、LinkedList和Vector的比较:ArrayList的底层数据结构是数组结构,查询速度很快,但增删较慢,线程是不同步的,LinkedList的底层数据结构是链表结构,增删很快,查询速度很慢。Vertor的底层数据结构是数组结构,功能与ArrayList相同,它是1.2版本以前使用的,但是它是线程同步的,无论增删或者查询的速度都很慢,所以被ArrayList所取代,

       (4)在Vector中有一个特有的取出元素的方法枚举,通过elements方法获取枚举Enumeration,在通过hasMoreElements和nextElement方法实现取出元素的过程,由此可见,枚举的名称和枚举方法的名称都很长,不便于书写,所以被迭代器所取代。

       (5)在LinkedList中也存在一些其特有方法:addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()分别实现在集合的开始、末尾增加、获取、删除元素,removeFirst和removeLast方法在删除元素的同时会返回被删除的元素,当集合中没有元素时会抛出NoSuchElementsException,而在1.6版本以后这六种方法被offerFirst、offerLast、peekFirst、peekLast、pollFirst、pollLast取代,不同之处在于但pollFirst、pollLast方法删除获取元素时,如果集合内没有元素,会返回null而不会抛出异常。

       (6)List集合判断元素是否相同的依据是元素的equals方法。

四、Set

       1、Set集合不同于List集合,它的元素是无序的,且不可重复,在Set集合中没有特殊的方法,全是实现的Collection的方法。常用的两个Set类结合有HashSet、TreeSet、

       2、HashSet:底层是哈希表数据结构,线程非同步的,元素存入后按哈希值的大小存储。HashSet是保证元素唯一性依据的是hashCode和equals方法,如果元素的hashCode值一样,就会继续判断equals是否为true,如果hashCode值不同,不会调用equals方法。同样的在进行remove和contains方法时,会调用hashCode方法,如果没有相同的hashCode值,则不存在,如果有相同的hashCode值,会判断equals是否为true。

       3、TreeSet:TreeSet集合的底层数据结构是二叉树,特点是可以对Set集合中的元素进行排序,进行排序的依据是存入的对象必须具有比较性,因此需要实现comparable,该接口可以强制让实现该接口的对象具有比较性,保证元素唯一性的依据是compareTo方法的返回值是0,TreeSet实现排序的方式有两种,一是实现comparable接口,覆盖compareTo方法,让元素自身具备比较性,这种方式也称为元素的自然顺序,或者叫默认顺序,第二种方式是当元素自身不具备比较性或者具备的比较性不是我们所需要的,那么我们就让集合自身具备比较性,定义一个比较器作为参数传递给集合的构造函数,这样集合在初始化时就具备了比较性。当两种排序都存在时,以比较器为主。

一、Map

       1、Map集合中存储的是键值对,一对一对的往里存,并且要保证键值的唯一性。

       2、Map集合的方法:(1)增加:put(K key,V value)该方法会返回key值之前对应的value值。putAll方法则是将另一个Map集合中的键值对存储到指定集合中。

                                        (2)删除:remove(K key)该方法在删除键的同时会同时返回对应的值。clear方法清空Map集合。

                                        (3)判断:containsKey和containsValue方法分别判断指定Map集合中是否有对应的键值。

                                        (4)查询:get(K  key)获取该键对应的值,values方法获取存储有所有值的collection集合,size方法获取Map集合的键值对个数。

                                        (5)获取:主要有两种方法,keySet方法和entrySet,取出的原理就是将Map集合转成Set集合在遍历迭代器取出。

        keySet方法是将Map集合中的键存入到set集合中,因为set集合具有迭代器,可以通过迭代器的方式取出所有的键,然后在调用Map集合本身的get方法获取对应的值,entrySet方法是返回一个存储有键值对映射关系的set集合,该映射关系是一个内部接口Entry,没有Map就没有Entry,所以定义在内部,获取到该存储有映射关系的集合后通过迭代器出去映射关系,在通过Entry的子类对象复写的getValue和getKey方法获取键值对。

         当数据之间存在映射关系时,就可以使用Map集合进行数据的存储,同时Map集合中也可以存储Map集合作为值存在,用以解决多种映射关系同时存在的问题。

        3、Map集合的常用子类对象:HashTable、HashMap、TreeMap,HashTable的底层数据结构是哈希表数据结构,不可以存入null键和null值,线程是同步的,HashMap的底层数据结构也是哈希表数据结构,它可以存入null键和null值,线程是非同步的,TreeMap的底层数据结构是二叉树,线程是非同步的,可以给Map集合中的键进行排序。我们可以通过get方法的返回值来判断一个键是否存在,如果返回值为null,则不存在该键。

二、Collections

        1、Collections是集合框架工具类,专门用于对集合进行操作,其中全都是静态方法。

        2、Collections方法:

      (1)sort方法用于给List集合中的元素进行排序,有两个重载函数,既可以传入自身具有比较性的对象,对其进行自然排序,也可以通过传入比较器的方法对任意List集合中元素进行排序。

      (2)max方法,用于获取list集合中最大的元素,和sort相同的也有两个重载函数,一种是获取自身具备比较性的list集合的最大值,另一种是将比较器作为参数传递给max方法获取按该比较器排序后的list集合的最大值。

      (3)binarySearch方法是通过二分法获取list集合内元素的角标,如果集合内不存在该元素,则返回该元素的插入位置加一的负数。

      (4)fill方法是使用指定的元素替换list集合中所有的元素,它的内部原理是通过indexOf方法获取元素的角标,在通过set方法更改该角标上的元素。

      (5)reverse方法是反转list集合中的元素。

      (6)reverseOrder方法是返回一个比较器,逆转实现Comparator接口的Collection的自然顺序。

      (7)swap方法用于置换指定角标的两个元素的位置。

      (8)synchronizedList、synchronizedSet、synchronizedMap方法是将集合变成线程同步的,在方法内部定义了内部类重写了Collection集合的方法,将其内部的代码写成Synchronized代码块,并使用同一把锁,从而实现同步的效果。

三、Arrays

        Arrays是用于操作数组的工具类,里面也全是静态方法,其中的asList方法是将数组变成List集合,这样就可以使用集合的思想和方法来操作数组中的元素,但不可以进行增删,因为数组的长度是有限的,如果增删会抛出不支持的操作异常。同样的在Collection集合内也定义了toString方法,当把数组作为参数传递给该方法时,指定类型的数组长度如果小于集合的size,那么方法内部会创建一个新的数组,长度为集合的size,如果数组长度大于集合的size,就会传入该数组,所以创建刚刚好的数组最优,而将集合变为数组的目的是限制对元素的操作。

四、其他对象

       1、System:System是一个最终类,类中的方法和属性都是静态的,它不能创建对象,通过getProperties获得存储系统的属性信息的Properties集合,该集合是HashTable的子类,可以通过HashTable的方法取出其中的元素,Properties集合中存储的都是字符串。我们也可以通过setProperty的方法设置属性信息,也可以在JVM启动时通过java -Dkey=value的方式动态加载一些属性信息。

       2、Runtime:每一个java应用程序都有一个Runtime类实例,使应用程序与运行环境相连接,该类并没有通过提供构造函数,但其中却有非静态方法,我们需要通过静态的getRuntime方法获取Runtime对象,这是一个丹利设计模式的实例。Runtime中的大部分都是抽象方法,因为调用的是底层资源,不需要我们进行操作,同时提过了exec方法开启线程,destroy方法关闭子进程。

       3、Date:日期类,可以创建对象,并通过SimpleDateFormat(位于java.text包中)对日期进行格式化。

            Calendar:日历类,是一个抽象类,通过getInstance方法获得对象,在该类中对年、月、日等基本信息都进行了封装,我们可以通过访问对象的属性Calendar.YEAR、Calendar.MONTH、Calendar.DAY_OF_MONTH等方法获取日历信息,也可以通过set方法设置年月日,add方法给指定的字段加时间段,值得注意的是显示的月份要加一才是实际的月份,所以我们在设置月份时也要设置我们想要的月份减一。

       4、Math:包含了基本数据运算的方法,我们常用的是ads获取绝对值方法,ceil和floor方法都是获取double型整数,ceil方法是获取大于等于指定doule数据的最小整数,floor方法是获取小于等于这个double数据的最大整数。round方法是四舍五入获取指定double数据的int型数据,pow方法是求指定数据的指定次幂,在该类中还有一个重要的方法random,该方法用于获取0到1之间包括0不包括1的随机double数据,我们也可以通过通过创建Random类调用nextInt方法指定int数值,获取0到int之间的随机数。 

二丶专家总结

http://blog.csdn.net/u013142781/article/details/50435406

三丶专栏推荐



Java集合源码解析

java集合框架源码解析


四丶博主体会

11111

集合框架和泛型框架

标签:

原文地址:http://blog.csdn.net/dt235201314/article/details/52075211

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!