目录
1.集合与数组的区别
- 数组的长度是固定的,集合的长度是可变的。
- 数组中存储的是统一类型的元素,可以存储基本数据类型值;集合存储的都是对象,而且对象的类型可以不一致。
2.集合框架介绍
- Collection接口(父类)
- 定义
- 所有单列集合都可以使用共性的方法
- 没带索引的方法
- 所有单列集合中共性的方法
- 分类
- List接口:有序的集合,允许存储重复的元素,有索引,可以使用普通的for循环
- ArrayList集合:底层是数组实现的,查询快,增删慢。
- LinkedList集合:底层是链表实现的,查询慢,增删快。
- Vector集合
- Set接口:不允许存储重复的元素,没有索引
- HashSet集合:无序,底层是哈希表+(红黑树)实现的,无索引,不可以存储重复的元素、存取无序。
- LinkedHashSet集合:有序,底层是哈希表+链表实现的,无索引,不可以存储重元素,可以保证存取顺序。
- TreeSet集合:底层是二叉树实现的,一般用于排序。
- List接口:有序的集合,允许存储重复的元素,有索引,可以使用普通的for循环
- 常用方法
- 定义
// 添加元素
boolean add(E e);
// 删除集合中的某个元素
boolean remove(E e);
// 清空集合
void clear();
// 判断集合中是否包含某个元素
boolean contains(E e);
// 判断集合是否为空
boolean isEmpty();
// 获取集合长度
int size();
// 将集合转换成一个数组
Object[] toArray();
// 往集合中添加一些元素
Collections.addAll(list,"a","b","c");
//打乱集合顺序
Collections.shuffle(list);
//将集合中的元素安装默认顺序进行排序
Collections.sort(list);
//重写排序规则 this-参数就是升序, 参数-this就是降序
public int compartTo(Presion o){
return this.age()-0.age(); // 升序
}
Map接口(父类)
- 特点
- Map集合是一个双列结合,一个元素包含两个值(一个key,一个value)。
- Map集合中的元素,key和value的数据类型可以是相同的,也可以是不同的。
- Map集合中的元素,key是不允许重复的,value是可以重复的。
- Map集合中的元素,key和value是一一对应的。
- 分类
- HashMap
- LinkedHashMap
- HashTable
- 常用方法
// 将指定的键与指定的值添加到Map集合中
public V put(K key, V value);
返回值:V
存储键值对的时候,key不重复,返回V是null
如果key重复,会使用新的value替换Map中重复的value,返回被替换的值
// 获取指定的键所对应的键值
public V get(K key);
// 把指定的键所对应的键值在Map集合中删除,返回被删除的元素
public V remove(K key);
// 判断集合中是否包含指定的键,包含返回true
boolean containsKey(K key);
3.list集合
- 特点
- 有序的集合,存储元素和取出元素是一致的。
- 有索引,包含一些带索引的方法。
- 允许存储重复的元素。
- 注意:操作索引的时候,一定要防止索引越界。
- 带索引的方法
// 将指定的元素,添加到该集合中的指定位置上 public void add(int index, E e); // 返回集合中指定位置的元素 public E get(int index); // 移除列表中指定位置的元素,返回的是被移除的元素 public E remove(int index); // 用指定元素替换集合中指定位置的元素,返回的是更新前的元素 public E set(int index, E e);
- ArrayList集合
- 底层是数组结构,查找快,增删慢。
- 线程异步的,不安全。
- 增长率是当前数组的50%。
- LinkedArrayList集合
- 特点
- 底层是链表结构,查找慢,增删快。
- 里面包含了大量操作首尾元素的方法。
- 注意:使用LinkedArrayList集合特有的方法不能使用多态。
- 常用方法
- 特点
// 将指定的元素插入此列表的开头
public void addFirst(E e);
// 将指定的元素插入此列表的结尾
public void addList(E e);
// 将元素入栈
public void push(E e);
// 从此列表所表示的堆栈中弹出一个元素
public E pop();
// 返回此列表的第一个元素
public E getFirst();
// 返回此列表的最后一个元素
public E getLast()l
// 移除并返回此列表的第一个元素
public E removeFirst();
// 移除并返回此列表的最后一个元素
public E removeLast();
- vector数组
- 特点
- 底层也是一个数组。
- 线程同步的,某一个时刻只有一个线程能写Vector,所以是线程安全的。
- 访问速度比ArrayList快。
- 增长率是当前数组的100%。
- 特点
4.Set集合
- 特点
- 不允许重复的元素。
- 没有索引,没有带索引的方法,也不能使用普通的for循环遍历。
- HashSet
- 特点
- 是一个无序的集合,存储元素和取出元素的顺序可能不一致。
- 底层是一个哈希表结构,查询速度快。
- 哈希表
- 哈希值:是一个十进制的整数,由系统给出
// 返回该对象的哈希值,native代表该方法调用的是本地操作系统的方法 public native int hashCode();
- 解决冲突的方法
- 开放地址法
- 再哈希法
- 链地址法
- 建立公共溢出区
- JDK1.8之前:哈希表=数据+链表
- JDK1.8之后:
- 哈希表=数组+链表
- 哈希表=数组+红黑树(链表长度超过8位,就会把链表转换为红黑树)
- 哈希值:是一个十进制的整数,由系统给出
- HashSet集合不能重复的原因
- Set集合在调用add方法的时候,add方法会调用元素的hashcode方法和equals方法,判断元素是否重复
- 前提:存储的元素必须重写hashcode和euqals方法
- 特点
- LinkedHashSet
- 特点
- 底层是一个哈希表+链表,多了一条链表用于记录元素的存储顺序,保证元素有序。
- 特点
5.Map集合
- 遍历
- 通过键找值的方法
- Map集合中的方法
// 返回此映射中包含的键的Set视图 Set<K> keySet();
- 实现步骤
- 使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中。
- 遍历set集合,获取Map集合中的每一个key。
- 通过Map集合中的方法get(key),通过key找到value。
- 实例
- Map集合中的方法
- 通过键找值的方法
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()){
String key = it.next();
Integer value = map.get(key);
System.out.println(value);
}
for(String key:map.keySet()){
Integer value = map.get(key);
System.out.println(value);
}
- 使用entrySet对象进行遍历
- Map集合中的方法
// 返回此映射中包含的映射关系的set视图 Set<Map.Entry<K,V>> entrySet();
- 实现步骤
- 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中。
- 遍历Set集合,获取每一个entry对象。
- 使用entry对象中的方法getKey()和getValue()获取键和值。
- 实例
Set<Map.Entry<String, Integer>> set = map.entrySet(); Iterator<Map.Entry<String, Integer>> it = set.iterator(); while(it.hasNext()){ Map.Entry<String, Integer> entry = it.next(); String key = entry.getKey(); Integer value = entry.getValue(); } for(Map.Entry<String, Integer> entry:set){ String key = entry.getKey(); Integer value = entry.getValue(); }
- Map集合中的方法
- HashMap
- 特点
- 底层是哈希表,查询速度快
- JDK1.8之后是数组+单向链表/红黑树
- 存储自定义类型键值
- Key:String类型
- String类型必须重写hashCode方法和equals方法,保证key的唯一
- Value:Person类型
- HashMap<String,Person> map = new HashMap<>();
- Key:String类型
- 特点
- LinkedHashMap
- 特点
- 底层是哈希表+链表
- 是一个有序的集合,存储元素和取出元素的顺序是一定的
- 特点
- HashTable
- 底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快,可以存储null值和null键
6.迭代器
迭代器是一个接口,无法直接使用,需要使用Iterator接口的实现类对象。Collection接口中有一个方法:Iterator(),这个方法返回迭代器的实现类对象。
Iterator<E> iterator();
- (1) 常用方法
// 判断是否有元素可以继续迭代,有则返回true
boolean hasNext();
// 返回迭代的下一代元素
E next();
- (2) 使用步骤
- 使用集合中的方法Iiterator()获取迭代器的实现类对象,使用Iterator接口接收。
- 使用Iterator接口中的方法hasNext()判断还有没有下一个元素。
- 使用Iterator接口中的方法next()取出集合中的下一个元素。
- (3) 实例
Collection<String> coll = new ArrayList();
coll.add("1");
coll.add("1");
coll.add("1");
coll.add("1");
Iterator<String> it = coll.iterator();
while(it.hasNext()){
String s = it.next();
}
for(Iterator<String> it = coll.iterator(); it.hasNext()){
String s = it.next();
}
7.增强for循环
- (1) 格式
for(集合/数组的数据类型 变量名:集合名/数组名){
sout(变量名);
}
- (2) 实例
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("1");
list.add("1");
list.add("1");
for(String s:list){
System.out.println(s);
}
int[] arr = {1,2,3,4,5};
for(int i:arr){
System.out.println(i);
}