黑马程序员——java基础---集合(第14天)

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流-----

集合

一、概述

1、为什么会出现这个多余的容器呢?

因为每一个容器对数据的存储方式有所不同。

这个存储方式称之为:数据结构。

2、数组和集合类同是容器,有何不同?

数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。

数组中可以存储基本数据类型,集合只能存储对象。

3、集合类的特点

集合只用于存储对象,其实集合中存储的都是对象的引用(地址)

集合长度是可变的,

集合可以存储不同类型的对象。

4、集合框架的构成以及分类


5、集合框架中的常用接口

Collection接口中有两个常用的子接口:List(列表),Set(集)。

5.1、List:可存放重复元素,元素存取是有序的

5.1.1  ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。(可变长度数组:默认长度为10的数组 ,每次增加50%的长度)

5.1.2  LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。

5.1.3  Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。(此为枚举功能)(可变长度数组:默认长度为10的数组 ,每次增加100%的长度)

5.2、Set:不可以存放重复元素,元素存取是无序的

二、collection常用的共性方法

1、共性方法“增、删、改、查”

从上图中可以看出“collection”是属于父类,故其中的方法都属于共性方法。

 Collection定义了集合框架的共性功能。

 import java.util.*;(因“collection”是包java.util中的功能故在使用前需先导包)

1.1,添加

boolean add(E e)

boolean addAll(Collection<? extendsE> c);

1.2,删除

删除集合中的某个元素    boolean remove(Object o);

清空集合                           void clear();  

1.3,判断

判断某个元素是否在该集合中存在   boolean contains(Object o);

判断某个集合是否在该集合中存在  包含的集合.containsAll(被包含的集合);

判断整个集合是否为空       boolean isEmpty();

1.4,获取

迭代器        Iterator<E> iterator();

集合长度    int size();       

1.5,交集

获取交集:  boolean  retainAll(Collection<?> c)

删除交集:  boolean  removeAll(Collection<?> c) 

1.6,集合变数组

Object[]  toArray();

注意: 1,add方法的参数类型是Object。以便于接收任意类型对象。

             2,集合中存储的都是对象的引用(地址)

             3,具体程序用法举例请参阅JIHE1;

2、迭代器

定义:集合中取出元素的方式。           

迭代器是取出方式,会直接访问集合中的元素。

所以将迭代器以内部类的形式来进行描述。

通过容器的iterator()方法获取该内部类的对象。

迭代器中的常用方法 (共性迭代器有很大局限性,只有“删”操作)

1,boolean hasNext(),如果下一个仍有元素可以迭代,则返回TRUE

2,E    next(),  返回迭代的下一个元素

3,void remove()  从迭代器指向的COLLECTION中移除迭代器返回的最后一个元素(可选操作 )

  注意:1、此为迭代器的共性方法(即collection中的迭代器的方法),只有移除操作,故有局限性。

               2、使用迭代器时,每调用一次Next(),就要调用hasNext()判断一次。(不可以调用一次hasNext()而多次调用Next())

三、  各个常用的子接口

1、List(列表)接口

凡是可以操作角标的方法都是该体系特有的方法。(示例详见ListDemo)

1.1 、ArrayList函数常用的特有方法

1.1.1、增加

void add(int index, E element);在指定位置添加元素

boolean addAll(int index, Collection<? extendsE> c);

1.1. 2、删除

Eremove(int index); 移除列表中指定位置的元素

1.1.3、修改

Eset(int index, E element); 用指定元素替换列表中指定位置的元素

1.1.4、查询

Eget(int index);返回列表中指定位置的元素。

List<E> subList(区间开始角标,区间结束角标)获取某区间的元素(含头不含尾)

int indexOf(预获取元素):获取指定元素的位置。

ListIterator listIterator();

ListIterator listIterator(int index);

将容器中的元素都打印一遍

方法一:For循环

for(int x=0;x<a1.size();x++)

{

System.out.println(a1.get(x));

  }

方法二:迭代器

ArrayList it = new ArrayList();

while(a1.hasNext)

{

System.out.println(a1.next());

}

1.2 、List接口的特有迭代器ListIterator

1.2.1此迭代器的特有功能

       1.2.1.1   增void add()         将指定的元素插入列表

        1.2.1.2   删 voidremove()  移除

       1.2.1.3   改voidset(E e)     替换

       1.2.1.4   查hasPrevious()如果以逆向遍历列表,列表迭代器有多个元素,则返回true

             Previous()返回列表中的前一个元素。

注意:1、ArrayList判断元素是否存在,以及删除等操作,依赖方法equals(equals的父类是Object)。

    2、并发修改异常(ConcurrentModificationException)

         在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生并发修改异常。所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口迭代器ListIterator,这样在迭代的时候 可以随意进行增删改查等各种操作。

1.3、Vector枚举函数(几乎不用)

枚举是Vector特有的取出方式。

其实枚举和迭代是一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了。

特有方法: Enumeration<E> Elements() 返回此向量的组件的枚举。        

Enumeration接口中的两个常用方法:

booleanhasMoreElements()测试此枚举是否包含更多的元素

EnextElement()  返回此枚举的下一个元素

代码示例:

Vectorv = new Vector();

v.add("java01");

Enumeration en = v.elements();

while(en.hasMoreElements())

{

System.out.println(en.nextElement());

}

1.4、 LinkedList中的特有方法   

void addFirst(E e) 将指定元素插入此列表的开头

void addLast(E e) 将指定元素添加到此列表的结尾。

getFirst()返回此列表的第一个元素。

E  getLast()返回此列表的最后一个元素

获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException


E removeFirst()  移除并返回此列表的第一个元素。

E removeLast() 移除并返回此列表的最后一个元素。

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

 

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

boolean offerFirst(E e) 在此列表的开头插入指定的元素。

boolean offerLast(E e) 在此列表末尾插入指定的元素。

 

peek()  获取但不移除此列表的头(第一个元素)。

E peekFirst();获取但不移除此列表的第一个元素;如果此列表为空,则返回null。

E peekLast();获取但不移除此列表的最后一个元素如果此列表为空,则返回null。

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

 

poll()  获取并移除此列表的头(第一个元素)

E pollFirst();获取并移除此列表的第一个元素;如果此列表为空,则返回null。

E pollLast();获取并移除此列表的最后一个元素;如果此列表为空,则返回null。

获取元素,但是元素被删除。如果集合中没有元素,会返回null。

示例代码:

LinkedListlink = new LinkedList();

while(!link.isEmpty())

{

sop(link.removeLast());

}

Arraylist小练习

需求:将自定义对象作为元素存到ArrayList集合中,并去除重复元素。比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。
List集合判断元素是否相同,依据是元素的equals方法。




运行结果为:


LinkedList小练习:

需求:用集合模拟堆栈和队列。堆栈特点:先进后出  如同一个杯子。队列特点:先进先出 First in First out  FIFO 如同一个水管。



运行结果为 :


2、Set接口

Set接口含有两个子类: HashSet()和TreeSet();

2.1 HashSet()

底层数据结构是哈希表。

Set集合的功能和Collection是一致的,无自己的特有方法。

2.1.1  HashSet是如何保证元素唯一性的呢?

             HashSet()功能是通过元素的两个方法,hashCode和equals完成的。

             如果元素的HashCode值相同,才会判断equals是否为true。

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

       注意:

1、HashSet判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法,先判断hashcode,若哈希值不相同则不调用equals;若哈希值相同则调用equals。

2、ArrayList判断元素是否存在,以及删除等操作,只依赖方法equals。(数据结构不同依赖的方法就不相同)

HashSet小练习

需求:往hashSet集合中存入自定对象,姓名和年龄相同为同一个人,重复元素。



运行结果为 :

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流-----

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值