数据结构
常用的数据存储结构:栈,队列,数组,列表,红黑树。
栈:先进后出(入口和出口在用一侧)
队列:先进先出
数组:
查询快:因为数组的地址是连续的,通过数组的首地址找到数组中的元素。
增/删慢:因为数组的长度是固定的,增/删一个元素,需要创建一个新的数组
链表:
查询慢:链表中的地址不是连续的,每次查询都必须从头开始。
增/删快:链表结构增删一个元素对链表的整体结构没有影响。
链表的每一个元素也称为一个节点,每个节点包含一个数据源,两个指针域 |自己的地址|数据|下一个节点的地址|
单向链表:只有一条链子,不能保证元素的顺序
双向链表:有两条链子,有一条链子专门用来记录元素的顺序,是一个有序集合
红黑树:
二叉树:分支不能超过两个
排序树/查找树:在二叉树的基础上,元素有大小顺序,左子树小,右子树大
平衡树:左子树数量等于右子树数量
不平衡树:左子树数量与右子树数量不一样
红黑树:趋近与平衡树,查询速度快
约束:1.节点可以是红色或是黑色 2.根节点是黑色的 3.叶子节点是黑色的 4.每个红色节点的子节点都是黑色的 5.任何一个节点到齐每个叶子节点的所有路径上黑色系欸但数相同
List集合
Collectgion子类,有序,可重复,有索引
List接口中带索引的方法
创建List对象
List
add(index,element) 添加元素
remove(index) 删除元素,有返回值
set(index,element) 用指定元素替换指定位置的元素,返回替换元素
get(index) 获取指定位置元素
List的实现类
ArrayList集合(底层是一个数组)
查询快,增删慢
LinkedList集合(底层是一个链表)
查询慢,增删快
有大量操作首尾的方法:addFirst(),addLast().removeFirst(),removeLast(),getFirst(),getLast().
LinkedList集合有特用方法,所以不能用多态创建
LinkedList
Vector集合(底层是一个数组)
Set集合
HashSet实现类 (底层是一个哈希表结构)查询快
无须,不可重复,无索引
创建 Set
哈希值:一个十进制的整数,由系统随机给出(就是对象的地址是一个逻辑地址,是模拟出来的,不是数据存储的实际物理地址)
在Object类中有一个方法可以获取对象的哈希值 int hashCode() 返回对象的哈希码值
哈希表结构:数组+链表/红黑树(提高查询速度,当链表的个数大于8位时,用红黑树)
数组结构:把元素进行分组(相同的哈希值元素一组)
链表/红黑树结构:把相同哈希值连接到一起
Set集合中不允许有重复元素的原理
Set集合调用add方法时,会调用元素的hashCode方法和equals方法判断元素是否重复(先调用hashCode方法后调用equals方法)
HashSet存储自定义类型元素,存储的元素必须重写hashCode方法和equals方法
LinkedHashCode集合
底层是一个哈希表和链表,多了一条列表记录元素的存储顺序保证元素有序,有序,不可重复
可变参数:底层是一个数组
当方法的参数列表数据类型已确定,但是参数的个数不确定就可以使用可变参数
使用格式:修饰符 返回值类型 方法名(数据类型...变量名){}
使用:
定义一个初始化变量,遍历数组
注意事项:1.一个方法只能有一个可变参数 2.一个有多个参数列表时,可变参数要放在最后面
可变参数的特殊写法:修饰符 返回值类型 方法名(Object...obj){}
Collections工具类
addAll():一次性添加多个元素
shuffle():打乱集合顺序
sort():默认规则排序(升序)
sort(List
public?int?compare(String?o1,?String?o2)