首页 > 编程语言 > 详细

Java基础—集合

时间:2016-03-18 00:04:20      阅读:279      评论:0      收藏:0      [点我收藏+]

第一讲    集合入门

1. 集合的由来

① 集合出现以前的数组长度是固定的,当长度超过了数组的长度,就需要对数组进行重新定义,而集合能存储任意长度,且长度可以改变

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

而在此之前的数组只支持存储基本数据类型

2. 集合与数组的区别

区别1:数组的长度是固定的,而集合长度能随着元素的增加而增长

区别2:数组中可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值

集合只能存储对象。这意外着集合在存储基本数据类型时,但是在存储的时候会自动装箱变成对象

3. 数组和集合什么时候用

1 如果元素个数是固定的推荐用数组

2如果元素个数不是固定的推荐用集合

4. 集合继承体系图

技术分享

可以看到集合框架由四个接口组成,下面分别讲解

 

2. collection接口

 

       Collection是集合框架中的常用接口。其下有两个子接口:List(列表),Set(集)。

       所属关系:

            Collection

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

                     |--Set//元素是无序的,元素不可以重复。无索引

注意:集合中实际上存储的对象的地址引用,所以基本数据类型在集合中会先被封装成对象,这叫做自动装箱

1. Collection接口中的常见操作

1. 添加元素

① boolean add(Object obj)   添加元素

添加一个元素,返回值为添加是否成功,因为List中允许存储重复值,所以永远返回true,在set中如果要添加的数在set中已经存在,则返回false

2. 删除元素

① boolean remove(Object obj)    删除指定的元素,如果为List接口,且有重复值,则移除第一个满足的值

② boolean clear();         清空集合

3. 判断元素

boolean contains(Object obj);    判断是否存在obj这个元素

isEmpty()                               判断集合是否为空

4. 获取个数,长度

 size()

5. 带All的方法

① boolean addAll(Collection c)   把集合c中的所有元素添加到调用者集合中

注意:与add(Collection c)不同,add方法将c当作一个元素加到调用者集合中

② boolean removeAll(Collection c)   调用者集合中删除交集集合

③ boolean containsAll(Collection c)  判断调用集合是否包含传入的集合

④ boolean retainAll(Collection c)    调用者集合只保留两集合的共性元素,如果调用集合未改变返回false,调用集合改变就返回true

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

2. Collection集合的遍历

① 转数组遍历,利用Collection.toArray()方法,返回值为object[]

Collection coll = new ArrayList();
coll.add(new Student("张三",23)); //Object obj = new Student("张三",23);
coll.add(new Student("李四",24));
coll.add(new Student("王五",25));
coll.add(new Student("赵六",26));

Object[] arr = coll.toArray(); //将集合转换成数组
for (int i = 0; i < arr.length; i++) {
Student s = (Student)arr[i]; //强转成Student
System.out.println(s.getName() + "," + s.getAge());
}

解析:上例中coll中存储的是虽然是student对象,但是在调用toArray()方法时返回的是object数组,所以对单个来说相当于

ayy[1] a = new Student("张三",23)也就是虽然存储的是student对象,但是已经被提升为object对象,父类对象不能使用子类特有的方法

因此要向下转型Student s = (Student)arr[i]; //强转成Student

② 迭代遍历(重要!!)

1. 概述

迭代是取出集合中元素的另一种方式。

我们知道Collection接口下Set和List的数据结构不同,所以取出的动作细节也不一样。但是都具有共性内容: 判断和取出。那么就可以将这些共性抽取。

这些规则的共性可以封装成Iterator。

每个Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。Collection.iterator得到迭代器

2. iterator迭代器的常用方法

①  boolean hasNext()   判断是否有下一个元素,如果有返回真

② Object next()           取出下一个元素

③ remove()                 从迭代器指向的 collection 中移除迭代器返回的最后一个元素,执行完一次next()调用,且只能调用一次 

3. 使用实例

  Iteratoriter = a.iterator();

  while(iter.hasNext()){

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

   }

4. 注意事项

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

② 迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException,所以要进行hasNext()判断

③ 迭代器在Collcection接口中是通用的,具体在各collection接口中由具体实现的iterator()

5. 原理分析

A:迭代器原理
* 迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可
* B:迭代器源码解析
* 1,在eclipse中ctrl + shift + t找到ArrayList类
* 2,ctrl+o查找iterator()方法
* 3,查看返回值类型是new Itr(),说明Itr这个类实现Iterator接口
* 4,查找Itr这个内部类,发现重写了Iterator中的所有抽象方法

 

 

第三讲 List接口

1. 组成

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

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

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

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

2. List特有的方法

①增      

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

boolean addAll(index,Collection);   //在指定位置增加给定集合中的所有元素,若省略位置参数,则在当前集合的后面依次添加元素,集合变化则返回true

②删

E remove(int index);   //删除指定位置的元素,返回被删除的元素

boolean remove(Object obj) // 删除集合中第一个出现的出现的指定元素(如果存在),如果列表包含指定的元素,则返回 true

③改

set(int index,element)    //修改指定位置的元素

④查

E get(int index);           //通过角标获取元素

List<E> subList(int from,int to); //获取部分对象元素

⑤其他

listIterator();    //List特有的迭代器

      indexOf(obj);   //获取元素第一次出现的位置,如果没有则返回-1

注意①: List的角标从0开始计算!!!!

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

 

 

 

 

 

 

 

 

Java基础—集合

原文:http://www.cnblogs.com/chenjinsen/p/5289914.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!