自定义容器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义容器相关的知识,希望对你有一定的参考价值。

自定义容器

基于数组的IntArrayList

自定义容器类,目标希望:

  1. 可以存储任意多个数据
  2. 可以存储任意数据类型
    具体实现:
    • 定义一个容器类IntArray
    • 创建一个存放数据的数组,比如int[] arr = new int[10];
    • 定义一个add方法,用于添加数据
    • 创建容器对象,调用add方法,添加元素

      代码实现

**IntArray.java

import java.util.Arrays;
public class IntArray {
        private Object[] data;
        private int size;
        public IntArray() {
              this(6);//默认创建6个长度的数组
        }
        public IntArray(int len) {
              data = new Object[len];
        }
        /*
        add方法
        */
        public void add(Object obj) {
              if(size >= data.length) {//判断是否越界,如果越界则扩容
                          Object dataPlus = new Object[size+20];
                          System.arraycopy(data,0,dataPlus,0,size);
                          data = dataPlus;
              }
              data[size++] = obj;
        }
        //getLength 获取容器长度
        public int getLength() {
              return size;
        }
        //找到一个元素第一次出现的位置
        public int getIndexByElement(Object obj) {
              for(int i = 0; i < size; i++) {
                          if(data[i].equals(obj)) {
                                      return i;
                          }
              }
              return -1;
        }
        //找到指定下标的元素
        public Object getElementByIndex(int index) {
              if(index >=size) {
                        throw new ArrayIndexOutOfBoundsException();
              }
              return data[index];
        }
        //删除指定下标元素
        public void delElementByIndex(int index) {
              if(index >= size) {
                      throw new ArrayIndexOutOfBoundsException();
              }
              System.arraycopy(data, index+1, data, index, size-index-1);
              size--;
        }
        //删除指定元素
        public void delElementByElement(Object obj) {
              int indexByElement = getIndexByElement(obj);
              delElementByIndex(indexByElement);
    }
        //toString
        public String toString() {
              Object arr = new Object[size];
              Systen.arraycopy(data,0,arr,0;size);
              return Arrays.toString(arr);
        }
}
基于变量的LinkedList

****LikedList.java

public class LikedList {
      Node first;//头结点
      Node last;//尾节点
      int size;
      public void add(Object obj) {
          Node node = new Node(obj);
          if(first == null) {
              first = node;
              last = node;
          }/*else {
            Node temp = first;
            while(temp.next != null) {//判断寻找尾节点
                temp = temp.next;   //如果该节点不为空,则移到下一节点继续判断
            }
            temp.next = node;           //找到尾节点,直接指向下一节点node
        }*/
          last.next = node;
          last = node;
          size++;
    }

    @Override
    public String toString() {
          StringBuffer sb = new StringBuffer();
          Node temp = first;
          sb.append("[");
          while(temp != null) {
              if(temp.next != null) {
                  sb.append(temp.data).append(", ");
              }else {
                  sb.append(temp.data);
              }
                temp = temp.next;
           }
          sb.append("]");
          return sb.toString();
    }

    private class Node {
          Object data;//用于存放数据
          Node next;//用于存放下一个节点地址值
          public Node(Object data) {
                this.data = data;
          }

     }
}

数组与链表的优缺点相信也是有所了解的:

数组:适用于查询、排序等业务情况。连续存储
链表:适用于频繁增删改的业务情况。不连续存储

以上是关于自定义容器的主要内容,如果未能解决你的问题,请参考以下文章

STL容器自定义内存分配器

VSCode自定义代码片段——CSS选择器

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段(vue主模板)

VSCode自定义代码片段——声明函数

VSCode自定义代码片段——.vue文件的模板