集合整理总结
一、单列集合
1、Collection接口
1.1、概述
概述:Collection是单列集合的顶级接口(interface)
1.2、特点
a.元素有序
b.元素可重复
c.没有索引
1.3、创建
Collection<E> 集合名 = new ArrayList<E>()
1.4、方法介绍
1、boolean add(E e) : 将给定的元素添加到当前集合中(我们一般调add时,不用boolean接收,因为add一定会成功)
2、boolean addAll(Collection<? extends E> c) :将另一个集合元素添加到当前集合中 (集合合并)
3、void clear():清除集合中所有的元素
4、boolean contains(Object o) :判断当前集合中是否包含指定的元素
5、boolean isEmpty() : 判断当前集合中是否有元素->判断集合是否为空
6、boolean remove(Object o):将指定的元素从集合中删除
7、int size() :返回集合中的元素数。
8、Object[] toArray(): 把集合中的元素,存储到数组中
public class Test01 {
public static void main(String[] args) {
Collection<String> collection1 = new ArrayList<String>();
//boolean add(E e) : 将给定的元素添加到当前集合中(我们一般调add时,不用boolean接收,因为add一定会成功)
collection1.add("张无忌");
collection1.add("赵敏");
collection1.add("周芷若");
collection1.add("灭绝师太");
collection1.add("金毛狮王");
collection1.add("青翼蝠王");
collection1.add("白眉鹰王");
collection1.add("紫衫龙王");
System.out.println(collection1);
//boolean addAll(Collection<? extends E> c) :将另一个集合元素添加到当前集合中 (集合合并)
Collection<String> collection2 = new ArrayList<String>();
collection2.add("乔峰");
collection2.add("段誉");
collection2.add("虚竹");
collection1.addAll(collection2);
System.out.println(collection1);
//void clear():清除集合中所有的元素
//collection1.clear();
//System.out.println(collection1);
//boolean contains(Object o) :判断当前集合中是否包含指定的元素
boolean result01 = collection1.contains("赵敏");
System.out.println("result01 = " + result01);
//boolean isEmpty() : 判断当前集合中是否有元素->判断集合是否为空
boolean empty = collection1.isEmpty();
System.out.println("empty = " + empty);
//boolean remove(Object o):将指定的元素从集合中删除
boolean result02 = collection1.remove("周芷若");
System.out.println("result02 = " + result02);
System.out.println(collection1);
//int size() :返回集合中的元素数。
System.out.println(collection1.size());
//Object[] toArray(): 把集合中的元素,存储到数组中
Object[] array = collection1.toArray();
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
2、List
2.1、概述
概述:List接口是Collection接口的子接口
2.2、实现类
ArrayList,LinkedList,Vector
3、ArrayList
3.1、概述
概述:ArrayList是List接口的实现类
3.2、特点
a.元素有序
b.元素可重复
c.有索引
d.线程不安全
3.3、数据结构
数据结构:数组
3.4、常用方法
1、boolean add(E e) -> 将元素添加到集合中->尾部(add方法一定能添加成功的,所以我们不用boolean接收返回值)
2、void add(int index, E element) ->在指定索引位置上添加元素
3、boolean remove(Object o) ->删除指定的元素,删除成功为true,失败为false
4、E remove(int index) -> 删除指定索引位置上的元素,返回的是被删除的那个元素
5、E set(int index, E element) -> 将指定索引位置上的元素,修改成后面的element元素
6、E get(int index) -> 根据索引获取元素
7、int size() -> 获取集合元素个数
3.4.1、remove方法注意事项
public class Test03_ArrayList {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(2);
/*
remove(Object o)-> 删除指定元素
remove(int index)->删除指定索引位置上的元素
remove(2)-> 2是一个int型->自动匹配到了remove(int index)->删除指定索引位置上的元素
但是list集合中没有2索引,所以报错
*/
//list.remove(2);
list.remove(new Integer(2));
System.out.println(list);
}
}
3.5、底层实现原理
1.问题:我们说过ArrayList是一个集合,集合的长度是可变的;ArrayList底层数据结构是数组,那么底层数据结构是数组怎么做到长度可变的呢?
2.ArrayList有一个空参构造:
ArrayList() 构造一个初始容量为 10 的空列表
注意:不是一new就创建一个长度为10的空列表,而是第一次add的时候才会创建长度为10的空列表
3.为啥说ArrayList底层是个数组,但是还要说ArrayList是长度可变的呢?
elementData = Arrays.copyOf(elementData, newCapacity);->数组扩容,数组复制
4.怎么扩容的?
elementData = Arrays.copyOf(elementData, newCapacity);->数组扩容,数组复制
5.扩容多少倍呢?
1.5倍
4、LinkedList
4.1、概述
概述:是List接口下的实现类
4.2、特点
a.元素有序
b.元素可重复
c.有索引
d.线程不安全
4.3、数据结构
数据结构:双向链表
4.4、使用场景
我们有可能有大量的首尾元素的操作,LinkedList有很多特有方法,这些特有方法都是直接操作首尾元素的
4.5、方法
4.5.1、方法(和ArrayList方法相同)
1、boolean add(E e) -> 将元素添加到集合中->尾部(add方法一定能添加成功的,所以我们不用boolean接收返回值)
2、void add(int index, E element) ->在指定索引位置上添加元素
3、boolean remove(Object o) ->删除指定的元素,删除成功为true,失败为false
4、E remove(int index) -> 删除指定索引位置上的元素,返回的是被删除的那个元素
5、E set(int index, E element) -> 将指定索引位置上的元素,修改成后面的element元素
6、E get(int index) -> 根据索引获取元素
7、int size() -> 获取集合元素个数
4.5.2 特有方法
1、 public void addFirst(E e):将指定元素插入此列表的开头。
2、 public void addLast(E e):将指定元素添加到此列表的结尾。
3、 public E getFirst():返回此列表的第一个元素。
4、 public E getLast():返回此列表的最后一个元素。
5、 public E removeFirst():移除并返回此列表的第一个元素。
6、 public E removeLast():移除并返回此列表的最后一个元素。
7、 public E pop():从此列表所表示的堆栈处弹出一个元素。
8、 public void push(E e):将元素推入此列表所表示的堆栈。
9、 public boolean isEmpty():如果列表不包含元素,则返回true。
4.5、底层原理
4.5.1、LinkedList底层成员解释说明
1.LinkedList底层成员
transient int size = 0; 元素个数
transient Node<E> first; 第一个节点对象
transient Node<E> last; 最后一个节点对象
2.Node代表的是结点对象
private static class Node<E> {
E item;//节点上的元素
Node<E> next;//记录着下一个节点地址
Node<E> prev;//记录着上一个节点地址
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
4.5.2、LinkedList中add方法源码分析
LinkedList<String> list = new LinkedList<>();
list.add("a");
list.add("b");
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
4.5.3、查询速度
为了查询速度快:采用二分法查找思想
5、Vector
5.1、概述
是Collection的实现类,从jdk1.0版本开始就有了,但是由于效率低,从jdk1.2开始变成了Collection实现类
5.2、特点
a.有序
b.有索引
c.元素可重复
d.线程安全
5.3、数据结构
数据结构:数组
5.4、方法
因为不经常使用,方法不在一一例举
方法同 ArrayList
5.5、底层原理
a.Vector一new底层就会直接产生一个长度为10的空数组
b.数组扩容:Arrays.copyOf
扩容2倍
6、Set
6.1、概述
概述:Set是一个接口,是Collection下的子接口
6.2、方法
a.所有的方法和 Collection 接口中的方法一毛一样
b.set接口中的方法并没有对Collection中的方法进行任何的扩充
c.Set以及下面所有的实现类集合相当于是一个"傀儡"
因为所有的set集合底层都是依靠map集合实现的
7、HashSet
7.1、概述
概述:HashSet 是 Set接口的实现类对象
7.2、特点
a.元素无序
b.元素不可重复
c.无索引
d.线程不安全
7.3、数据结构
数据结构:哈希表
jdk8之前: 哈希表 = 数组+链表
jdk8之后: 哈希表 = 数组+链表+红黑树
7.4、方法
和Collection一毛一样
1、boolean add(E e) : 将给定的元素添加到当前集合中(我们一般调add时,不用boolean接收,因为add一定会成功)
2、boolean addAll(Collection<? extends E> c) :将另一个集合元素添加到当前集合中 (集合合并)
3、void clear():清除集合中所有的元素
4、boolean contains(Object o) :判断当前集合中是否包含指定的元素
5、boolean isEmpty() : 判断当前集合中是否有元素->判断集合是否为空
6、boolean remove(Object o):将指定的元素从集合中删除
7、int size() :返回集合中的元素数。
8、Object[] toArray(): 把集合中的元素,存储到数组中
7.5、如何做到元素唯一
重写hashCode和equals方法
a.先计算元素哈希值进行比较,再比较内容
b.如果哈希值不一样,存
c.如果哈希值一样,再比较内容
d.如果哈希值一样,内容不一样,存
e.如果哈希值一样,内容一样,元素覆盖
f.后面覆盖前面
8、LinkedHashSet
8.1、概述
概述:LinkedHashSet extends HashSet
8.2、特点
a.元素有序
b.元素不可重复
c.无索引
d.线程不安全
8.3、数据结构
数据结构:哈希表+双向链表
8.4、方法
和HashSet一样
1、boolean add(E e) : 将给定的元素添加到当前集合中(我们一般调add时,不用boolean接收,因为add一定会成功)
2、boolean addAll(Collection<? extends E> c) :将另一个集合元素添加到当前集合中 (集合合并)
3、void clear():清除集合中所有的元素
4、boolean contains(Object o) :判断当前集合中是否包含指定的元素
5、boolean isEmpty() : 判断当前集合中是否有元素->判断集合是否为空
6、boolean remove(Object o):将指定的元素从集合中删除
7、int size() :返回集合中的元素数。
8、Object[] toArray(): 把集合中的元素,存储到数组中
8.5、 如何做到元素唯一
重写hashCode和equals方法
a.先计算元素哈希值进行比较,再比较内容
b.如果哈希值不一样,存
c.如果哈希值一样,再比较内容
d.如果哈希值一样,内容不一样,存
e.如果哈希值一样,内容一样,元素覆盖
f.后面覆盖前面
9、TreeSet
9.1、概述
概述:TreeSet是Set接口的实现类
9.2、特点
a.可以对元素进行排序
b.元素唯一
c.无索引
d.线程不安全
9.3、数据结构
数据结构:红黑树
9.4、方法
和HashSet一样
1、boolean add(E e) : 将给定的元素添加到当前集合中(我们一般调add时,不用boolean接收,因为add一定会成功)
2、boolean addAll(Collection<? extends E> c) :将另一个集合元素添加到当前集合中 (集合合并)
3、void clear():清除集合中所有的元素
4、boolean contains(Object o) :判断当前集合中是否包含指定的元素
5、boolean isEmpty() : 判断当前集合中是否有元素->判断集合是否为空
6、boolean remove(Object o):将指定的元素从集合中删除
7、int size() :返回集合中的元素数。
8、Object[] toArray(): 把集合中的元素,存储到数组中
9.5、构造方法
1.构造:
TreeSet() -> 对元素进行自然排序-> ASCII
TreeSet(Comparator<? super E> comparator) -> 按照指定规则进行排序
9.6、demo
public class Person {
private String name;
private Integer age;
public Person() {
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name) &&
Objects.equals(age, person.age);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Demo01TreeSet {
public static void main(String[] args) {
TreeSet<String> set = new TreeSet<>();
set.add("b");
set.add("a");
set.add("d");
set.add("c");
System.out.println(set);
System.out.println("=========================");
TreeSet<Person> set1 = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
set1.add(new Person("涛哥",12));
set1.add(new Person("柳岩",36));
set1.add(new Person("曼曼",26));
System.out.println(set1);
}
}
二、双列集合
1、Map
1.1、概述
1.概述:双列集合的顶级接口
2.组成部分:
一个元素是有两部分构成
key = value -> 键值对
2、HashMap
2.1、概述
是Map的实现类
2.2、特点
a.元素无序
b.key唯一,value可重复
c.无索引
d.线程不安全
e.能存null键null值
2.3、数据结构
数据结构:哈希表
2.4、方法
1、V put(K key, V value) -> 存储元素
2、V remove(Object key) ->根据key删除对应的键值对
3、V get(Object key) -> 根据key获取对应的value
4、boolean containsKey(Object key) ->判断Map中是否包含指定的key
5、Collection<V> values() -> 将Map中所有的value存储到Collection集合中
6、Set<K> keySet() -> 将Map中所有的key获取出来存到Set集合中
7、Set<Map.Entry<K,V>> entrySet() -> 获取Map中所有的键值对对象,放到set集合中
2.5、注意
如果key重复了,后面的会把前面的覆盖掉,去重复过程和set一毛一样
public class Test01_HashMap {
public static void main(String[] args) {
HashMap<String, String> hashMap = new HashMap<>();
//V put(K key, V value) -> 存储元素
hashMap.put("涛哥","柳岩");
hashMap.put("黄晓明","杨颖");
hashMap.put("文章","马伊琍");
hashMap.put("文章","姚笛");
hashMap.put("宝强","马蓉");
hashMap.put("宋喆","马蓉");
System.out.println(hashMap);
//V remove(Object key) ->根据key删除对应的键值对
String value = hashMap.remove("涛哥");
System.out.println(value);
System.out.println(hashMap);
//V get(Object key) -> 根据key获取对应的value
String value1 = hashMap.get("黄晓明");
System.out.println(value1);
//boolean containsKey(Object key) ->判断Map中是否包含指定的key
boolean result = hashMap.containsKey("涛哥");
System.out.println("result = " + result);
//Collection<V> values() -> 将Map中所有的value存储到Collection集合中
Collection<String> collection = hashMap.values();
for (String s : collection) {
System.out.println(s);
}
}
}
2.6、如果做到key唯一
key重写hashCode和equals方法
a.先计算元素哈希值进行比较,再比较内容
b.如果哈希值不一样,存
c.如果哈希值一样,再比较内容
d.如果哈希值一样,内容不一样,存
e.如果哈希值一样,内容一样,元素覆盖
后面覆盖前面
3、LinkedHashMap
3.1、概述
概述:LinkedHashMap extends HashMap
3.2、特点
a.有序
b.无索引
c.key唯一,value可重复
d.线程不安全
e.能存null键null值
3.3、数据结构
哈希表+双向链表
3.4、方法
和HashMap一样
1、V put(K key, V value) -> 存储元素
2、V remove(Object key) ->根据key删除对应的键值对
3、V get(Object key) -> 根据key获取对应的value
4、boolean containsKey(Object key) ->判断Map中是否包含指定的key
5、Collection<V> values() -> 将Map中所有的value存储到Collection集合中
6、Set<K> keySet() -> 将Map中所有的key获取出来存到Set集合中
7、Set<Map.Entry<K,V>> entrySet() -> 获取Map中所有的键值对对象,放到set集合中
3.5、如果做到key唯一
key重写hashCode和equals方法
a.先计算元素哈希值进行比较,再比较内容
b.如果哈希值不一样,存
c.如果哈希值一样,再比较内容
d.如果哈希值一样,内容不一样,存
e.如果哈希值一样,内容一样,元素覆盖
后面覆盖前面
4、TreeMap
4.1、概述
概述:TreeMap是Map接口的实现类
4.2、特点
1.特点
a.key唯一
b.可以对key进行排序
c.无索引
d.线程不安全
e.能存null键null值
4.3、数据结构
红黑树
4.4、方法
和HashMap一样
1、V put(K key, V value) -> 存储元素
2、V remove(Object key) ->根据key删除对应的键值对
3、V get(Object key) -> 根据key获取对应的value
4、boolean containsKey(Object key) ->判断Map中是否包含指定的key
5、Collection<V> values() -> 将Map中所有的value存储到Collection集合中
6、Set<K> keySet() -> 将Map中所有的key获取出来存到Set集合中
7、Set<Map.Entry<K,V>> entrySet() -> 获取Map中所有的键值对对象,放到set集合中
4.5、构造方法
TreeMap() -> 按照自然顺序对key进行排序
TreeMap(Comparator<? super K> comparator)-> 按照指定规则对key进行排序
4.6、demo
public class Person {
private String name;
private Integer age;
public Person() {
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name) &&
Objects.equals(age, person.age);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Demo02TreeMap {
public static void main(String[] args) {
TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put("b","疑是地上霜");
treeMap.put("d","低头思故乡");
treeMap.put("a","床前明月光");
treeMap.put("c","举头望明月");
System.out.println(treeMap);
System.out.println("========================");
TreeMap<Person, String> treeMap1 = new TreeMap<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge()-o2.getAge();
}
});
treeMap1.put(new Person("涛哥",10),"廊坊");
treeMap1.put(new Person("柳岩",36),"湖南");
treeMap1.put(new Person("曼曼",26),"东北");
System.out.println(treeMap1);
}
}
5、Hashtable
5.1、概述
概述:是Map的实现类,从jdk1.0开始就有,但是由于效率低,所以从jdk1.2开始变成了map的实现类
5.2、特点
1.特点
a.无序
b.key唯一,value可重复
c.无索引
d.线程安全
e.不能存储null键,null值
5.3、数据结构
哈希表
5.4、方法
和HashMap一样
1、V put(K key, V value) -> 存储元素
2、V remove(Object key) ->根据key删除对应的键值对
3、V get(Object key) -> 根据key获取对应的value
4、boolean containsKey(Object key) ->判断Map中是否包含指定的key
5、Collection<V> values() -> 将Map中所有的value存储到Collection集合中
6、Set<K> keySet() -> 将Map中所有的key获取出来存到Set集合中
7、Set<Map.Entry<K,V>> entrySet() -> 获取Map中所有的键值对对象,放到set集合中
6、Properties
6.1、概述
概述:Properties是Hashtable的子类
6.2、特点
1.特点
a.无序
b.key唯一,value可重复
c.无索引
d.线程安全
e.Properties的key和value类型默认是String
f.不允许有null键null值
6.3、数据结构
哈希表
6.4、方法
6.4.1、方法
和HashMap一样
1、V put(K key, V value) -> 存储元素
2、V remove(Object key) ->根据key删除对应的键值对
3、V get(Object key) -> 根据key获取对应的value
4、boolean containsKey(Object key) ->判断Map中是否包含指定的key
5、Collection<V> values() -> 将Map中所有的value存储到Collection集合中
6、Set<K> keySet() -> 将Map中所有的key获取出来存到Set集合中
7、Set<Map.Entry<K,V>> entrySet() -> 获取Map中所有的键值对对象,放到set集合中
6.4.2、特有方法
1、 Object setProperty(String key, String value) -> 存储键值对
2、 String getProperty(String key) -> 根据key获取value
3、 Set<String> stringPropertyNames() -> 获取所有的key,存放到Set集合中
4、 void load(InputStream inStream) -> 将流中的数据信息加载到Properties集合中 (IO流部分讲)
三、
1、迭代器
Iterator
a.获取
Collection中的方法
Iterator iterator()
b.方法
hasNext()
判断有没有下一个元素
next()
获取下一个元素
c.并发修改异常
实际操作次数和预期操作次数不相等
2、增强for
2.增强for
a.格式
for(元素类型 变量名:集合名或者数组名){}
b.注意
遍历集合时,原理为迭代器
遍历数组时,原理为普通for
3、泛型
3.泛型
a.含有泛型的类
public class 类名<E>{}
new对象时确定类型
b.含有泛型的方法
修饰符 <E> 返回值类型 方法名(E e){}
调用的时候确定类型
c.含有泛型的接口
public interface 接口名<E>{}
实现类时候确定类型
new实现类对象的时候确定类型
d.泛型高级使用
上限
<? extends 类>
?接收的类型为后面类的本类以及子类
下限
<? super 类>
?接收的类型为后面类的本类以及父类
4、Collections集合工具类
4.Collections集合工具类
static <T> boolean addAll(Collection<? super T> c, T... elements)->批量将元素存到集合中
static void shuffle(List<?> list) -> 将集合中的元素顺序打乱
static <T> void sort(List<T> list) ->将集合中的元素按照默认规则排序->ASCII
static <T> void sort(List<T> list, Comparator<? super T> c)->将集合中的元素按照指定规则排序
5、数据结构
5.数据结构
栈
先进后出
队列
先进先出
数组
查询快
增删慢
链表
查询慢
增删快