数据结构
数据结构是计算机底层数据组织的方式,不同的组织方式特点不一样.
栈数据结构执行特点
先进后出
常见数据结构之队列
先进先出,后进后出
数据从后端进入队列模型 入队列
数据从前端出队列模型 出队列
常见数据结构之数组
查询速度快
删除效率低
添加效率低
链表结构
链表中的元素是在内存中不连续存在的,每个元素节点包含数据值和下一个元素的地址.
查询效率低
增删效率相对较高
双向链表
查询速度比单向链表快,可以双向查找
一个节点由3个部分组成,一个表示元素值,一个表示下一个元素地址一个表示上一个节点地址
二叉树
只有一个根节点
节点的度
高度
层
兄弟节点
二叉查找树/二叉排序树/二叉搜索树
查找效率比较高
子节点,左小右大
平衡二叉树
要求:
任意节点的左右两个子数的高度不超过1
平衡二叉树在添加元素后可能不平衡
基本策略是 进行左旋,或者右旋保证平衡。
旋转的4种情况:左左,左右,右右,右左
红黑树
每一个节点可以说红色或者黑色.红黑树不是通过高度平衡的,它的平衡是通过“红黑规则”进行实现的。
红黑规则
每一个节点或是红色的,或者是黑色的,根节点必须是黑色。
如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)。
对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
红黑树不是高度平衡的
各种数据结构的特点和作用是什么样的
队列:先进先出,后进后出。
栈:后进先出,先进后出。
数组:内存连续区域,查询快,增删慢。
链表:元素是游离的,查询慢,首尾操作极快。
二叉树:永远只有一个根节点, 每个结点不超过2个子节点的树。
查找二叉树:小的左边,大的右边,但是可能树很高,查询性能变差。
平衡查找二叉树:让树的高度差不大于1,增删改查都提高了。
红黑树(就是基于红黑规则实现了自平衡的排序二叉树)
List系列集合特点
ArrayList、LinekdList :有序,可重复,有索引。
有序:存储和取出的元素顺序一致
有索引:可以通过索引操作元素
可重复:存储的元素可以重复
ArrayList集合底层原理
底层实现是基于数组实现的,根据索引定位元素快,增删需要做元素的移位操作;
第一次创建集合并添加第一个元素时,在底层创建一个索引为10的数组.
LinkedList底层通过链表实现的,查询慢增删快
public void addFirst(E e) 在该列表开头插入指定的元素
public void addLast(E e) 将指定的元素追加到此列表的末尾
public E getFirst() 返回此列表中的第一个元素
public E getLast() 返回此列表中的最后一个元素
public E removeFirst() 从此列表中删除并返回第一个元素
public E removeLast() 从此列表中删除并返回最后一个元素
泛型概述
JDK5引入的特性,泛型允许程序员在编写代码时使用以后才指定的类型(不确定的数据类型)
集合中使用泛型
Collection系列的每一个集合都支持泛型,把把元素类型交给调用者来指定.
什么是泛型:泛型其实就是一个不确定的数据类型,用<E>表示.
泛型的好处:
1在编译期间起到限定数据类型的作用.
2避免在运行期间产生强制类型转换异常(ClassCastException)
泛型类的概述
定义类时给类加上泛型
格式:public class 类名<泛型变量>{ }
在创建对象时确定类上的泛型
类名<String>对象名=new 类名<>
泛型方法的概述
在定义方法时给方法加上泛型
public static<T>void 方法名(T t){}
<T>数据类型,类型由调用者指定
调用方法,参数值是什么类型,定义在方法上的泛型就是什么类型
泛型方法的格式:修饰符 <泛型变量> 方法返回值 方法名称(形参列表){}
泛型接口的概述
在定义接口时给1接口用上了泛型
public interface 接口名<E>{
public coid 方法名(E e);}
//接口需要被类实现,如果接口上有泛型,可以在实现类上对泛型进行确定
public class类名 implements 接口<String>{
public void 方法名(String e){
//....
}
}
泛型接口的格式:修饰符 interface 接口名称<泛型变量>{}
泛型接口可以让实现类选择当前功能需要操作的数据类型
通配符
?它表示泛型的具体类型是任意类型
?extends类型: ?必须是指定类型或者其子类 泛型上限
?super类型: ?必须是Car或者其父类 泛型下限
Set系列集合特点:
无序,无索引,不重复
Set实现类特点:
HashSet无序,不重复,无索引
LinkedHashSet有序,不重复,无索引
TreeSet按照大小默认升序排序,不重复,无索引.
HashSet底层原理
HashSet集合底层采取哈希表存储的数据
哈希表是一种对于增删改查数据性能都较好的结构。
哈希表的组成
JDK8之前的,底层使用数组+链表组成
JDK8开始后,底层采用数组+链表+红黑树组成。
如果要保证元素唯一,复写hashCode和equals方法,复写后属性值相同就认为元素相同.
哈希值:是JDK根据对象的地址,按照某种规则算出来的int类型的数值
HashSet 数组+链表+(结合哈希算法)
结论:哈希表是一种对于增删改查数据性能都比较好的结构.
创建一个默认长度16的数组,数组名table
根据元素的哈希值跟数组的长度求余计算出应存入的位置(哈希算法)
判断当前位置是否为null,如果是null直接存入
如果位置不为null,表示有元素,则调用equals方法比较
如果一样,则不存,如果不一样,则存入数组,
JDK 7新元素占老元素位置,指向老元素(头插法)
JDK 8中新元素挂在老元素下面(尾插法)
当挂在元素下面的数据过多时,查询性能降低,从JDK8开始后,当链表长度超过8的时候,自动转换为红黑树。
Set集合的底层原理是什么样的
JDK8之前的,哈希表:底层使用数组+链表组成
JDK8开始后,哈希表:底层采用数组+链表+红黑树组成。
LinkedHashSet集合概述和特点
有序、不重复、无索引。
这里的有序指的是保证存储和取出的元素顺序一致
原理:底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序。
TreeSet集合概述和特点:
不重复、无索引、可排序
可排序:按照元素的大小默认升序(有小到大)排序。
TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
注意:TreeSet集合是一定给元素指定排序规则。
默认的规则:
对于数值类型:Integer,Double,官方默认按照大小进行升序排序.
对于字符串类型:默认按照首字符的编号升序排序。
对于自定义类型如Student对象,TreeSet无法直接排序。
结论:想要使用TreeSet存储自定义类型,需要制定排序规则/.
TreeSet集合存储对象的的时候有2种方式可以设计自定义比较规则
方式一
让自定义的类(如学生类)实现Comparable接口重写里面的compareTo方法来定制比较规则。
方式二
TreeSet集合有参数构造器,可以设置Comparator接口对应的比较器对象,来定制比较规则。
两种方式中,关于返回值的规则:
如果添加的元素比集合中已有的元素大,则返回整数。
如果添加的元素比集合中已有元素小,则返回负数。
如果添加的元素和集合中已有元素相等,则返回0,此时认为元素重复,不存。
注意:如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序.
TreeSet集合的特点是?
1可排序,不重复,无索引
2底层基于红黑树实现排序,增删改查性能比较好
TreeSet集合自定义排序规则有几种方式
2种
类实现Comparable接口,重写比较规则
集合自定义Comparator比较器对象,重写比较规则.
Java数据结构
最新推荐文章于 2023-02-07 11:16:24 发布