zoukankan      html  css  js  c++  java
  • 数据结构(java)

    数据结构
    1.什么是数据结构?数据结构有哪些?
    数据结构是指数据在内存中存放的机制。
    不同的数据结构在数据的查询,增删该的情况下性能是不一样的。
    数据结构是可以模拟业务场景。
    常见的数据结构有:栈,队列,数组,链表。
    (1)栈:先进后出(后进先出) First In Last Out(FILO)
    (2)队列:先进先出(后进后出) First In First Out(FIFO)
    (3)数组:
    增删慢:每次增删元素时需要创建新的数组,需要拷贝大量的数组元素。
    查询快:可以直接根据索引获得对应的元素。
    查询快的根本原因是因为数组是块连续的内存区域。
    (4)链表(双链表)
    链表的数据是游离在内存区域中的。
    增删快:每次增删元素不需要移动元素位置,只需要修改上一个元素记住下一个元素的地址值。
    查询慢:每次查询元素都需要从链表头或链表尾部开始遍历查询。
    索引决定了是从链表头还是链表尾部开始查询
    如果索引大于等于元素个数的一半,从链表尾部开始查询,否则从链表头开始查询。
    链表的元素是游离的,计算机底层只能一个一个的去找元素。
    (5)红黑树(二叉树):一般用于做排序存储。
    只有一个根节点。
    每个节点至多有两个元素。
    LinkedList集合

    LikedList也是List集合的实现类。
    实现了List接口
    特点 : 有序 (存取顺序一致),有索引,元素可重复
    底层是双链表结构,查询慢,增删快,线程不安全的,效率高。
    双链表很容易拿到头尾元素的位置,所以对头尾元素的操作速度最快。

    LinkedList独有的方法:
    LinkedList<引用数据类型> list= new LinkedList( );
    list.addFirst(E e): 将元素添加到链表头
    list. addLast(E e): 将元素添加到链表尾部
    list. getFirst(): 获得链表头元素
    list. getLast(): 获得链表尾部元素
    list. removeFirst(): 删除链表头元素
    list. removeLast(): 删除链表尾部元素
    总结:
    如果需要执行大量的增删操作,则选择LinkedList
    如果不需要执行增删操作,而是查询操作,则选择ArrayList
    其实开发用的最多的还是ArrayList,一般业务都是查询居多!

    Set系列集合
    1.特点:元素是无序不重复的。
    两个实现类
    (1): HashSet(实现类,元素是无序不重复的)
    (2): LinkedHashSet(实现类,元素是有序不重复的)

    2. 为什么Set集合可以去掉集合中的重复元素?
    -- 对于基本数据类型,集合直接判断值是否相等,相等就去掉重复的元素。
    -- 对于引用数据类型,集合默认是先调用元素对象的hashCode()方法
    判断两个对象的堆内存地址是否相等。
    (hashCode()方法是Object类的方法,所以一切对象都可以使用这个方法)
    如果相等,集合会继续调用对象的equals与另一个对象比较,如果相等,认为两个元素重复了。
    如果不相等,认为两个元素 不重复。

    集合判断引用对象是否重复的流程
    先调用两个对象的 hashCode()方法返回的哈希值是否相等(所谓的对象的内存地址)
    /
    true(相等) false(不相等)
    /
    集合会继续调用两个对象的equals比较 不重复*
    /
    true false
    /
    重复 不重复

    开发通常需要重写hashCode()方法,和equals方法给集合指定重复规则!!
    以便让集合按照我们自己的规则把重复的元素自动去掉!!

    (1).HashSet集合
    HashSet底层也是基于一个数组实现的。
    HashSet元素的存储是采用了哈希表机制来存储的。
    HashSet集合无序的根本原因:是因为它是基于哈希表存储元素的。
    什么是哈希表:哈希表是一种数据结构.

    (2).LinkedHashSet集合
    有序不重复的。
    哈希表+链表的,为每个元素的添加做了一个链,以便记录添加顺序
    有序不重复。
    总结:
    ArrayList集合:基于数组(有索引,可重复,有序的)
    查询快,增删慢,查询业务多的使用这个。
    LinkedList:基于链表
    查询慢,增删快 查询业务少,增删业务多的情况下使用这个。
    HashSet集合:
    HashSet:底层是哈希表(JDK1.8之后:数组+链表+红黑树,JDK1.8之前:数组+链表)
    增删和查询都比较快。
    LinkedHashSet集合:
    为每个元素的添加做了一个链,以便记录添加顺序
    增删和查询都比较快。
    可变参数
    1.什么是可变参数
    在 Java 5 中提供了变长参数,允许在调用方法时传入不定长度的参数
    用法:
    public static void 方法名(数据类型...变量名){
    }
    注意点:可变参数实际上就是一个数组。
    可变参数传输:
    (1)不传输参数。
    (2)可以列举若干个参数传输
    (3)直接传输一个数组。
    (4)不能接受集合
    (5)可变参数只能放在形参列表的最后面
    (6)一个形参列表中只能有一个可变参数。
    Collections集合工具类
    1.什么是集合工具类?
    Collections和集合没有任何关系,而是用来操作集合的
    2.功能
    将数组中的所有元素添加到指定的集合中。
    addAll(Collection<T> c, T... elements)
    shuffle(List<?> list) :将集合中的元素乱序。
    *注意:只能打乱List系列集合,原因是只有List是有序的。
    sort(List<T> list) 将集合中的元素排序,默认是升序排序。
    有序:指的是添加顺序
    排序:指的是大小顺序
    注意:只能对List集合进行排序。
    基本数据类型sort方法可以自动进行升序排序。 (基本数据类型本身就有大小属性)
    引用数据类型sort方法默认搞不定!!(没有大小属性,不清楚大小属性)
    引用数据类型应该使用如下方法进行排序:
    参数一:被排序的集合
    参数二: 比较器(程序员自定制定的比较规则)
    sort(List<T> list, Comparator<? super T> c)
    Collections.sort(list集合名, new Comparator<数据类型>() {
    }

  • 相关阅读:
    C#异常断电后重新启动项目出现配置未初始化错误
    TFS: 解决The build agent error
    删除TFS中的项目
    将现有项目添加到TFS中
    Typora开启行内公式
    Markdown上下标内容多于一项
    小甲鱼python基础教程飞机大战源码及素材
    Git 将本地库添加到远程仓库
    C# float与UInt16互转
    C++的重载流输出运算符
  • 原文地址:https://www.cnblogs.com/flzidea/p/10107326.html
Copyright © 2011-2022 走看看