zoukankan      html  css  js  c++  java
  • 4.22Java自定义ArrayList底层+set/get方法和数组的边界检查

    4.22Java自定义ArrayList底层+set/get方法和数组的边界检查

    实例:

    package com.MyCollection;

    /**
    * 增加set和get方法---先写方法---定义访问修饰符、返回值、方法名、形参
    * 再进行索引的合法判断
    * 增加:数组边界的检查
    * @author Lucifer
    */
    public class LcfArrayList04<E> {

       /*ArrayList底层有一个元素数组,用它来存储内容*/
       private Object[] elementData; //用来存储我们的内容的

       /*数组里面有多少元素---相当于计数器*/
       private int size;

       /*定义一个常量作为数组长度的默认长度*/
       private static final int DEFAULT_CAPACITY = 10;

       /*定义一个构造器,创建数组的时候给它默认长度*/
       public LcfArrayList04(){
           /*为数组新建对象*/
           elementData = new Object[DEFAULT_CAPACITY]; //将新建的Object对象赋值给Object数组名
      }

       /*第二个构造器像之前一样---传数字,封装方法*/
       public LcfArrayList04(int capacity){
           /*检查一下不能传负数*/
           if (capacity < 0){
               /*抛出异常*/
               throw new RuntimeException("容器容量不能为0");
          }else if (capacity == 0){
               /*默认创建一个容量为10的数组*/
               elementData = new Object[DEFAULT_CAPACITY]; //将新建的Object对象赋值给Object数组名
          }else {
               /*数组长度=传入的数值---定义了自己的一个小内容*/
               elementData = new Object[capacity];
          }
      }

       /*给add方法添加扩容操作*/
       public void add(E element){
           /*当siz长度==elementData的时候就需要扩容了---判断*/
           if (size == elementData.length){
               /*扩容的方法---定义一个更大的数组*/
               //采用源码当中的扩容方法
               Object[] newArray = new Object[elementData.length + (elementData.length >> 1)]; //这里计算的时候会有优先级问题,先算移位算法。如果不括起来JVM会先算前面的加法
               //将原来的数组的值拷贝给新的扩容的数组
               System.arraycopy(elementData,0,newArray,0,elementData.length);
               /*再将老数组对象内容赋值给原来的数组元素代替值,让JVM回收掉老数组对象内容---重新指向新的数组对象*/
               elementData = newArray;
          }
           elementData[size++] = element; //传入的值赋给新元素索引自增
      }

       /*增加一个get方法---访问修饰符、返回值、方法名、形参*/
       /*
       1.先写出方法---定义返回值、形参、方法名、修饰符等
       2.判断索引是否合法
        */
       public E get(int index){

           /*运行时先判断*/
           checkRange(index);

           return (E)elementData[index]; //转型+索引下标
      }

       /*增加一个set方法---访问修饰符、返回值(有、无)、方法名、形参*/
       public void set(E element, int index){

           checkRange(index);

           /*往里设置一个内容---核心代码*/
           elementData[index] = element; //传入的形参赋值给带索引的数组的索引、下标自增
      }

       /*因为get和set方法都需要判断,所以把合法判断变成方法封装起来,再get和set方法调用之前先运行该方法进行判断*/
       public void checkRange(int index){
           /*索引合法判断,找到索引的合法区间:[0,size)左闭右开*/
           if (index < 0 || index > size - 1){
               //不合法---处理办法:手动抛出一个异常,抛出异常要进行处理
               throw new RuntimeException("索引不合法" + index);
          }
      }

       /*希望输出的结果可视化,重写toString方法*/
       @Override
       public String toString(){
           // TODO Auto-generated method stub
           StringBuilder sb = new StringBuilder();

           //打印出类似[a,b,c]的形式
           sb.append("[");
           for (int i = 0; i < size; i++){
               sb.append(elementData[i] + ",");
          }
           sb.setCharAt(sb.length()-1,']');

           return sb.toString();
      }

       /*在main方法当中做测试*/
       public static void main(String[] args) {
           /*调用方法创建对象*/
    //       LcfArrayList03<String> s1 = new LcfArrayList03<>(20); //调用的时候就会创建一个默认数组,如果不传值就是默认的10
           LcfArrayList04 s1 = new LcfArrayList04();

           for (int i = 0; i < 40; i++){
               s1.add("Harden" + i);
          }
           s1.set("Lucifer",10);

           System.out.println(s1); //如果没有重写toString方法的话打印出的是类名+地址的hash值

           System.out.println(s1.get(39));
      }
    }

     

     

    It's a lonely road!!!
  • 相关阅读:
    D. Constructing the Array
    B. Navigation System
    B. Dreamoon Likes Sequences
    A. Linova and Kingdom
    G. Special Permutation
    B. Xenia and Colorful Gems
    Firetrucks Are Red
    java getInstance()的使用
    java 静态代理和动态代理
    java 类加载机制和反射机制
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14691043.html
Copyright © 2011-2022 走看看