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!!!
  • 相关阅读:
    Head First设计模式之观察者模式
    Head First设计模式之策略模式
    EF使用Fluent API配置映射关系
    js判断空字符串、null、undefined、空格、中文空格
    从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
    System.Data.SqlClient.SqlException: 数据类型 text 和 varchar 在 equal to 运算符中不兼容。
    Content-Type的几种常用数据编码格式
    如何通过Git GUI将自己本地的项目上传至Github
    微信小程序开发之模板
    获取图片的EXIF信息
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14691043.html
Copyright © 2011-2022 走看看