一:为什么会出现容器?
- 在之前的学习中,我们学习了变量和常量。都是一个字符或者字符串,数字的情况。但是在实际的生产中,我们一次会接受到很多类型不同,个数不同的数据。所以,为了方便我们后续的处理,引进了容器的概念(引入了数组的概念,但是数组扩容比较麻烦,不够灵活)。
- 容器-用来存储相同类型,可以随时扩容的对象。
二:容器是是什么?
1. Collection接口
(1)Collection是一个接口,只是规定了一些方法,即作为一个容器就应该具有这些功能。
2. list接口
特点
有序,可以重复
ArrayList
(1)底层构成是由数组组成。
(2)扩容
在插入数据时候,长度进行比较,如果孔家不够,那么就进行扩容,扩容后的大小等于扩容前大小的1.5倍。扩容比较麻烦,需要重新进行排序
LinkedList
(1)底层由双向链表构成(之所以不是单向列表,方便前遍历)first,last。
(2)扩容
扩容比较简单,将插入位置的前后俩个数组的链条指向修改即可。
对比
1. ArrayList对于对于查询方便。因为由索引的存在,对于增加和修改,删除比较繁琐。
2. LinkedList对于查询繁琐,因为需要挨个进行遍历,对于增加和修改,删除简单。
3. Map接口
HashMap
(1)主要存储键值对<key,value>值。
(1)底层构成。
底层是由数组,单向链表以及红黑树构成。
(2)扩容。
数组扩容。默认数组长度是16,当使用了75%的时候,就会进行二倍扩容。
链表扩容。当链表长度超过8的时候,多余出来的数据就会变成红黑树。
红黑树特点:
1.每个节点要么是红色,要么是黑色。
2.根节点必须是黑色
3.红色节点不能连续(红色节点的孩子和父亲都不能都是红色)
4.从任意节点出发,到其所有叶子节点的简单路径上都包含相同数目的黑色节点.(非常重要)
5.每个红色节点的两个子节点一定都是黑色(叶子节点包含NULL)
4. Set接口
HashSet
特点 无序,不可以重复。
存储本质 本质上hashSet的底层是HashMap。将数据存储在key中,value值用一个new Object()作为填充。
5. 整体对比
(1)Set和List是存储相同类型的值的一个容器,Map是存储<key,value>键值对的容器。
(2)HashSet和HashMap,对于存储的数据是无序,不可以重复的。LinkedList和ArrayList是有序的,可以重复。
(3)LinkedList 便于增,删,改,不利于查。ArrayList便于查,不便于增,删,改。
三:容器怎么使用?
(1)容器包含的方法(除Map)。
添加 add
删除 remove
记数 size
包含 contains
清空 clear
是否空 isEmpty
(2)map。
Object put(Object key, Object value);
Object get(Object key);
Object remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
void putAll(Map t);
void clear();
(3)迭代器(Iterator)
boolean hasNext(); //判断是否有元素没有被遍历
Object next(); //返回游标当前位置的元素并将游标移动到下一个位置
void remove(); //删除游标左面的元素,在执行完next之后该 ,操作只能执行一次。
本质上是一个指针对象,当我们在方法中,使用到迭代器,想要指定当前的元素,我们需要使用next()来指向当前的元素;
(4)迭代器(Iterator)(Map)
package day02;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class HashMap_test {
public static void main(String[] args) {
HashMap<Integer, String> map = new HashMap<>();
map.put(1,"op");
map.put(2,"op");
map.put(3,"io");
map.put(3,"io");
System.out.println(map.size());
System.out.println(map.get(3));
Set<Integer> integers = map.keySet();
Iterator<Integer> iterator = integers.iterator();
while (iterator.hasNext())
{
Integer next = iterator.next();
System.out.println(next+"-"+map.get(next));
}
}
}