欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Collection FrameWork overview

程序员文章站 2022-06-13 20:21:10
...

Collection FrameWork overview

  • 为什么要使用集合?

    存放多个数据的时候需要数组,但是数组的长度不可变;
    并且数组无法保存具有映射关系的数据,比如成绩表:语文–100,数学–100,这种数据看上去很像两个数组,但是这些数据之间具有一定的关联性。所以引入了集合的概念

  • 什么是集合?

    Java中提供了叫做Java Collection FrameWork的框架,为特定的对象类型 提供了容器,要注意这里的装入容器的只能是对象,对于基本类型的数据(int , long , float , double ),转入容器的时候需要包装成对象类型后(Integer , Long , Float , Double)才能放到容器中(这个过程称之为拆包装 , 解包装)
    在集合中保存的只能是对象(对象的引用变量),Java中的集合类主要由两个根接口派生,Collection和Map,这两个接口又包含了一些子接口或者实现类

简单说集合提供了数据之间的映射关系,可变容量的容器。

以下为集合中的要点:
Collection FrameWork overview

  • 如何取理解集合?(Colection和Map)

(结构图)
Collection FrameWork overview
—查看Java api中的util框架,可以看到两个主要接口:Collection和Set

结构为:

AbstractCollection<E>---AbstractCollection<E>---AbstractList<E>

AbstractList三个常用的实现类:ArrayList,Vector,LinkedList前两个是动态数组,LinkedList是链表,主要方法看关于Collection中详细描述

AbstractCollection<E>---AbstractCollection<E>---AbstractSet<E>

Set的翻译是集合,所以在set中是不允许重复的元素添加的,主要的实现类是:

EnumSet,HashSet,TreeSet

  • Generics(泛型)

提到Java集合,不得不提Java泛型的概念,缺少了泛型的支持,我们在使用Java集合的时候将会多很多工作

  • 为什么要使用泛型?

按照我的理解,Java集合在设计的时候存储的是对象类型,而这个对象可能是各种各样的,所以在存储在集合中的时候会自动把对象类型转化为object(Object是所有对象的父类),这样Java集合代码就能拥有很好的通用性,但会存在两个主要的矛盾:

(1)存储类型的时候没有任何限制,加入向创建一个存cat类的集合,但也能轻易的将dog类的对象存入

(2)输出时丢失对象类型,需要强制类型转化,增加了编程的难度(容易引发ClassCastException异常)

那么如何解决第一个问题呢?

我们可以尝试手动实现编译时检查类型

import java.util.ArrayList;

import java.util.List;

 

//定义一个strList类用组合的方式来实现ArrayList

 class StrList

 {

 //定了一个不加泛型的List集合

    private List strList = new ArrayList();

    //重写strList中的add和get方法

 

  //限制只能添加String类型的元素

    public boolean add(String ele)

   {

            return strList.add(ele);

   }

    //将对象强制转化为String 类型

  public String get(int index)

    {

  return (String) strList.get(index);

    }

 

   //随便写一个方法

  public int size()

    {

  return strList.size();

    }

 }

 

 //定义测试类,说明这个strList类只能添加String类型

 class testStrList

 {

     public static void main(String []args)

     {

         StrList lt = new StrList();

         lt.add("第一个字符串");

         lt.add("第二个字符串");

         //尝试将一个int类型的对象添加到strList中,发现报错:classCastException

         //lt.add(5);

         for(int i=0;i<lt.size();i++)

         {

                 System.out.println(lt.get(i));

         }

     }

 }

这种方法有效的解决了集合中出现的问题(1)(2),但是在对于每种不同类型的对象,都需要定义一种List的子类,再次加大了编程的难度,在JDK5之后,Java引入了一种叫【 参数化类型】Parameterized type的概念,对于以上的String类型的List子类,只需要如下定义:List lt = new ArrayList();

这种【参数化类型】就是泛型。

  • 迭代器(Iterator)

以上已经建立了集合与泛型的概念,那么我们如何便利存储在集合容器中的对象呢?

Java 中又建立了迭代器的概念,查阅Java api中的Iterator接口,方法概述为:

利用这三个方法就可以实现对集合容器中的对象的遍历

如下代码:

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

 

class IteratorTest

{

public static void main(String []args)

{

//建立一个ArrayList对象

List<String> lt = new ArrayList<>();

lt.add("好好学习");

lt.add("天天向上");

 

//获取这个集合的迭代器

Iterator it = lt.iterator();

while(it.hasNext())

{

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

}

}

}
相关标签: Java基础 java