本BLOG上原创文章未经本人许可,不得用于商业用途。转载请注明出处,否则保留追究法律责任的权利。
变量和数组以及集合的比较
- 当需要在程序中记录单个数据内容时,声明一个变量即可
- 当需要在程序中记录多个类型相同的数据内容时,声明一个一维数组即可
- 当需要在程序中记录多个类型不同的数据内容时,构造一个对象即可
- 当需要在程序中记录多个类型相同的对象时,声明一个对象数组即可
- 当需要在程序中记录多个类型不同的对象时,声明一个集合即可
集合(容器)框架
在Java中集合框架的顶层是:java.util.Collection集合 和 java.util.Map集合
其中Collection集合中操作元素的基本单位是:单个元素
其中Map集合中操作元素的基本单位是:单对元素
在开发中很少直接使用Collection集合,而是使用该集合的子集合:List集合、Queue集合、Set集合等。
Collection集合
-
基本概念
java.util.Collection集合是集合框架的根接口,其它接口是该接口的子接口。
-
常用方法
boolean add(Object o) – 向集合中添加对象
boolean contains(Object o) – 判断是否包含有指定对象
boolean remove(Object o) – 从集合中删除对象
void clear() – 清空集合
int size() – 返回包含对象的个数
boolean isEmpty() – 判断是否为空
List集合
-
基本概念
java.util.List集合是Collection集合的子集合,该集合中元素有先后次序且允许重复
该集合的只要实现类有:ArrayList类、LinkedList类、Stack类、Vector类等
其中ArrayList类的底层是采用动态数组进行数据管理,访问方便,增删不方便。
其中LinkedList类的底层是采用双向链表进行数据管理,增删方便,访问不方便。
其中Stack类的底层是采用数组进行数据管理,主要用于描述具有后进先出特征的数据结构,叫做栈。
其中Vector类的的底层是采用数组进行数据管理,与ArrayList类相比属于线程安全的类,因此效率比较低,在开发中推荐使用ArrayList类取代之。
-
常用的方法
viod add(int index, E element) – 向集合中指定位置添加元素
boolan addAll(int index, Collection<? extends E> c) – 向集合中添加所有元素
E get(int index) – 从集合中获取指定位置元素
E set(int index, E element) – 修改指定位置的元素
E remove(int index) – 删除指定位置的元素
泛型机制
-
基本概念
通常情况下集合中可以存放不同类型的对象,本质上是将这些对象全部看做Object类型放入的,因此从集合中取出来元素时也是Object类型,为了表达元素最真实的数据类型就需要强制转换,而强制转换可能发生类型转换异常。
为了避免上述错误的发生,从JDK1.5开始提出泛型机制,也就是在集合名称的右侧使用 <数据类型> 的方式明确要求该集合可以存放的元素类型,若放入其它类型则编译报错。如:
List list = new LinkedList(); //可以放入任何类型对象,取出麻烦 List<String> list = new LinkedList<String>(); //只能放入String类型,取出方便
-
原理分析
泛型的本质就是参数化类型,也就是让数据类型作为参数传递,集合定义中的E相当于形式参数负责占位,而使用集合时<>中的数据类型相当于实际参数负责给形式参数初始化,当初始化完毕后所有E被替换为实际参数表示的类型进行使用。如:
public interface List<E> { //E表示形参 ... } List<String> list1 = ...; //String为实参
Queue集合
-
基本概念
java.util.Queue集合是Collection集合的子集合,与List集合是平级关系。
该集合的主要实现类是:LinkedList类,因为该类在增删方面有一定优势。
该集合用于描述具有先进先出特征的数据结构,叫做队列。
Set集合
-
基本概念
java.util.Set集合是Collection集合的子集合,与List集合以及Queue集合平级关系
该集合与List集合的主要区别在于:元素没有先后次序并且不允许重复的元素
该集合的主要实现类有:HashSet类 和 TreeSet 类
其中HashSet的底层采用哈希表进行数据管理
其中TreeSet的底层采用二叉树进行数据管理
-
常用的方法
参考Collection集合的方法即可
迭代器
-
基本概念
所有Collection的实现类都实现了其iterator方法,该方法返回一个Iterator接口类型的对象,用于实现对集合元素的迭代遍历。
-
Iterator接口的主要方法:
boolean hasNext() – 判断集合中是否有可迭代/访问的元素
E next() – 用于取出一个元素并指向下一个元素
void remove() – 用于删除访问到的最后一个元素
-
注意:
当使用迭代器迭代集合中的所有元素时,若使用集合中的remove方法来删除元素,则会出现ConcurrentModificationException并发修改异常,在开发中应该使用迭代器的remove方法来删除元素。
增强版for循环(for each结构)
-
语法格式:
for(元素类型 变量名:数组名/集合名) { 循环体; }
-
执行流程
不断地从数组或集合中取出一个元素并赋值给变量并执行循环体,直到所有的元素处理完毕为止。
Map集合
-
基本概念
java.util.Map<K,V>集合中操作元素的基本单位是:单对元素,其中类型参数如下:
K - 此映射所维护的键(key)的类型
V - 映射值(value)的
该集合中不允许出现重复的键,每个键最多只能映射到一个值。
该集合的主要实现类有:HashMap 和 TreeMap类
其中HashMap 的底层采用哈希表进行数据管理
其中TreeMap的底层采用二叉树进行数据管理
-
常用的方法
V put(K key, V value) – 将Key-Value对存入Map,若集合中已经包含该Key,则替换该Key所对应的 Value,返回值为原来多对应的Value,若没有则返回null
V get(Object key) – 返回与参数Key所对应的value对象,如果不存在则返回null
集合的遍历方式总结
遍历Set集合的方式有三种:toString()、for each结构、迭代器
遍历List集合的方式有四种:除了上述3种方式外,还有get方法
遍历Map集合的方式有三种:toString()、entrySet()、keySet()