Java基础--集合框架(一)

<span style="font-size:14px;">------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------</span>

集合框架
集合类
一:为什么出现集合类?

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

二:数组和集合类同是容器,有何不同?

        数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。

数组中只能存同一种数据类型的对象,因为数组一定义的时候就已经制定数据类型了。而集合,只要是对象就可以存储。

三:集合类的特点

        集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
集合框架的构成与分类:

如图所示:


集合体系:



集合内存图解:



集合和数组一样,内部存储的是地址(引用),而不是对象(不然存储空间太臃肿)


Collection
Collection 是集合框架中的常用接口。其下有两个子接口:List(列表),Set(集)。
所属关系:
Collection
|--List//元素是有序的,元素可以重复。因为该集合体系有索引。
|--Set//元素是无序的,元素不可以重复。
一:Collection集合框架的共性功能。
1.添加元素
        add(Objectobj); //add方法的参数类型是Object。以便于接收任意类型对象。
2.删除元素
        remove(Objectobj);
        removeAll(另一集合);//调用者只保留另一集合中没有的元素。
        clear();//清空集合
3.判断元素
        contains(Objectobj);//判断是否存在obj这个元素
        isEmpty();//是否为空
4.获取个数,集合长度
        size();
5.取交集
        retainAll(另一集合);//调用者只保留两集合的共性元素。
//al1.retainAll(al2);//去交集,al1中只会保留和al2中相同的元素。
6.集合变数组。
toArray();

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

二:迭代

1.什么是迭代器?
迭代是取出集合中元素的一种方式。
对于集合的元素取出这个动作:
当不足以用一个函数来描述,需要用多个功能来体现,所以就将取出这个动作封装成一个对象来描述。就把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了内部类。
而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都具有共性内容: 判断和取出。那么就可以将这些共性抽取。
那么这些内部类都符合一个规则(或者说都抽取出来一个规则)。该规则就是Iterator。通过一个对外提供的方法:iterator();,来获取集合的取出对象。
因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。

迭代器内部设计方式图解: !!!理解重要!!!


2.迭代的常见操作
        hasNext();//有下一个元素,返回真
        next();//取出下一个元素
        remove();//移除
注:在迭代时循环中next调用一次,就要hasNext判断一次。
使用:
         ArrayList al = new ArrayList();//创建一个集合
        Iteratorit = al.iterator();//获取一个迭代器,用于取出集合中的元素。
        第一种打印方式:   !!用这种,因为 iter在表达式中,用完内存释放 
                for(Iterator iter = al.iterator();iter.hasNext();  )
                {
                           System.out.println(iter.next());
                }
       第二种打印方式:
                 Iteratoriter = al.iterator();
                while(iter.hasNext())
               {
                           System.out.println(iter.next());
               }
3.迭代注意事项
迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration(枚举)。
迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException。

迭代器的next方法返回值类型是Object,所以要记得类型转换。


List

一:List组成
Collection
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。List集合都带有脚标!!!
            |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
 ArrayList初始容量为10的空列表。超过,new 新的数组50%延长。
            |--LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
            |--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。Vector支持枚举,而ArrayList没有。

|--Set

二:List的特有方法

        凡是可以操作角标的方法都是该体系特有的方法。
增:
        booleanadd(index,element);//指定位置添加元素
        BooleanaddAll(index,Collection);//在指定位置增加给定集合中的所有元素,若省略位置参数,则在当前集合的后面依次添加元素
删:
        Booleanremove(index);//删除指定位置的元素
改:
        set(index,element);//修改指定位置的元素。
查:
        get(index);//通过角标获取元素
        subList(from,to);//获取部分对象元素
其他:
        listIterator();//List特有的迭代器
        indexOf(obj);//获取元素第一次出现的位置,如果没有则返回-1

注:List集合判断元素是否相同,移除等操作,依据的是元素的equals方法。

三:ListIterator是List集合特有的迭代器,Iterator的子接口!!!掌握

在遍历集合的过程中进行增删改查。
1:概述 
ListIterator li = al.listIterator();  //将元素的引用取到迭代器里
while(li.hasNext())
{
Object obj = li.next();
if(obj.equals("java02"))
//li.add("java009"); 会报出ConcurrentModificationException异常,因为操作集合有两种方式,
// 一种是集合的方法操作元素,一种是迭代器的放法操作元素
// 但是这两种方式操作的是同一组元素,所以会产生问题,正在用迭代的方式
// 操作集合的同时又在用集合的方式操作集合,就有可能产生安全隐患
li.set("java006");//修改Java002
}
       ListIterator是List集合特有的迭代器,是Iterator的子接口。
       在迭代时,不可以通过集合对象的方法操作集合中的元素。
       因为会发生ConcurrentModificationException异常。所以在迭代器时,
       只能用迭代器的方法操作元素。可是Iterator方法是有限的,只能对元素进行判断,
       取出,删除的操作。如果想要其他的操作,如添加、修改等,
       就需要使用其子接口:ListIterrator。该接口只能通过List集合的ListIterator方法获取。


2:ListIterator特有的方法
        add(obj);//增加
        set(obj);//修改为obj
        hasPrevious();//判断前面有没有元素

        previous();//取前一个元素

四:枚举Enumeration

枚举:

就是Vector特有的取出方式。Vector有三种取出方式。
其实枚举和迭代是一样的。因为枚举的名称以及方法的名称都过长。所以被迭代器取代了。
特有方法:
         addElement(obj);//添加元素,相当于add(obj);
         Enumerationelements();//Vector特有取出方式(枚举)
         hasMoreElements();//相当于Iterator的hasNext()方法

         nextElements();//相当于Iterator的next()方法

五:LinkedList

        LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
特有方法:
增:
        addFirst();
        addLast();
获取:
        //获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
        getFirst();
        getLast();
删:
        //获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementException
        removeFirst();
        removeLast();
在JDK1.6以后,出现了替代方法。
增:
        offFirst();
        offLast();
获取:
        //获取元素,但是不删除。如果集合中没有元素,会返回null。
        peekFirst();
        peekLast();
删:
        //获取元素,并删除元素。如果集合中没有元素,会返回null。
        pollFirst();

        pollLast();

练习1:LinkedListTest.java!!必须掌握

使用LinkedList模拟一个堆栈或者队列数据结构。 
堆栈:先进后出  如同一个杯子。装子弹 

队列:先进先出 First in First out  FIFO 如同一个水管。

练习2:

ArrayListTest.java!!!很重要

ArrayListTest2.java !!!必须掌握


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

List的contains和remove方法,底层调用的都是equals方法!!!
而HashSet方法,依赖的是元素的hashcode(先)和equals方法(再)。

Set
一:概述
Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。     
|--HashSet:底层数据结构是哈希表。线程不同步。 
保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,还会继续判断元素的equals方法,是否为true。
|--TreeSet:可以对Set集合中的元素进行排序。默认按照字母的自然排序。底层数据结构是二叉树。保证元素唯一性的依据:compareTo方法return 0。
Set集合的功能和Collection是一致的!!!

Hash表中,是按照hash值来存储的,但是对象生成的hash值可能有大有小,取数据的时候是按照hash表中的
hash值顺序取的,所以取出对象的顺序就是无序的。注意:当hash表中的hash值重复的时候,还有一次校验方式,判断是否是

同一个对象,也就是equals方法。

二:HasSet

        HashSet:线程不安全,存取速度快。
       可以通过元素的两个方法,hashCode和equals来完成保证元素唯一性。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。

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

三:原理

HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
hashcode和equals方法复写的是Object对象的对应方法。

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

图解Hash值:!!!




练习:HashSetTest.java!!!重要
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值