迭代器,集合获取到迭代器之后,可以使用迭代器去遍历集合
List
存储元素的特点:有序可重复.有序,存进去是什么顺序,取出来时候还是这个顺序
ArrayList底层使用的是数组存储元素的,所以ArrayList适合查询,不适合频繁的增删元素
LinekList底层使用双向链表这种数据结构存储数据的,链表适合频繁的增删元素,不适合查询操作
Vector集合底层和ArrayList相同,但是Vector是线程安全的,效率较低
Set
存储元素的特点:无序不重复.存进去的时候是这样一个顺序,取出来的时候就不一定是这个顺序取出了
哈希表/散列表
Sorted 继承 Set
存储元素的特点:无序不重复的。但是存储进去的元素可以按照元素的大小自动排序
Collection 常用方法
boolean add(Object element) 向集合中请添加元素
void clear() 清空集合
boolean isEmpty() 判断集合是否为空
int size() 获取集合中元素个数
Interator iterator() 获取集合所依赖的迭代器对象
通过迭代器中方法完成集合的迭代(遍历)
注意:这种方式是所有集合通用的遍历方式
迭代器面向接口编程
不需要关心底层集合的具体类型,所有集合依赖的迭代器都实现了java.util.Iterator接口
hasNext 判断是否还有更多的元素
next 将迭代器向下移动一位,并取出指向的元素
boolean contains(Object o) 集合中是否包含某个元素
底层调用的是equals方法,如果equals返回true,就是包含
boolean remove(Object o) 删除集合中某个元素
存储在集合中的元素应该去重写equals方法
boolean remove(Object o)
remove和contains都需要集合中的元素重写equals方法,因为Object中的equals方法
比较内存地址,在现实的业务逻辑当中不能比较内存地址,该比较内容
深入remove方法
1.迭代器的remove方法
2.集合自身带的remove方法
推荐使用迭代器本身自带的方法删除元素
List集合存储元素特点:
1.有序(List元素存储有下标):存进去是这样的顺序,取出来还是按照这个顺序取出
2.可重复
深入List集合
ArrayList集合底层是数组,数组下标是有序的
所以在ArrayList集合有很多自己的特性
ArrayList集合底层默认初始化容量是10,扩大之后的容量是原容量的1.5倍
Vector集合底层默认初始化容量是10,扩大之后的容量是原容量的2倍
如何优化ArrayList和Vector
尽量减少扩容操作,因为扩容需要数组拷贝,数组拷贝很耗内存
一般推荐在创建集合的时候指定初始化容量
Set集合:HashSet
HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构
哈希表又叫散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表
每个单向链表都有独一无二的hash值,代表数组的下标.在某个单向链表的每一个节点
上的hash值是相等的.hash值实际上是key调用hashCode方法,再通过“hash function”转换成的值
如何向哈希表中添加元素:
先调用被存储的key的hashCode方法,经过某个算法得出hash值,如果在这个哈希表中
不存在这个hash值,则直接添加元素.如果该hash值已经存在,继续调用key之间的equals
方法,如果equals返回false,则将该元素添加。如果equals方法返回true,则放弃添加该元素
- HashSet其实是HashMap中的key部分。HashSet有什么特点,HashMap中的key应该具有相同的特点
5.HashMap和HashSet初始化容量都是16,默认加载因子是0.75
关于往Set集合中存储的元素,该元素的hashCode方法和equals方法
HashMap中有一个put方法,put(key,value) key是无序的不可重复的
结论:存储在HashSet集合或者HashMap集合key部分的元素,需要同时重写hashCode1+equals
java.util.Set
java.util.SortedSet 无序不重复,但是存进去的元素可以按照元素大小自动排序
java.util.TreeSet
SortedSet存储元素为什么可以自动排序? (equals返回false,才会比较)
因为被存储的元素实现了Comparable接口,
SUN编写TreeSet集合在添加元素的时候,会
调用compareTo方法完成比较
让SortedSet集合做到排序还有另一种方式java..util.Comparator
单独编写一个比较器
map集合中的常用方法
void clear() 清空map
boolean containsKey(Object key) 判断集合中是否包含这样的key
boolean containsValue(Object value) 判断集合中是否包含这样的value
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的 Set 视图。
V get(Object key) 通过key获取value
boolean isEmpty() 判断该集合是否为空
Set
V put(K key, V value) 向集合中添加键值对
V remove(Object key) 通过key删除元素
int size() 获取map中键值对的个数
Collection
Set keySet() 获取所有的key
set entrySet() Map转换成Set
注意:存储在Map集合key部分的元素需要同时重写hashCode+equals
HashMap和HashSet初始化容量都是16,默认加载因子是0.75
Map中如果key重复了,value采用的是“覆盖”
HashMap和HashSet初始化容量都是16,默认加载因子是0.75
Hashtable默认初始化容量是11,默认加载因子是0.75
java.util.Properties 也是由key和value组成,但是key和value都是字符串类型
SortedMap中的key特点:无需不可重复,但是存进去的元素可以按照大小自动排序
如果想自动排序:key部分的元素需要,1.实现comparable接口 2.单独写一个比较器
关于集合工具类 java.util.Collections
java.util.Collecition 集合接口
Collections工具类可以对List集合中的元素排序,但是集合中的元素必须是“可比较的”,实现comparable接口
关于JDK5.0新特性的新特性:泛型(编译期概念)
1.为什么引入泛型?
1.可以统一集合中的数据类型
2.可以减少强制类型转换
2.泛型语法如何实现?
泛型是一个编译阶段的语法
在编译阶段统一集合中的类型
3.泛型的有点和缺点?
优点:同一类型,减少强制转换
缺点:类型太统一了
自定义泛型
JDK5.0新特性:
关于增强for循环
语法:
for(类型 变量:数组名/集合名){}
集合要想使用增强for循环这种语法,集合需要使用泛型
如果集合不使用泛型,该集合在使用增强for循环的时候应该使用Object类型定义
关于增强for的缺点:没有下标