Java集合框架
Java集合框架是一个统一的体系结构,包含三块内容:接口、实现类和算法。
1、接口:上图的上半部分都是接口,包括Collection、List、Set、Map等。
2、实现类:上图的下半部分都是实现类,常见的包括ArrayList、HashMap等。
3、算法:提供了查找、排序等多种算法实现。
Java集合框架中的接口虽然都提供了存储大量、复杂数据的功能,但是它们之间也存在着明显的差别。
1、Collection 接口存储一组允许重复、无序的对象
2、List接口存储一组允许重复、有序的对象,如下图所示:
3、Set接口存储一组不允许重复、无序的对象,如下图所示:
4、Map接口存储一组成对的键值对象,提供key到value的映射。Map中的key可以无序, 但不允许重复,value也可以无序,但允许重复。
List接口及其实现类
List的主要特征是其元素以线性方式存储,集合中允许存放重复对象。List接口的常见实现类有ArrayList和LinkedList。它们可以存储所有类型的对象(包括null),允许重复,保证有序。其中区别在于:
1、ArrayList代表长度可变的数组。允许对元素进行快速的随机访问,但是向ArrayList中插入与删除元素的速度较慢。
2、LinkedList在实现中采用链表数据结构。对顺序访问进行优化,向LinkedList中插入和删除元素的速度较快,随机访问速度则相对较慢。所谓随机访问是指检索位于特定索引位置的元素。
下表列出了List接口定义的一些常用方法。
ArrayList和LinkedList虽然都实现了上述这些方法,但是它们之间还是存在不少区别,在使用的时候需要根据它们各自的优缺点做出选择。
ArrayList
ArrayList采用的是和数组相同的存储方式,即在内存中分配连续的空间来存储数据。它的优点在于遍历集合元素和随机访问元素的效率比较高。
1 存储特性:实现了List接口,隶属于List,具有List的存储特性
2 常用方法:上面提到过的List的常用方法 (因为实现了List接口,所以实现了List所有的方法)
3 性能:查看快,增,删慢
LinkedList
LinkedList采用的是链表存储方式,如下图所示:
它的优点在于向集合中插入、删除元素时效率比较高,特别是可以直接对集合的首部(上图中表头L直接指向的第一个元素)和尾部(首部的Priou直接指向尾部)元素进行插入和删除操作,LinkedList提供了专门针对首尾元素的方法,在List接口之外,LinkedList还具有以下独有方法:
1 存储特性:实现了List接口,隶属于List,具有List的存储特性
2 常用方法:除了上面提到过的List的常用方法 (因为实现了List接口,所以实现了List所有的方法),有自己独有的方法:对头部和尾部进行操作 First() ,Last()
3 性能:增删快,查询慢
泛型
泛型的用法:
创建集合对象的时候最好指定该集合存放的元素类型。
**泛型:**可以理解为广泛的统一的类型,泛型集合要两个要求:
1、定义是指定内部元素的类型,随后往里头放置于元素时,必须是这种类型。
2、从集合中读取出数据是,不需要进行类型转换,直接就是定义时指定的内部元素类型。
语法:
List 集合对象=new ArrayList( );
Map<K,V> 集合对象=new HashMap<K,V>( );
优势:
1、可读性,从字面上就可以判断集合中的内容类型;
2、类型检查,避免插入非法类型;
3、获取数据时不在需要强制类型转换。
Map接口及其实现类
Map接口专门用来存储和处理键值对数据。他可以存储多个数据,每个元素都有两个对象组成,一个称之为键(key),一个称之为值(value),键和值存在对应关系。
其中键不要求有序,但不允许重复,值也不要求有序,但允许重复。
HashMap的使用
1、HashMap的遍历
Map通过key可以获得value;所以只要得到所有的key就可以遍历Map集合。
Map接口的keySet()的方法可以得到该Map对象的所有的key组成的Set集合,然后迭代这个包含key的set集合即可。
Set集合的特点:
不能存储相同的元素。
同时因为其是一个抽象的接口:所以不能直接实例化一个set对象。(Set s = new Set() )错误
该接口主要继承于Collections接口,所以具有Collection的一些常见的方法。
常见的方法:
add( ) 向集合中添加元素
clear( ) 去掉集合中所有的元素
contains( ) 判断集合中是否包含某一个元素
isEmpty( ) 判断集合是否为空
iterator( ) 主要用于递归集合,返回一个Iterator()对象
remove( ) 从集合中去掉特定的对象
size( ) 返回集合的大小
Set接口最长用的两大实现:HashSet TreeSet
Java中Iterator用法整理
迭代器(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中插入和删除元素。
Iterator的接口定义:
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
使用:
Object next():返回迭代器刚越过的元素的引用,返回值是Object,需
要强制转换成自己需要的类型
boolean hasNext():判断容器内是否还有可供访问的元素
void remove():删除迭代器刚越过的元素
迭代使用方法:
迭代其实可以简单地理解为遍历,是一个标准化遍历各类容器里面
的所有对象的方法类
for(Iterator it = c.iterator(); it.hasNext(); ) {
Object o = it.next();
//do something
}
遍历集合的语法:
for(Type t:c){……}
c表示需要遍历的集合
Type表示集合内的元素类型
t引用每次从集合中取出的当前元素。