Java初学之集合(一)
2016-01-30 19:15
288 查看
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:链表+哈希表,可以实现有序
相关文章推荐
- Java学习之道:jdk环境变量配置方法
- JAVA中的继承
- eclipse-rcp之简述
- Struts2学习之Struts2简介
- java Format
- java/c# 常用快捷键对比
- eclipse、MyEclipse实现批量改动文件编码
- Java 线程封装对象
- java.lang.OutOfMemoryError: Java heap space 解决方法
- (转)Java_API全集
- 全方位讲解Java的面向对象编程思想
- 在eclipse.ini中为eclipse指定jdk启动
- java-迭代删除
- NIO--JAVA NIO之浅谈内存映射文件原理与DirectMemory
- java内存模型及GC原理
- Spring3系列6-Spring 表达式语言(Spring EL)
- Java设计模式(十)----桥接模式
- JAVA系列教程
- JavaSE入门学习19:Java面向对象之抽象类
- Java拼图游戏