Java中数组与集合的比较
- 数组也是容器,它是定长的,访问较快,但是数组不会自动扩充
- 数组可以包含基本数据类型或引用类型的对象,而集合中只能包含引用类型的对象
java中集合框架层次结构
Collection接口
- 一组称为元素的对象
- 是Set接口和List接口的父类
Set 集合 —— 无序的集合:不允许重复
List集合—— 有序的集合:允许重复
常用方法:
boolean add(Object)
|
集合中加入一个对象,成功时返回
true
|
boolean addAll(Collection)
|
集合中加入另外一个集合对象
|
int size()
|
集合内容纳的元素数量
|
boolean isEmpty()
|
集合是否为空
|
boolean contains(Object)
|
集合内是否含有参数对象
|
Iterator iterator()
|
产生一个迭代器
|
Object[] toArray()
|
返回一个包含所有元素的对象数组
|
boolean remove(Object)
|
从集合中删除对象
|
boolean removeAll(Collection)
|
清空指定集合
|
boolean containsAll(Collection)
|
判断集合内是否包含子集
|
boolean retainAll(Collection)
|
仅保留此
collection
中那些也包含在指
定
collection
的元素
|
void clear()
|
清空集合
|
Set接口
用来包含一组无序无重复的对象。Set没有修改元素的方法,可以存放null值,但是只能存放一个。
Set接口的实现类
- HashSet —— 特性:内部对象是散列存取的,采用了哈希技术
- TreeSet —— 特性: 存入顺序和存储顺序不同,但是存储是按照排序存储的
Set集合是无序的,没有索引,用一般的for 循环 或者 while循环时无法偏历的,可以采用加强 for 循环(foreach) 方法偏历Set集合。
List接口
用来包含一组有序有重复的对象。
LIst中的元素都对应一个整数型的序号,记载其在容器中的位置,可以根据序号存取容器中的元素。
List 两个主要的集合实现类:
ArrayList:线性顺序存储,是一种线性表。大小可动态改变,初始容量为10,元素过多会自动扩容,存放的元素是有索引且连续的,索引从 0 开始,可以重复,有顺序
LinkedList:内存结构是链表结构,是一种链表集合,存放的元素是不连续的,元素在堆区中式随意摆放的,可以存放null值,可以重复存放多个相同元素,不担心冲突。
LinkedList最主要的功能是可以在List的头部和尾部添加、删除、取得元素,直接提供了这些方法的实现。
void add(int index,Object element)
|
在列表中的
index
位置,添加
element
元
素
|
Object get(int index)
|
返回列表中指定位置的元素
|
int indexOf(Object o)
|
在
list
中查询元素的索引值,如不存在,
返回-
1
。
|
int lastIndexOf(Object o)
|
List
中如果存在多个重复元素,
indexOf()
方法返回第一个匹配元素的
index
。
lastIndexOf(o)
是返回最后一个
匹配元素的
index.
|
ListIterator listIterator()
|
返回列表中元素的列表迭代器
|
Object remove(int index)
|
移除列表中指定位置的元素
|
Object set(int index,Object element)
|
用指定元素替换列表中指定位置的元素
|
void addFirst(Object o)
|
将给定元素插入此列表的开头
|
void addLast(Object o)
|
将给定元素追加到此列表的结尾
|
Object getFirst()
|
返回此列表的第一个元素
|
Object getLast()
|
返回此列表的最后一个元素
|
Object removeFirst()
|
移除并返回此列表的第一个元素
|
Object removeLast()
|
移除并返回此列表的最后一个元素
|
ArrayList与LinkedList的比较
存储结构
- ArrayList是线性顺序存储
- LinkedList对象间彼此串连起来的一个链表
操作性能
- ArrayList适合随机查询的场合
- LinkedList元素的插入和删除操作性高
Iterator接口(迭代器)
- Iterator对象称作迭代器,用来方便的实现对容器内的元素进行遍历操作
- 所有实现了Collection接口的集合类都有一个iterator( )方法,返回一个实现了Iterator接口的对象
- Iterator对象实现了统一的一个用来遍历Collection中对象的方法
- Iterator是为遍历而设计,能够从集合中取出元素和删除元素,但是没有添加元素的功能
方法
- Object next() :返回游标右边的元素并将游标移动到下一个位置
- boolean hasNext():判断游标右边是否有元素
- void remove() :删除游标左边的元素,在执行完next之后,该操作只能执行一次
实现过程:
Collections类
Collections类是类似于Arrays类的公用工具类 ,它提供了一些static方法供集合类使用或操作集合类 。
用来写一些比较器,例如,排名等等。
方法:
Map接口
- Map内存储的是键/值对这样以成对的对象组(可以把一组对象当成一个元素),通过“键”对象来快速查询“值”对象
- Map是不同于Collection的另外一种集合接口
- Map中,key值是唯一的(不能重复),而key对象是与value对象关联在一起的
两个实现:
- HashMap — key/value对是按照Hash算法存储的
- TreeMap — key/value对是排序(按key排序)存储的
常用方法
HashMap与TreeMap的比较
- HashMap基于哈希表实现。
- TreeMap基于树实现。
- HashMap性能优于TreeMap。
HashMap与Hashtable的比较
- Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
- HashMap允许将null作为一个entry的key或者value,而Hashtable不允许用null。
集合类的选择
- Set内存放的元素不允许重复,List存放的元素有一定的顺序。
- Map的应用主要在利用键/值对进行快速查询。
- ArrayList和LinkedList的区别在于随机查询性能上ArrayList要好,但
- LinkedList的中间元素的插入与删除性能好 。
- HashSet和TreeSet的区别在于集合内元素是否排序 。
集合中常见的异常
泛型的使用<E>
泛型经常被称为
参数化类型
,它能够像方法一样接受不同类型的参数。
ArrayList<E> 变量名 ;//E是变量类型
- 在对象放入集合前,为其作个限制
- 在获取集合中的对象时,不用进行造型的操作
- 当有不同类型的对象添加到集合中的时候,编译时就能检查出错误