数据结构&&集合总结

发布时间 2023-12-28 20:48:43作者: ZWJAS

总结

数据结构

  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底层 底层还是一个队列,还是一个栈