Java初学之集合(一)
概述
为什么会出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。数组和集合类同是容器,有何不同?
数组虽然可以存储对象,但是长度是固定的;集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。集合类的特点
集合只用于存储对象,集合的长度是可变的,集合可以存储不同类型的对象。
体系
- 因为容器中数据结构不同,容器有很多种,不断的共性功能抽取,形成了集合体系,集合框架顶层就称为Collection接口。
- Collection接口中定义了集合的基本功能
Collection接口中的共性方法
- 添加
- boolean add(Object obj):一次添加一个
- boolean addAll(Collection c):将指定容器中所有元素添加
- 删除
- void clear();
- boolean remove(Object obj);
- boolean remove(Object obj);
- boolean retainAll(Collection c);
- 获取长度
- int size();
- 判断
- boolean isEmpty();
- boolean contains(Object obj);
- boolean containsAll(Collection c);
- 将集合转为数组
- toArray();
- toArray([]);
- 取出元素
- Iterator iterator();
- 获取集合中元素上迭代功能的迭代器对象;
- 迭代:取出元素的一种方式
- 迭代器:具有迭代功能的对象
- 迭代器对象不需要new,可直接通过iterator()获取。
- 迭代器是取出集合中元素的共有方法。
List和Set的区别
- List:有序(存入的顺序和取出的顺序一致),有索引,允许重复元素。
- Set:不允许重复元素。
LIst中的常见方法
- 增
- add(index,element);
- 删
- remove(index);
- 改
- set(index,element);
- 查
- int indexOf(element);
- element get(index);
- 特有的迭代器
- ListIterator可以实现迭代过程中的增删改查
List集合的子类
- Vector:数据结构是数组,数组是可变长度的(不断new新数组并将原数组元素复制到新数组)线程是同步的,增删和查询慢。
- ArrayList:数据结构是数组,长度可变,线程不同步,替代了Vector,增删速度不快,查询快。
- LinkedList:链表结构,线程不同步,增删速度快,查询慢。
Set集合的子类
- HashSet:哈希(散列)表结构,不同步
- 不允许存储重复元素,因为会发生查找的不确定性,不保证存入和取出的顺序一致。比数组的查询效率 高。
- 当哈希算法得到两个元素值相同时,称为哈希冲突。冲突后,需要对元素进一步判断,判断元素内容,equals方法。
- 哈希算法在判断元素是否相同是,依据hashCode方法。如果哈希重复(哈希值相同),再用equals方法判断元素。如果equals方法返回true,不存;返回false,存储。
- 如何保证元素的唯一性?
- 元素必须覆盖hashCode方法和equals方法。覆盖hashCode方法是为了根据元素自身的特点确定哈希值。
- 覆盖equals方法是为了解决哈希冲突。
- TreeSet:二叉树数据结构,可以对元素进行排序,不同步
- 如何保证元素的唯一性?
- 参考的就是比较方法的返回值:如果返回值是0,就是重复元素,否则不是。
- 排序方式:需要元素具备比较功能,所以元素需要实现Comparable接口,覆盖CompareTo方法。
- 需求中也有这样一种情况,元素具备的比较方法不是所需要的,也就是说不想按照自然排序的方法,而是按照自定义的排序方法,对元素进行排序。而且存储到TreeSet中的元素万一没有比较方法,该如何排序呢?这是就只能使用第二种比较方式:让集合具备比较功能。实现Comparator接口,覆盖Compare方法,将Comparator接口的对象作为参数传递到TreeSet集合构造函数。比较器更为灵活。
- 如何保证元素的唯一性?
集合名称阅读技巧:前缀是数据结构名。后缀是所属体系名
- ArrayList:数组结构,查询快,可以有重复元素。
- LinkedList:链式结构,增删快。
- HashSet:查询速度快,不保证有序,不允许重复,需要覆盖hashCode方法和equals方法
- TreeSet:二叉树,可以排序,就要想到两种比较方式:一种是自然排序Comparable,一种是比较器Comparator
- LinkedHashSet:链表+哈希表,可以实现有序