菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
94
0

4.22Java自定义实现ArrayList底层

原创
05/13 14:22
阅读数 14965

4.22Java自定义实现ArrayList底层

目的:

练习、复习容器、复习之前的知识、练手敲更多的代码

简单的ArrayList底层实现代码:

package com.MyCollection;

/**
* 自定义实现一个ArrayList,体会底层原理
* @author Lucifer
*/
public class LcfArrayList {

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

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

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

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

   /*第二个构造器像之前一样---传数字,封装方法*/
   public LcfArrayList(int capacity){
       /*数组长度=传入的数值---定义了自己的一个小内容*/
       elementData = new Object[capacity];
  }

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

}
/*
这样就定义了一个最基本的数组
内容
长度
完成了一个简单的ArrayList实现代码
*/

再简单的基础上加一些方法:

package com.MyCollection;

/**
* 自定义实现一个ArrayList,体会底层原理,无泛型版本
* @author Lucifer
*/
public class LcfArrayList {

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

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

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

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

   /*第二个构造器像之前一样---传数字,封装方法*/
   public LcfArrayList(int capacity){
       /*数组长度=传入的数值---定义了自己的一个小内容*/
       elementData = new Object[capacity];
  }

   /*给这个类加一个add方法---这是一个简单的add方法,不考虑复杂的情况*/
   public void add(Object obj){
       elementData[size++] = obj; //传入的值赋给新元素索引自增
  }

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

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

       return sb.toString();
  }
   /*
   这样写返回的会是一个自己写的"[]"
   内容是插入的内容,如果该索引没有内容会返回null
   如果该索引没有值不打印的话
   循环打印要改一下
   如果用append的话最后末尾会有个","
   所以采用替换的方法---setCharAt注意最后替换的是字符不是字符串---符号要选对
    */


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

       System.out.println(s1); //如果没有重写toString方法的话打印出的是类名+地址的hash值
       /*
       希望结果更加可视化一些
       通过重写toString方法来实现
       因为自建类的父类是Object---Object是根类,所以重写Object里面的toString方法
        */

发表评论

0/200
94 点赞
0 评论
收藏
为你推荐 换一批