1.数据结构:常用的数据结构有栈、队列、链表和红黑树结构
1)数据结构_栈(stack):先进后出(弹夹) FILO-First In Last Out
*入栈:将元素存入集合中
*出栈:取出集合中的元素(先进去的元素后出来)
*入口和出口在集合的同一侧
例:1、2、3号元素按顺序入栈,出栈顺序为 3、2、1号元素
*应用场景:反转元素
2)数据结构_队列(queue):先进先出
*入口和出口在集合的两侧
例:排队安检—包裹先进去的先出来
*应用场景:处理高并发场景
3)数据结构_数组(arry):查询快,增删慢
*查询快:数组的地址是连续的,我们通过数组的首地址找到数组,通过数组的索引可以快速查询某个元素
*增删慢:数组的长度是固定的,我们想要增加/删除一个元素,必须创建一个新数组,把源数组的数据复制过来
4)数据结构_链表(linked list) :查询慢、增删快
*查询慢:链表中地址不是连续的,每次查询元素都必须从链表头开始查询
*增删快:链表结构增加/删除元素,对链表整体结构没有影响
*链表中每一个元素也称之为一个节点
单向链表
链表中只有一条链,不能保证元素的顺序
|数据|下一个节点的地址|
双向链表
|上一个节点的地址|数据|下一个节点的地址|
5)红黑树结构:是一张近似平衡的二叉查找树,查询速度非常快,查询叶子节点最大次数和最小次数不能超过2倍
*约束:每个节点或者是黑色,或者是红色。
根节点是黑色。
每个叶子节点(NIL)是黑色。 [这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
如果一个节点是红色的,则它的子节点必须是黑色的。
从一个节点到该节点的子孙点的所有路径上包含相同数目的黑节点。[确保没有一条路径会比其他路径长出俩倍]
2.List接口:有序/可以存储重复元素/有索引
1)ArrayList<E>实现类-底层数据结构为数组结构,查询快,增删慢
2)LinkedList<E>实现类-底层数据结构为双向链表,查询慢,增删快
*特点:底层是链表结构/里面包含了大量操作首尾元素的方法
注:双向链表结构找到head 和 tail是快的,所以LinkedList实现类中有很多操作head和tail元素的方法
3)Vector:是旧的实现类,了解即可,是单线程集合,被ArrayList取代了
3.Set接口:没有索引/不允许存储重复元素
1)HashSet<E>实现类-底层数据结构为哈希表结构(查询速度非常快)
*实现了Set接口—没有索引/不允许存储重复元素
*是一个无序的集合,存储元素和取出元素的顺序有可能不一致
*拓展:哈希表
**哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,但是是一个逻辑地址,不是数据的物理地址
**哈希表:= 数组 + 链表/红黑树
数组结构:把哈希值相同的对象链在一起作为一个元素放到数组中
链表结构/红黑树:把相同哈希值的元素连接到一起(如果链表超过八位则把链表转换成红黑树)
特点:查询速度快
2)LinkedHashSet<E>- 底层是一个哈希表(数组+链表/红黑树)+链表(记录元素的存储顺序)
*保证元素有序
3)使用HashSet集合来存储自定义元素
*许要重写hashCode和equals方法,来保证保存元素的唯一
4.可变参数:是JDK1.5之后出现的新特性
*使用前提:当方法的参数列表数据类型确定,但个数不确定
*使用格式:定义方法时使用
修饰符 返回值类型 方法名(数据类型... 变量名){}
*原理:可变参数底层就是一个数组
*注意事项:
一个方法的参数列表,只能有一个可变参数
如果方法的参数有多个,可变参数必须卸载末尾
*可变参数的终极写法
public static void method(Object... obj){}
5.Collections
*常用方法
static <T> boolean addAll(Collection<? super T> c, T... elements):往集合中添加一些元素
static void shuffle(List<?> list): 打乱集合顺序
static <T> void sort(List<T> list): 将集合中元素按照默认规则排序
自定义类必须对compareTo方法进行重写
**this - 参数:升序
**参数 - this:降序
static <T> void sort(List<T> list,Comparator<? super T> c):将集合中元素按照指定规则排序
|
|