【Java高级】2.集合类
集合:Java中集合类是用来存放对象的,Java API提供的集合类位于util包内
集合相当于一个容器,里面包含一组对象-容器类,每个对象作为集合的一个元素出现
与数组比较:数组也是容器,他是定长的,访问较快,但数组不会自动扩充
数组可以包含基本数据类型或引用类型对象,集合中只能包含引用类型的对象
Java集合框架层次:
Collection接口:一组称为元素的对象,一个Collection中可以放不同类型的数据
是Set(无序集合,不允许重复)接口和List(有序集合,允许重复)接口的父类
是否有特定顺序以及允许重复,取决于它的实现
常用方法:add(Object)集合添加元素 addAll(Collection)集合中加入另一个集合对象
size()集合中容纳元素数量 isEmpty()集合是否为空
contains(Object)集合内是否含有参数对象
iterator()产生一个迭代器 toArray()返回一个包含所有元素的对象数组
toArray(Object[])把所有元素放入对象数组中
remove(Object)集合中删除对象 removeAll(Collection)清空指定集合
containsALL(Collection)判断集合内是否包含子集
retainALL(Collection)删除自集合中不包含的元素
clear()清空数组
Set接口:Collection的子接口,用来包含一组无序无重复的对象
无序:元素存入顺序和集合中存储的顺序不同
无重复:两个对象用equals()方法返回false,则两个对象不重复
Set接口的实现类:HashSet:特性为内部对象的散列存取,即哈希技术
TreeSet:存入的顺序与存储的顺序不同,存储是按照排序存储的
List接口:Collection的子接口,用来包含一组有序有重复的对象
List中的元素都对应一个整数型的序号,记载在容器中的位置,可以根据序号存取容器中的元素
List接口的实现类:ArrayList:线性存储,是一种线性表,特性与数组接近,数组大小不变,ArrayList大小可以动态改变
LinkedList:数据结构中链表的java实现,相对于List,它可以通过方法在头部和尾部添加删除取得元素
它可以非常方便的实现数据结构中的Stack(栈)和queue(队列)

Iterator接口:Iterator对象被称为迭代器,可以方便的对容器元素遍历
所有实现了Collection接口的集合类都有一个iterator()方法,返回一个实现了Iterator接口的对象
实现了一个统一的用来遍历Collection中对象的方法,功能上比较简单,只能单向移动
为遍历而设计,能够从集合中取出元素和删除元素,不能添加元素

Collection类:对Collection接口下的集合进行一些常见的、通用的操作


Map接口:存储的是键/值对这样成对的对象组,通过键对象来查询值对象,是不同于Collection的另一种集合接口
key值是唯一不能重复的,key对象与value对象关联在一起,当put相同key,后来的会替换先前的

Map实现类:HashMap:基于哈希表实现,键值对按照Hash算法储存,每个key对象对应唯一的Hash值
可以通过调优初始容量和负载因子,优化空间使用
TreeMap:基于树实现,键值对按照key值排序储存
没有调优选项,因为树总是处于平衡状态
HashMap性能优于TreeMap
HashMap与Hashtable比较:Hashtable基于陈旧的Dictionary类,HashMap是Java1.2引进的Map接口的一个实现
Hashtable是线程安全的、同步的,HashMap是线程不安全的、不同步的
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
集合类的选择:Set存放元素不允许重复,List存放的元素有一定顺序
Map的应用主要利用键值对来快速查询
ArrayList和LinkedList的区别在于随机查询ArrayList好,插入删除LinkedList好
HashSet与TreeSet区别在于集合内元素是否排序
使用集合类时常见异常:ClassCastException从集合中取出元素对象进行类型转换时类型不匹配
UnsupportedOperationException底层没有实现上层相应方法,Collection抛出该异常
ConcurrentModificationException当采用Iterator遍历时,集合中的元素被改变,Iterator抛出异常
IndexOutOfBoundsException集合元素引用索引超出界限
NoSuchElementException LinkedList中getLast、getFrist等方法取元素时List为空
集合使用上的问题:集合add()方法接受的是一个Object对象的参数,获取集合中的对象时,必须进行造型(强制类型转换)操作
造型操作可能出现问题,一般在程序运行时发生,发现问题比较困难
泛型出现:对象放入集合前,为其做限制,获取集合对象时,不用进行造型的操作
不同类型的对象添加到集合中的时候,编译时就会报错
泛型:参数化类型,它能向方法一样接受不同类型的参数,如ArrayList<E> 变量名 (E是变量类型)

浙公网安备 33010602011771号