Java集合框架及泛型
Java集合框架提供了一套性能优良、使用方便的接口和类,位于java.util包中。
Collection是所有Java集合框架的父接口;Collections操作集合的工具类
Iterator
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单向移动:
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素
Collection接口存储一组不唯一(可以重复),无序的对象
List接口存储一组不唯一,有序(插入顺序)的对象
Set接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key到value的映射(KV值)
键Key都是唯一的,而且是无序的,而值Value不一定是唯一的
List接口:
List接口的实现类: ArrayList,LinkedList。
ArrayList
ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高。
ArrayList常用方法:
方法名 |
说明
|
boolean add(Object 0) |
在列表的末尾顺序添加元素,其实索引位置从0开始
|
void add(int index,object o) |
在指定的索引位置添加元素,索引位置必须介于0和列表中元素合数之间 |
int size() |
返回列表中的元素个数 |
Object get(int index) |
返回指定索引位置处的元素,取出的元素是object类型,使用前需要进行强制类型转换 |
Boolean contains(object o) |
判断列表中是否存在指定元素 |
Boolean remove(object o) |
从列表中删除元素 |
Object remove(int index) |
从列表中删除指定位置元素,起始索引位置从0开始 |
LinkedList
LinkedList采用链表存储方式。插入、删除元素时效率比较高
声明:LinkedList list = new LinkedList();
List list = new LinkedList();
LinkedList中独特的方法:
方法名 |
说明 |
Void addFirst(object o) |
在列表的首部添加元素 |
Void addLast(object o) |
在列表的末尾添加元素 |
Object getFirst() |
返回列表中的第一个元素 |
Object getLast() |
返回列表中的最后一个元素 |
Object removeFirst() |
删除并返回列表中的第一个元素 |
Object removeLast() |
删除并返回列表中的最后一个元素 |
ArrayList和LinkedList有何异同?
相同点:
ArrayList和LinkedList都是list的两个实现类,可以通过get拿出来
不同点:
ArrayList适用于遍历取值,不适用于插入增加
LinkedList插入删除的时候效率比较高,而且LinkedList还有很多自己的独特方法
Set接口:
Set接口存储一组唯一,无序的对象。
HashSet是Set接口常用的实现类。
Set中存放对象的引用(引用类型可以直接new对象)
Set使用对象的equals()方法比较是否为同一对象(String类重写了equals()方法)
Set接口由于是无序的,所以不存在get()方法
HashSet
HashSet存储的元素是不可重复,并且都是无序的。
Hashset 集合收进一个对象时,会调用对象的hashcode()得到其Hashcode值来决定他的存储位置。所以,即使是equals()比较相等的两个对象,hashcode不同,存放在hashset里的位置不同。
采用foreach循环遍历
Foreach与for循环的区别:
Foreach循环不能修改数组中元素的值。
For循环可以修改数组中的值。
注意:
集合中删除了元素会导致迭代器预期的迭代次数会发生改变,导致迭代器的结果不准确。
解决方法:
1、删除元素后,使用break跳出循环。
2、使用迭代器本身的删除方法。
Map接口
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作。
Map接口常用方法:
方法名 |
说明 |
Object put(Object key,Object val) |
以“键-值”对的方式进行存储 |
Object get(Object key) |
根据键返回相关联的值,如果不存在指定的键,返回null |
Object remove(Object key) |
删除有指定的键映射的“键-值”对 |
Int size() |
返回元素个数 |
Set keySet() |
返回键的集合 |
Conllection values() |
返回值得集合 |
Boolean containsKey(Object key) |
如果存在有指定的键映射的“键-值”对,返回true |
HashMap
允许空键和空值(但空键只有一个,且放在第一位)
元素是无序的,而且顺序会不定时改变
遍历整个 Map 需要的时间与数组的长度成正比(因此初始化时 HashMap 的容量不宜太大)
泛型
定义:使用泛型可以指代任意对象类型。
格式为:类名<类型名>
好处:
除了解决安全隐患即抛出异常问题,泛型的类或接口在取出对象时不需要再进行向下类型转换,因为存储的时候就是该类型 。
什么时候使用泛型?
一般类或接口在api文档中的定义中带有<E>标识的,在使用的时候都需要使用泛型机制。如ArrayList<E>、Iterator<E>。
数组与集合的区别
数组特点:大小固定,只能存储相同数据类型的数据。
集合特点:大小可动态扩展,可以存储各种类型的数据。