首页 > 其他分享 >数据结构&&集合总结

数据结构&&集合总结

时间:2023-12-28 20:58:10浏览次数:33  
标签:ArrayList list System println add && 集合 数据结构 out

总结

数据结构

  1. 数据结构:保存数据的一种方式

  2. 常见的数据结构

    • 通过数组来保存,基于数组的数据结构(动态数组,长度可变的数组)
      基于数组的结构的优缺点

      ​		1.通过下标查询元素,效率高
      
      ​		2.通过下标修改元素,效率高
      ​		**查改快**
      
      ​		在需要扩容的时候:添加慢,删除慢,插入元素慢
      ​		**增删插慢**
      
      ```java
      /**
       * 模拟一个动态数组
       */
      public class MyArrayList {
      
          private Object[] values; // 保存任意类型的数据
          private int size; // 数组有效元素的个数
      
          public MyArrayList(){
              this(10);
          }
          public MyArrayList(int initSize) {
              values = new Object[initSize];
          }
      
          private void grow() {
              // 计算扩容的长度:1.5
              int len = values.length + (values.length >> 1);
              values = Arrays.copyOf(values,len);
          }
      
          public  void add(Object element) {
              // 多参数进行判断
              if(element == null)
                  throw new IllegalArgumentException("非法参数,参数不能为null");
              if(size == values.length)
                  grow();
              values[size++] = element;
          }
      
          @Override
          public String toString() {
              StringBuilder sb = new StringBuilder();
              for (int i = 0; i < size; i++) {
                  sb.append(values[i]).append("\t");
              }
              return sb.toString();
          }
      
          public static void main(String[] args) {
              MyArrayList list = new MyArrayList();
              list.add(true);
              list.add(1);
              list.add("sdafdsf");
              list.add(3.14);
              list.add(true);
              System.out.println(list);
          }
      }
      ```
      
    • 通过一个对象变量来保存数据,基于变量保存数据的结构称为链表结构
      增删插快
      查改慢

      /**
       * 模拟一个基于链表的结构
       */
      public class MyLinkedList {
          private Node head; // 链表头部
          private Node footer; // 尾部
          public void add(Object o) {
              if(head == null) {
                  head.val = o;
                  footer = new Node(o);
              }else {
                  footer = new Node(o);
              }
          }
      
      
          static class Node { // 声明的一个内部类
              private Object val;
              private Node next; // 装下一个对象,形成链条
      
      
          }
      }
      
    • 队列
      单向队列:一个是进口,一个是出口,先进先出(FIFO)
      双向队列:两端既是进口又是出口

    • 栈结构:只有一个口,既是进口也是出口
      先进后出:FILO(后进先出:LIFO)

    • 树形结构:是链表的一种变形结构

集合

集合:基于某种数据结构的容器

了解集合的体系结构:

Collection:集合的根接口(父接口):定义方法的标准

​ 第一个子接口:list:可以存放重复元素,而且有序(有序:存入的顺序和取出来的顺序 一致(存取一致)),有序可重复

/**
* 使用接口的实现类
*/
class ArrayList implements List {

}
abstract class AbstractList implements List {
    将list里面所有的抽象方法实现了
}
class ArrayList extends AbstractList implements List {
       // 想重写那个就从哪个
}

​ List接口的实现子类:

​ ArrayList:基于数组的集合(线程不安全)
​ LinkedList:基于链表的集合
​ Vector:基于数组的集合(线程安全)

​ 第二子接口:set:不能存放相同的元素(去重),无序(存取不一致),无序不可重复

List接口的实现类

  • ArrayList:基于数组的集合

    /**
     * 讲解实现List接口的实现类
     *  ArrayList:基于数组的集合
     */
    public class ListDemo2 {
        public static void main(String[] args) {
            // 创建ArrayList的对象
            ArrayList list = new ArrayList(); // 基于数组的集合
            // 常用方法
            // add(Object e) add(index,e)
            list.add(true); // 第一次添加的时候
            list.add(3.14);
            list.add("磊哥不行了");
            list.add(true);
            list.add('a');
            list.add(0,'a');
            System.out.println(list);
            System.out.println(list.size());
    
            ArrayList list2 = new ArrayList(20);
            list2.add(list); // 将集合作为一个值添加到集合
            list2.add("蘋蘋");
            list2.addAll(0,list); // 将list集合里面元素一个一个添加list2里面
            System.out.println(list2);
            System.out.println(list2.size());
    
            // contains(Object o): 判断集合中是否存在该对象
            System.out.println(list.contains(false));
    
            // get(int index):通过指定下标获取对象
            System.out.println(list.get(0));
    
            // indexOf(Object o) :查询对象在集合中第一次出现位置
            System.out.println(list.indexOf('a'));
    
            // lastIndexOf(Object o)
            System.out.println(list.lastIndexOf('a'));
    
            // remove(int index) :通过下标删除指定对象
            list.remove(0);
            list.add(1);
            System.out.println(list);
            //  remove(Object o) :删除指定对象
            Integer i = 1;
            list.remove(i);
    
            ArrayList list3 = new ArrayList();
            list3.add(true);
            list3.add(3.14);
    
            list.removeAll(list3);
            System.out.println(list);
    
            // set(int index, E element)
            list.set(0,"3254354");
            System.out.println(list);
        }
    }
    
  • ArrayList集合的遍历

    public class ListDemo3 {
        public static void main(String[] args) {
            ArrayList list = new ArrayList();
            list.add("abc");
            list.add("bbc");
            list.add("cbc");
            list.add("dbc");
            list.add("ebc");
            // 遍历第一种方式:循环(for)
    //        for (int i = 0; i < list.size(); i++) {
    //            System.out.println(list.get(i));
    //        }
    //        System.out.println("============================");
    //        for (int i = list.size() - 1; i >= 0; i--) {
    //            System.out.println(list.get(i));
    //        }
            // 遍历第二种方式:foreach
    //        for (Object o : list) {
    //            System.out.println(o);
    //        }
    
            // 遍历集合的第三种方式:迭代器
            // 单向迭代器:只能从第一个元素到最后一个元素:iterator() 
    //        Iterator it = list.iterator();// 获取遍历list集合的迭代器
    //        boolean b = it.hasNext();
    //        System.out.println(b);
    //        Object o = it.next();
    //        System.out.println(o);
    //        boolean b1 = it.hasNext();
    //        System.out.println(b1);
    //        Object o1 = it.next();
    //        System.out.println(o1);
    //        while (it.hasNext()) {
    //            System.out.println(it.next());
    //        }
    
            // 双向迭代器 listIterator()
    //        ListIterator li = list.listIterator();
    //        while (li.hasNext()) {
    //            System.out.println(li.next());
    //        }
    //        System.out.println("===========================");
    //        while (li.hasPrevious()) {
    //            System.out.println(li.previous());
    //        }
            ListIterator li = list.listIterator(2);
            while (li.hasPrevious()) {
                System.out.println(li.previous());
            }
    
        }
    }
    
  • LinkedList:基于链表的集合

    public class ListDemo4 {
        public static void main(String[] args) {
            // 创建LinkedList对象
            LinkedList list = new LinkedList();
            list.add(3.14);
            list.add(3.14);
            list.add(3.1415);
            list.add(3.1415926);
            list.add(3.149999);
            list.add(0,9999999);
            System.out.println(list);
    
            System.out.println(list.get(0));
            Iterator it = list.iterator();
            ArrayList集合的遍历
    /**
     *  LinkedList集合的遍历
     */
            while (it.hasNext()) {
                System.out.println(it.next());
            }
            System.out.println("======================");
            ListIterator li = list.listIterator(list.size());
            while (li.hasPrevious()) {
                System.out.println(li.previous());
            }
        }
    }
    
  • Linked实现的队列(双向队列)

    public class ListDemo5 {
        public static void main(String[] args) {
            LinkedList list = new LinkedList();
            // 在头尾操作的方法
            list.addFirst("aaa");
            list.addLast("bbb");
            list.add("cccc");
    //        System.out.println(list.getFirst());
    //        System.out.println(list.getLast());
    ////        list.removeFirst();
    //        list.removeLast();
    //        System.out.println(list);
    
            // element()
            System.out.println(list);
            System.out.println(list.element());
            // offer(E e)
            list.offer("dddd");
    
            list.offerFirst("蘋蘋");
            list.offerLast("辰辰");
    
            // peek()
    //        System.out.println(list.peek());
            // poll
            System.out.println(list.poll());
            System.out.println(list.pollFirst());
            System.out.println(list.pollLast());
    
            System.out.println(list);
    
    
        }
    }
    
  • LinkedList栈结构

    栈的特征:FILO(先进后出)

    public class ListDemo6 {
        public static void main(String[] args) {
            LinkedList list = new LinkedList();
            // push(e):压栈,将对象放入栈内存
            list.push("a");
            list.push("b");
            list.push("c");
            System.out.println(list);
            // pop():出栈,将栈里面对象取出
            System.out.println(list.pop());
            System.out.println(list);
    
        }
    }
    
  • 讲解ArrayList和LinkedList的使用场景

    • 底层结构不同
      • ArrayList底层是数组:查改性能好,增删插性能差
      • LinkedList底层是一个双向链表,增删插性能好,查改性能差
        LinkedList底层 底层还是一个队列,还是一个栈

标签:ArrayList,list,System,println,add,&&,集合,数据结构,out
From: https://www.cnblogs.com/JunYuanStudy/p/17933549.html

相关文章

  • set集合&&hashMap总结
    总结实现set接口的集合set集合:无序不重复不重复(去重):元素放入集合之前或做判断无序:存取不一致1、讲解set的实现类HashSet:底层使用哈希表来实现(底层是一个数组,数组里面保存一个单向链表)的集合不允许元素重复,元素是无序的HashSet的去重机制(怎么去除重复)第一步:将要添加到H......
  • 【数据结构】C语言实现单链表的基本操作
    单链表基本操作的实现导言大家好,很高兴又和大家见面啦!!!在上一篇中,我们详细介绍了单链表的两种创建方式——头插法与尾插法,相信大家现在对这两种方式都已经掌握了。今天咱们将继续介绍单链表的基本操作——查找、插入与删除。在开始今天的内容之前,我们先通过尾插法创建一个单链表,如......
  • 哈希集合、哈希表的拉链法实现
    哈希表705.设计哈希集合//拉链法structListNode{intval;structListNode*next;};typedefstruct{structListNode*data;}MyHashSet;//模constinthashSize=1009;MyHashSet*myHashSetCreate(){MyHashSet*myHashSet=(MyHashSet......
  • Java的集合
    一.Java集合框架概述    一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java集合就像一种容器,可以动态的把多个对象的引用放入容器中。1.数组Array存储(1)数组在内存存储方面的特......
  • 24-集合(主要介绍ArrayList)
    ArrayList长度可变的原理1)当创建ArrayList集合容器的时候,底层会存在一个长度为10哥大小的空数组2)当容器的大小不满足时,创建(扩容)原数组1.5倍大小的新数组3)将原数组数据,拷贝到新数组中4)将新元素添加到新数组 ArrayList集合的构造方法1)publicArrayList():创建一个空的集......
  • 数据结构之<树>的介绍
    树的基本概念在数据结构中,树(Tree)是一种层次结构,由节点和边组成。树的基本概念包括根节点、子节点、父节点、兄弟节点等。节点拥有零个或多个子节点,除了根节点外,每个节点有且仅有一个父节点。树的层数称为树的高度。子节点以及它后续节点所形成的数称为子树。1.二叉树(BinaryTree)二......
  • 代码整洁之道:格式、对象和数据结构、错误处理
    来源:博客园(作者-BNDong)格式格式目的代码格式不可忽略,必须严肃对待。代码格式关乎沟通,而沟通是专业开发者的头等大事。(每种语言基本都有它自己的推荐标准,比如PHP的PSR代码规范,对格式做了详细的定义)垂直格式单文件。书中的建议是,单文件的代码量不易过大。短文件通常比长......
  • 【数据结构】第二章——线性表(5)
    单链表的创建导言大家好,很高兴又和大家见面啦!!!在上个章节中,咱们介绍了单链表的基本概念,以及如果初始化带头结点的单链表与不带头结点的单链表,相信大家现在对这一块内容都是比较熟悉的了。下面我们先来一起回顾一下单链表的初始化,为了方便理解,这里我们还是通过数据域为整型且带有头......
  • 【C语言数据结构】对Lua Table源码的一次劣质学习
    /*new_key*/KLcBoolKLcmCreateMapKeyValue(KLCMAP_PTRpTag,KLCTVALUE_PTRpKv){ KLcBoolkbRet =KL_FALSE; KLcBoolkbIsKvLegal =KL_FALSE; DWORDdwInsertPos =0; DWORDdwFreePos =0; DWORDdwCollisionPos =0; KLCTVALUE_PTRptMainNo......
  • 2017 - 951 数据结构
    题目一、单项选择题1.算法能识别出错误的输入数据并进行适当的处理和反应,称为算法的(①)。A.健壮性          B.正确性            C.并行性         D.时间复杂度2.从一个具有n个结点的单链表中查找其值等于x的结点时,在查找成功的......