• 手写集合


     1 import java.util.Arrays;
     2 
     3 public class Demo_ArrayList2
     4 {
     5    public static void main(String[] args) 
     6    {
     7      MyArrayList2<String> my=new MyArrayList2();
     8      my.add("龙");
     9      my.add("只");
    10      my.add("谷");
    11      my.add("之");
    12      my.add("精");
    13      my.add("灵");
    14      my.add("王");
    15      my.add("座");
    16      
    17      System.out.println(my);
    18      my.get(4);
    19      System.out.println(my);
    20      System.out.println(my.size());
    21      my.set(1, "之");
    22      System.out.println(my);
    23     }
    24 }
    25 
    26 //手写集合
    27 //添加数据  移除数据  获取集合元素的长度  设置指定位置的值   获取数据  打印数据
    28 class MyArrayList2<T>
    29 {
    30     //创建一个Object数组
    31     private Object[]obj;
    32     //设置数组默认长度
    33     private  final int DEFAULT=10;
    34     //当前集合中存放的元素个数
    35     private int size=0;
    36     //有参构造函数初始化数组大小
    37     public MyArrayList2()
    38     {
    39         obj=new Object[DEFAULT];
    40     }
    41     public MyArrayList2(int capacity)
    42     {
    43         obj=new Object[capacity];
    44     }
    45              //元素打印
    46             //打印数据
    47             public String toString()
    48             {
    49                 //有多少个元素我们就打印多少个元素
    50                 return Arrays.toString(Arrays.copyOf(obj, size));
    51             }
    52     //添加数据
    53     public void add(T ele)
    54     {
    55         //判断是否需要扩容,如果需要扩容的时候没有扩容,会报数组越界异常
    56         ensureCapacityInternal(size);//假设现在已经存放了10个元素  size = 10(数组的长度)
    57         obj[size]=ele;
    58         size++;
    59     }
    60     //自动扩容
    61     private void ensureCapacityInternal(int size)
    62     {
    63         if(size>=obj.length)
    64         {
    65             //这个时候就需要扩容了
    66             //原来数组的长度
    67             int old=obj.length;
    68             //新数组长度
    69             int newr=old+(old>>1);
    70             obj=Arrays.copyOf(obj, newr);//Arrays是操作数组的工具类,且都是静态方法
    71         }
    72     }
    73             //根据下标获取数据
    74             @SuppressWarnings("unchecked")
    75             public T get(int index)
    76             {
    77                 return (T) obj[index];
    78             }
    79             //获取集合的长度
    80             public int size()
    81             {
    82                 return size;
    83             }
    84             //设置指定位置的值
    85             public void set(int index,T ele)
    86             {
    87                 obj[index]=ele;
    88             }
    89             //移除指定位置的值
    90             public void remove(int index)
    91             {
    92                 //创建一个数组和原数组一致
    93                 Object obj1[]=new Object[obj.length];
    94                 //把旧数组的元素移到新数组中
    95                 System.arraycopy(obj, 0, obj1, 0, index);
    96                 System.arraycopy(obj, index+1, obj1,index ,obj.length-(index+1));
    97             }
    98 }

    温馨小提示:public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

    src - 源数组。
    srcPos - 源数组中的起始位置。
    dest - 目标数组。
    destPos - 目标数据中的起始位置。

    length - 要复制的数组元素的数量。

    要复制的元素个数是不包括结束位置,比如要复制3个元素,只会复制下标为[0][1]

    移除数组的方法实质就是第二次复制的时候将新数组的copy的起始位置为要移除的元素位置,
    假如index为2,那么第一次会把[0][1]元素复制到新数组中,然后第二次复制的时候将下标为[3]之后的元素复制到新数组中,但是复制的起始位置就是下标为[2]的位置
    综上所诉,移除的实质就是覆盖.
  • 相关阅读:
    js对象的所有方法
    js数组的所有方法
    Scss语法
    new一个对象的过程
    promises的深入学习
    jsonp的原理介绍及Promise封装
    Vue页面缓存和不缓存的方法
    JavaScript数据类型
    JS常用函数原理的实现
    @Autowired注解在抽象类中实效的原因分析
  • 原文地址:https://www.cnblogs.com/zjm1999/p/10036965.html
Copyright © 2020-2023  润新知