Java数据结构

数据结构

数据结构是计算机底层数据组织的方式,不同的组织方式特点不一样.



栈数据结构执行特点

先进后出



常见数据结构之队列

先进先出,后进后出

数据从后端进入队列模型 入队列

数据从前端出队列模型  出队列



常见数据结构之数组

查询速度快

删除效率低

添加效率低



链表结构

链表中的元素是在内存中不连续存在的,每个元素节点包含数据值和下一个元素的地址.

查询效率低

增删效率相对较高

双向链表

查询速度比单向链表快,可以双向查找

一个节点由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比较器对象,重写比较规则.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值