集合框架
集合用来存放数据,是一种容器
集合的长度是可变的,而数组的长度是固定的
集合中存储的元素必须是引用类型的
集合不接受基本类型,但是java的自动装箱机制会把基本类型转换为相对的类
Collection接口
collection常用的子接口有 : List接口、Set接口
List接口常用子类有 : ArrayList类、LinkedList类
Set接口常用子类有 : HashSet类、LinkedHashSet类
Collection接口方法
- add() 向集合中添加元素
- clear() 清空集合中的元素
- contains() 查看集合中是否包含元素,包含返回true
- remove() 删除集合中第一个出现的元素,如果没找到返回false,
- size() 返回集合中元素的个数
- toArray() 将集合转换成数组
- iterator() 返回容器的迭代器
Collection遍历
Iterator迭代器
所有集合容器使用迭代器进行遍历的方式一致
迭代器的并发修改异常 java.util.ConcurrentModificationException 迭代器在工作的时候不允许对集合进行修改
方法
-
hasNext() 如果仍有元素可以迭代,返回true
扫描二维码关注公众号,回复: 6192909 查看本文章 -
next() 返回迭代的下一个元素
-
remove() 从迭代器指向的collection容器中移除迭代器返回的最后一个元素
只有next()方法才会使指针后移,hasNext()不会改变指针位置
如果hasNext()返回false代表后面没有元素了,如果这时调用next()会抛出NoSuchElementException异常
原则上iterator只能使用一次,指针不会向前移
foreach
优点 : 方便对容器进行遍历
缺点 : 没有索引,不能更改容器中的元素
List接口
特性
有序、有索引、可以存储重复元素
实现类
数组
ArrayList
查询快,增删慢 空参构造创建一个初始容量10的空列表
Vector 被ArrayList取代 线程安全,运行速度慢
链表
LinkedList 查询慢,增删快 提供了大量的操作首位的方法 getFirst() getLast() 没有元素会抛出异常java.util.NoSuchElementExcption 加判断条件 list.size() != 0 或 !list.isEmpty()
方法
add() 添加
get() 查询
remove() 删除
set() 修改, 返回修改之前的元素
遍历
for
foreach
Set接口
不允许添加重复元素、没有索引、取出元素的方式只有foreach、迭代器
基于map、可以存储null
HashSet
哈希表 存储查找都快 线程不安全
空参构造 初始容量16 加载因子0.75
哈希值
如果没有重写hashCode()方法, 每次返回的哈希值都不同
哈希值是存储到HashSet集合的依据
String类重写了Object父类hashCode()方法
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
哈希表存储
在容器中找到hash值相同的元素,并且equals方法比较两个元素返回true,则判定已经存在元素
在容器中找到hash值相同的元素,并且equals方法比较两个元素返回false,则以桶的方式存储当前元素
在容器中没有找到hash值相同的元素,存储当前元素
存储自定义对象要重写hashCode()方法和equals()方法
//例如
public int hashCode(){
//*55降低hashCode()的重复概率
return name.hashCode() + name * 55;
}
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj == null){
return null;
}
if(obj intanceof Person){
Person p = (Person)obj;
return name.equlas(p.name) && age == p.age;
}
return false;
}
LinkedHashSet
基于LinkedHashSet 基于链表的哈希表实现、继承HashSet
具有顺序,存储和取出的顺序相同、线程不安全
HashSet()和equals()
ArrayList的contains(Obj)方法基于equals()方法实现
HashSet的add()方法基于hashcode()和equals()方法实现
存储自定义对象要重写hashCode()方法和equals()方法
hashCode常规协定:
两个对象哈希值相同,equals不一定返回true
两个对象equals返回true,两个对象哈希值一定相同
Map接口
常用实现类
HashMap
哈希表结构 存取顺序不保证一致 需要重写hashCode() equals()方法 允许存储null
LinkedHashMap
HashMap的子类 哈希表+链表结构 通过链表结构保证存取顺序一致 通过哈希表保证键唯一 需要重写hashCode() equals()方法
Hashtable
哈希表结构 特点同HashMap 线程安全集合,运行速度慢 被取代 不允许存储null
但他的子类 Properties 常用
方法
put(K,V) 存储重复键的时候,会返回被覆盖之前的值 否则返回null
V get(K) 查询,没有键返回null
remove() 移除键值对,返回被删掉的值
size()返回映射关系的个数
遍历
使用keySet() 方法
- keySet() 返回键的Set集合(HashMap$KeySet HashMap内部类 KeySet)
- 遍历Set集合,获取Map中的键
- 调用get()方法,通过键获取值
使用Map.Entry对象
- entrySet() 返回 Set(Map.Entry<K,V>) 返回映射关系Entry的Set集合
- 遍历Set集合,获取映射关系对象Map.Entry<K,V>
- 使用Map.Entry<K,V>对象的getKey() 和 getValue()方法获取键值对
不能直接遍历Map!
Collections工具类
方法
Collections.sort(List) 对List集合进行升序排列
Collections.binarySearch(List, Ele) 二分法查找 数据必须有序排列 找到返回索引index,没找到返回(-插入点-1)
Collections.shuffle(List) 对List 中的元素进行随机排列