集合框架&泛型
集合
一个长度可以改变、可以保持任意数据类型的动态数组
接口
接口 | 功能 |
---|---|
Collection | 集合框架最基础的接口、最顶层的接口 |
List | Collection的子接口、存储有序、不唯一(元素可重复)的对象、最常用的接口 |
Set | Collection的子接口、存储无序、唯一(元素不可重复)的对象 |
Map | 独立于Collection的另一个接口、最顶层的接口、存储一组键值对、提供键到值的映射 |
lerator | 输出集合元素的接口、一般适用于无序集合、从前往后输出 |
Listterator | lterator子接口、可以双向输出集合中的元素 |
Enumeration | 传统的输出接口、已经被lterator取代 |
SortedSet | Set的子接口、可以对集合中的元素进行排序 |
Queue | 队列接口 |
Map.Entry | Map的内部接口、描述Map中存储的一组键值对元素 |
Collection接口
最基础的父接口、可以存储一组无序、不唯一的对象
是Lterable接口的子接口
Collection接口常用方法
方法 | 功能 |
---|---|
int size() | 获取集合长度 |
boolean isEmpty() | 判断集合中是否存在某个对象 |
Iterator iterator() | 实例化Iterator接口、遍历集合 |
Object[] toArray() | 将集合转换为一个Object数组 |
T[] toArray(T[] a) | 将集合转换为一个指定数据类型的数组 |
boolean add(E e) | 向集合中添加元素 |
boolean reomove(Object o) | 从集合中删除元素 |
boolean containsAll(Collection c) | 判断集合中是否存在另一个集合的所有元素 |
boolean addAll(Collection c) | 向集合中添加某个集合的所有元素 |
boolean removeAll(Collection c) | 从集合中删除某个集合的所有元素 |
void clear() | 清除集合中的所有元素 |
boolean equals(Collection c) | 判断两个集合是否相等 |
int hashCode() | 返回集合的哈希值 |
Collection子接口
list:存放有序、不唯一的元素
Set:存放无序、唯一的元素
Queue:队列接口
List接口扩展方法
方法 | 功能 |
---|---|
T get(int index) | 通过下标返回集合中对应位置的元素 |
T Set(int index, T element | 在集合中的指定位置存入对象 |
int indexOf(Object o) | 从前向后查找某个对象在集合中的位置 |
int lastIndexOf(Object o) | 从后向前查找某个对象在集合中的位置 |
ListLterator ListLterator() | 实例化ListLterator接口、用来遍历List集合 |
List subList(int fromIndex, int toIndex) | 通过下标截取List集合 |
List接口的实现类
ArrayList:基于数组的实现、非线程安全、效率高、所有的方法都没有synchronized修饰
Vector:线程安全、效率低、实现线程安全直接通过synchronized修饰方法来完成
Stack:Vector的子类、实现了栈的数据结构、后进先出
LikedList:实现先进先出对列、采用链表形式存储
Stack操作栈的方法
- push:入栈方法
- peek: 取出栈顶元素、将栈顶复制一份取出、去完之后栈内的数据结构不变
- pop: 取出栈顶元素、直接取出栈顶元素、取完之后站内数据减一
ArrayList和LikedList的区别
内存中存储的形式不同、ArrayList采用的是数组的方式、LikedList采用的是链表的形式
数组在内存中的存储空间是连续的、读取快、增删慢
因为数组在内存中是连续的、所以数据可以通过寻址公式很快的找到目标元素的内存地址、因为内存是连续的、所以新增或删除元素、必然需要移动数据、而且数组长度越长、需要移动的元素越多、所以操作越慢
链表在内存中存储空间是不连续的,读取慢,增删快
链表在内存中是不连续的、没有固定的公式可以使用、要读取只能从第一位开始一直遍历目标元素、数据规模越大、操作越慢
增删快、因为只需要重新设置目标元素前后两个结点的后置指针即可、与数据规模无关
LinkedList和Stack的pop方法区别
相同点:都是取出集合中第一个元素
不同点:两者的顺序是相反的、Stack是后进先出原则、所以pop方法取出的是最后一个元素、LinkedList是先进先出原则、所以pop方法取出的是第一个元素
Set
Set是Collection的子接口、Set集合是以散列的形式存储数据、所以元素是没有顺序的、可以存储一组无序且唯一的数据
Set常用实现类
HashSet
存储一组无序且唯一的对象
无序:元素的存储顺序和遍历顺序不一致
1 | public static void main(String[] args) { |
LinkedHashSet
存储一组有序且唯一的元素
有序:元素的存储顺序和遍历顺序一致
1 | public static void main(String[] args) { |
LinkedHashSet 如何判断两个对象是否相等
首先会判断两个对象的 hashCode 是否相等
如果不相等、则认为不是同一个对象
如果相等、在进行equals判断、equals相等、则两对象相等、否则不等
什么是HashCode
将对象的内部信息、通过某种特定规则转换成一个散列值、就是该对象的 hashCode
TreeSet
存储一组有序且唯一的数据
有序:集合内部自动对所有的元素按照升序进行排列、无论存入的顺序是什么、遍历的时候都一定按照升序输出
1 | public static void main(String[] args) { |
Map
Map 可以操作一对元素、因为 Map 存储结构是 key - value 映射/
Map接口定义时使用了泛型、并且定义了两个泛型K和V、K表示Key键、V表示value值
Map常用的方法
方法 | 描述 |
---|---|
int size() | 获取集合长度 |
boolean isEmpty() | 判断集合是否为空 |
boolean containsKey(Object key) | 判断集合中是否存在某个 key |
boolean containsValue(Object value) | 判断集合中是否存在某个 value |
V get(Object key) | 取出集合中 key 对应的 value |
V put(K key,V value) | 向集合中存入一组 key-value 的元素 |
V remove(Object key) | 删除集合中 key 对应的 value |
void putAll(Map map) | 向集合中添加另外一个 Map |
void clear() | 清除集合中所有的元素 |
Set《k》 keySet() | 取出集合中所有的 key,返回一个 Set |
Collection《v》 values() | 取出集合中所有的 value,返回一个 Collection |
int hashCode() | 获取集合的散列值 |
boolean equals(Object o) | 比较两个集合是否相等 |
Map接口的实现类
hashMap
存储一组无序、key不可以重复、value可以重复的元素
非线程安全的、性能高
hashtable
存储一组无序、key不可以重复、value可以重复的元素
线程安全的、性能低
TreeMap
存储一组有序、key不可以重复、value可以重复的元素、可以按照key进行排序
Collections 工具类
专门提供一些对集合的操纵、Collections针对集合的工具类
Arrays针对数组的工具类
Collection工具类的常用方法
方法 | 描述 |
---|---|
public static sort() | 对集合进行排序 |
public static int binarySearch(List list,Object v) | 查找 v 在 list 中的位置,集合必须是生序排列 |
public static get(List list,int index) | 返回 list 中 index 位置的值 |
public static void reverse(List list) | 对 list 进行反序输出 |
public static void swap(List list,int i,int j) | 交换集合中指定位置的两个元素 |
public static void fill(List list,Object obj) | 将集合中所有元素替换成 obj |
public static Object min(List list) | 返回集合中的最小值 |
public static Object max(List list) | 返回集合中的最大值 |
public static boolean replaceAll(List list,Object old,Object new) | 在 list 集合中用 new 替换 old |
public static boolean addAll(List list,Object… obj) | 向集合中添加元素 |
Object…可变参数
1 | public static void test(Object... arg){ |
参数可以是任意个数、但是类型必须匹配
1 | public static void main(String[] args) { |
泛型(Generics)
在类定义时不指定类中信息的具体数据类型、而是暂时用一个标识来替代、当外部实例化对象时再来指定具体的数据类型
直接定义
1 | public class A{ |
泛型定义
1 | public class A<T,E,M>{ |
使用泛型的优点
极大地提升程序的灵活性、提升类的扩展性
可以指代成员变量类型、方法的参数类型、方法的返回值类型
1 | public class Time<H,M,S> { |
泛型的通配符
?: 表示可以使用任意的泛型类型对象、使其具备通用性
多态在泛型中不适用
1 | public static void main(String[] args) { |
泛型的上限和下限
上限
实例化具体的数据类型、可以是上限类型的子类或者是上限类型的本身、用extends表示、 类名<泛型标识 extends 上限类名>
1 | public class T<M> { |
下限
实例化具体的数据类型、可以是下限类型的父类或者是下限类型的本身、用super表示 类名<泛型标识 super 下限类名>
1 | public class T<M> { |
泛型接口
1 | public interface MyInterface<T> { |
实现类在定义时继续使用泛型标识
1 | public class MyInterfaceImpl implements MyInterface<T> { |
实现类在定义时直接给出具体的数据类型
1 | public class MyInterfaceImpl2 implements MyInterface<String> { |
正确的开始、微小的长进、然后持续、嘿、我是小博、带你一起看我目之所及的世界……
本文标题:集合框架&泛型
发布时间:2021年06月12日 - 12:23
最后更新:2021年06月13日 - 01:00
原始链接:https://codexiaobo.github.io/posts/29725478/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。