从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection)
,存储一个元素集合,另一种是图(Map)
,存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包。
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
一、ArrayList----->底层就是一个数组
所属的包 java.util
如何创建对象
无参数构造方法 带默认空间的构造方法 带collection参数的构造方法
常用的方法---小容器
存 add、取 get、删 remove、改 set、个数 size
add(E e) add(int index,E e)
addAll(Collection c); add(int index,Collection c)
clear();将集合内的全部元素清除
boolean = contains(Object);找寻某一个给定的元素是否在集合中拥有
ensureCapacity(int minCapacity);
E = get(int index);
int = indexOf(Object obj); lastIndexOf();
boolean = isEmpty();
Iterator = list.iterator();//迭代器
remove(int index) remove(Object obj)
removeAll()差集
retainAll();交集
E = set(int index,E value)
int size();
List = subList(int begin,int end);
toArray(); 集合变成数组
toArray(T[] );
trimToSize();// 变成有效元素个数那么长
二、Vector类
1.java.util包
2.是`ArrayList集合的*早期版本*`
Vector底层也是利用(动态)数组的形式存储
Vector是线程同步的(synchronized) 安全性高 效率低
3.扩容方式与ArrayList不同
默认是扩容2倍 可以通过构造方法创建对象时修改这一机制
三、LinkedList类
1.java.util包 自己封装过LinkedBox 内部类Node<T>对象(节点 prev item next)
2.底层使用双向链表的数据结构形式来存储
适合于插入或删除 不适合遍历轮询
3.构建对象
无参数构造方法 带参数的构造方法(collection)
4.常用的方法
增删改查 add() remove() set() get() size() offer poll peek
手册中提供的其他常用方法
addAll addFist addLast() clear() contains()
element() getFirst() getLast() indexOf() lastIndex()
四、Queue接口
1.java.util 通常子类LinkedList ArrayDeque
2.通常无参数构造方法创建
3.一般方法
add()
element()---->get()
remove()
boolean = offer(E e);//相当于add 不会抛出异常
E = peek();//相当于 element方法
E = poll();剪短// 相当于remove()
4.双十一零点秒杀
所有进入秒杀系统的人存入队列
五、HashSet---->(HashMap (数组+链表) 散列表 临接连表)
1.java.util
2.如何创建对象 无参数 有参数
3.集合容器的基本使用
增删改查
boolean = add(value) addAll(collection c) retainAll removeAll
boolean = remove(Object)
没有修改方法
iterator() 获取一个迭代器对象
size()
4.无重复的原则
首先通过String类型和Person类型存储
大概猜测 无重复的原则 利用equals方法进行比较
如果我们想要让Person对象的name一致 认为是同一个对象
我们可以重写equals方法
重写了equals方法 发现还没有产生无重复的效果
证明可能原则不止equals一个方法这么简单
还有另一个规则同时起着作用 hashCode方法 int
五个Person对象只剩一个 第一次存储的 还是最后一次存储
set集合是发现重复的元素 拒绝存入 存储的是第一个
六、TreeSet-----(TreeMap 二叉树 利用Node(left item right))
无序无重复 java.util
无参数构造方法 带Collection构造方法
基本常用方法
add(E e) iterator() remove(E e) 没有修改 size()
无重复的规则是如何实现的
treeSet集合本身有顺序 我们指的无序存入的和取出来的不一致
compareTo---->String类 按照字母的自然顺序排布(Unicode)
如果想要把自己写的类型 比如Person对象存入TreeSet集合里
不能随意的存储 需要让自己写的类先实现Comparable接口
Map 映射 通过某一个key可以直接定位到一个value值
存储的方式以 键值对 存储 key-value
key无序无重复 value无序可重复
key无序还是一样,指的是存入顺序与取得顺序不一致
key无重复当然指的是 元素不能一致
1.map基本使用
HashMap
TreeMap
Properties
HashMap
1.包 java.util
2.基本方法
增删改查
增put(key,value) 存放一组映射关系 key-value
1.key存储的顺序与取得顺序不同
2.不同的key可以存储相同的value
3.key若有相同的 则将 原有的value覆盖而不是拒绝存入(跟set刚好相反)
删E = remove(key);
改put(key,value1) put(key,value2)
replace(key,newValue)
查E = get(key)
遍历map集合? key不一定什么样
获取到所有的key 遍历key 通过key获取value
Set<Key> = keySet()获取全部的key
Set<Entry> = entrySet();
size();
3.除了上述几个常用的方法外 其他API中提供的方法
clear containsKey(key) containsValue(value)
getOrDefault(key,defaultValue);如果key存在就返回对应的value 若没有找到则返回默认值
isEmpty()
putAll(map)
putIfAbsent(key,value);//如果key不存在才向集合内添加 如果key存在就不添加啦
4.map集合在什么情形下用?
1.想要存储一组元素
数组 or 集合 如果存储的元素以后长度不变用数组 如果长度以后不确定 用集合
2.如果发现长度以后不确定--->集合
List Set Map
List家族有序的 存储有顺序用这个
ArrayList 更适合遍历轮询
LinkedList 更适合插入和删除
Stack LIFO
Set家族无重复 存储元素希望自动去掉重复元素用这个
Hash 性能更高
Tree 希望存进去的元素自动去重复 同时还能自动排序
Map家族k-v 通过唯一的k快速找寻v用这个
Hash 性能更高
Tree 希望存进去的元素key自动排序