本帖最后由 viliv715 于 2014-9-2 20:29 编辑
集合框架和泛型 一、集合框架 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。 数组和集合同是容器,有何不同? 数组虽然也可以存储对象,但是长度是固定的,而集合的长度是可变的。数组中可以存储基本数据类型,但集合只能存储对象。 集合类的特点: 集合只能用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。 集合类关系图:重点掌握部分黑框表示。
为什么容器有这么多的划分? 因为每一个容器中对数据存储的方式不同,也就是说数据结构不同。 1、collection单列集合 Collection(参照CollectionDemo.java) |---List(参照ListDemo.java):元素是有序的,元素可以重复,因为该集合体系有索引。 |---ArrayList(参照CollectionDemo.java或ListDemo.java):底层使用数组结构,查询速度快,增删速度较慢。线程不同步。 |---LinkedList(参照LinkedListDemo.java):使用链表结构,增删速度快,查询较慢,线程不同步。 |---Vector(参照VectorDemo.java):底层使用的是数组结构,线程同步,被ArrayList取代。 |---Set:元素是无序(存入和取出的顺序不一定一致)的,元素不可以重复。 |---HashSet(参照HashSetDemo.java)底层数据结构式哈希表。 | |--元素唯一性的原因:通过hashCode和equals方法判断,如果hashCode值不同不调 | 用equals,hashCode值相同,调用equals方法。对于判断元素是否存在,以及删 | 除操作,也是依赖于hashCode和equals方法。线程不同步。 |---TreeSet(参照TreeSetDemo.java)底层数据结构式二叉树。可以对集合中的元素进行排序。线 程不同步。 |--元素唯一性原因:用compareTo方法比较。 |--TreeSet排序方式1:让元素自身具备比较性,元素需要实现Comparable接口并要 覆盖compareTo方法。 |--TreeSet排序方式2:当元素自身不具备比较性或者比较性不是所需要的,这时候需 要让集合容器自身具有比较性。定义一个类实现comparator接口并覆盖 compare方法。两种比较方法都存在以该比较器为主。 2、Map:双列集合,该集合存储的是键值对,一对对的存储,且必须保证键的唯一性。 Map: |---HashTable:底层是哈希表结构,不允许使用NULL的键和值,该集合是同步的。 |---HashMap:底层是哈希表结构,允许使用NULL的键和值,该集合是不同步的。 |---TreeMap:底层是二叉树结构,线程不同步。可以用于给Map集合中的键进行排序。 二、泛型 JDK1.5之后,为了解决安全问题出现的新特性。 泛型优点: 将运行时期出现的问题转移到了编译时期,方便解决。 避免了类型的强制转换 泛型格式: 通过<>来定义要操作的类型,泛型定义在方法上时,写在返回值类型的前面,修饰符的后面。 泛型使用范围: 通常用在集合框架中,只要出现<>就要定义泛型。 泛型类和泛型方法:参考GenericMethodDemo.java 泛型接口:参考GenericInterDemo.java 泛型限定:参考GenericLimitDemo.java 代码实例: CollectionDemo.java
- package day14;
- //collection常用方法
- import java.util.*;
- public class CollectionDemo {
- public static void main(String[] args) {
-
- // baseMethod();
- // advMethod();
- // getMethod();
- }
- //基本方法
- public static void baseMethod()
- {
- // 创建一个集合容器,使用collection接口的子类ArrayList
- ArrayList al = new ArrayList();
- //添加元素
- //add方法的参数类型是object,便于接收任意类型对象;集合中存储的都是对象的引用(地址)
- al.add("java1");
- al.add("java2");
- al.add("java3");
- al.add("java4");
- //获取集合长度
- sop("size:" + al.size());
- //打印
- sop(al);
- //删除元素
- al.remove("java2");
- //清空集合
- al.clear();
- //判断元素
- sop("判断java1是否存在:"+al.contains("java1"));
- sop("判断集合是否为空:"+al.isEmpty());
- }
- //其他方法
- public static void advMethod()
- {
- ArrayList al1 = new ArrayList();
- al1.add("java1");
- al1.add("java2");
- al1.add("java3");
- al1.add("java4");
-
- ArrayList al2 = new ArrayList();
- al2.add("java1");
- al2.add("java3");
- al2.add("java5");
- al2.add("java6");
- //取交集:al1与al2的交集存放到al1中
- al1.retainAll(al2);
- sop("al1"+al1);
- sop("al2"+al2);
-
- }
- //迭代器方法:是集合取出元素的方式
- public static void getMethod()
- {
- ArrayList al = new ArrayList();
- al.add("java1");
- al.add("java2");
- al.add("java3");
- al.add("java4");
- //获取迭代器,用于取出集合中的元素,在迭代时next调用一次就要判断一次hasNext。
- //while方式
- Iterator it = al.iterator();
- while(it.hasNext())//判断是否存在下一个元素
- sop(it.next());//返回下一个元素
- //for方式:it2属于for内部,循环完释放空间。
- for(Iterator it2 = al.iterator();it2.hasNext();)
- sop(it2.next());
-
- }
- public static void sop(Object obj){
- System.out.println(obj);
- }
- }
复制代码
|