栈,队列,数组,链表,红黑树
栈:stack,先进后出
队列:queue,先进先出
数组:array,查询快,增删慢,数组的地址是连续的,通过数组首地址和索引可快速查看某元素。
数组的长度是固定的,想增加/删除一个元素,必须创建一个新数组,把源数组的数据复制过来,源数组在内存中被垃圾回收。
链表:linkedlist,查询慢,增删快。链表中地址不是连续的,每次查询元素,都必须从头开始查询。链表结构,增加和删除一个元素,对整体结构没有影响,所以增删快。
链表中每一个元素称为一个节点,一个节点包含一个数据源(存数据),两个指针(存地址)
--自己的地址 | 数据 | 下一个节点的地址
单项链表:链表中只有一条链子,不能保证元素的顺序。
双向链表:链表中有两条链子,有一条链子专门记录元素的顺序,是一个有序集合。
红黑树:binary tree;红黑树是一个二叉树,根,分支,节点。左节点,右节点。
二叉树:分支不能超过两个。
排序树(查找树):在二叉树的基础上,元素是有大小顺序的。左子树小,右子树大。
平衡树:左孩子的数量和右孩子数量相等。
不平衡树:左孩子不等于右孩子的数量。
红黑树:
特点:趋近于平衡树,查询的速度非常的快,查找叶子节点最大次数和最小次数不能超过2倍。
约束条件:
1.节点可以是红色或黑色
2.根节点是黑色的。
3.叶子节点,是黑色的
4.每个红色节点的子节点都是黑色的。
5.任何一个节点到其每个叶子节点的所有路径上黑色节点数相同。
ArrayList底层是数组实现的。不是同步的。
LinkedList底层是双链表结构,方便元素添加和删除。不是同步的。
Vector单列集合,同步的,Java1.1的集合
Set接口,继承了Collection接口
Set接口特点:1.不允许存储重复数据。2.没有索引,不能使用普通的for循环
两个实现类:HashSet,TreeSet
HashSet特点:
1.不允许存重复数据
2.没有索引,不能使用普通for循环
3.是一个无序集合,存元素和取元素的顺序有可能不一致
4.底层是一个哈希表(查询速度非常快)
哈希值:是一个十进制的整数,由系统随机给出,是一个逻辑地址,模拟出来的,不是实际存储地址。
HashSet集合存储数据的结构(哈希表)
jdk1.8之前:哈希表 = 数组+链表
jdk1.8之后:哈希表 = 数组+链表 哈希表 = 数组+红黑树(提高查询速度)
哈希表特点:速度快,初始化长度为16的数组。把元素进行分组,相同哈希值是一组,链表/红黑树结构把相同哈希值的元素连接到一起。
存储数据到集合中:
1.先计算元素的哈希值。
2.把哈希值放到初始化的数组中,做为键,把数据放到数组关联的链表里。
3.如果链表的长度超过了8位,就会把链表转换为红黑树。提高查询速度。
两个元素不同,哈希值相同,叫做哈希冲突。
Set集合不允许存重复元素。Set集合在调用add方法的时候,add方法会调用元素的hashcode方法和equals方法,判断元素是否重复。
使用hashset存储自定义类型元素,存储的元素必须重写hashCode方法和equals方法。
LinkedHashSet集合:具有可预知可迭代顺序的Set接口的哈希表和链接列表实现。其特点是:底层是一个哈希表(数组+链表/红黑树)+链表,多了一条链表,记录元素的存储顺序,保证元素有序。
可变参数:jdk1.5之后加入的:
格式:修饰符 返回值类型 方法名(参数类型... 形参名){}
等价于:修饰符 返回值类型 方法名(参数类型[] 形参名){}
使用前提:方法参数列表数据类型已经确定,但是参数个数不确定,可以使用可变参数。
可变参数原理:可变参数底层是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数,传递的参数个数,可以是0个,1,2。。。多个。
注意事项:1.一个方法的参数列表,只能有一个可变参数。
2.如果方法的参数有多个,那么可变参数必须写在参数列表的末尾。
Colletions工具类:
addAll(Collection<T> c,T... elements)往集合中添加多个元素
shuffle(List<?> list) 打乱集合元素顺序(纸牌类游戏,洗牌时经常用的方法)。
sort(List<T> list) 将集合中的元素按照默认的规则排序,默认是升序排序,前提是被排序的元素,必须实现Comparable,重写接口中compareTo()方法,定义排序规则。
Comparable接口的排序规则:
自己-参数:升序。参数-自己:降序。
sort(List<T> list,Comparator<? super T>) 将集合元素按照指定规则排序。相当于一个第三方裁判。
Comparator和Comparable区别:
Comparator方法是compare(T t,T t2),相当于找一个第三方裁判。
Comparable方法是compareTo,自己和别人比较。