首页 > 编程语言 > 详细

4.22Java自定义实现ArrayList底层

时间:2021-04-23 00:11:06      阅读:25      评论:0      收藏:0      [点我收藏+]

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方法
        */
  }
?
}
/*
这样就定义了一个最基本的数组
内容
长度
完成了一个简单的ArrayList实现代码
*/
//version 1.0
package com.MyCollection;
?
/**
* 自定义实现一个ArrayList,体会底层原理
* 有泛型版本
* @author Lucifer
*/
public class LcfArrayList02<E> {
?
   /*ArrayList底层有一个元素数组,用它来存储内容*/
   private Object[] elementData; //用来存储我们的内容的
?
   /*数组里面有多少元素---相当于计数器*/
   private int size;
?
   /*定义一个常量作为数组长度的默认长度*/
   private static final int DEFAULT_CAPACITY = 10;
?
   /*定义一个构造器,创建数组的时候给它默认长度*/
   public LcfArrayList02(){
       /*为数组新建对象*/
       elementData = new Object[DEFAULT_CAPACITY]; //将新建的Object对象赋值给Object数组名
       /*
       什么都不加上去的时候默认就是elementData
        */
  }
?
   /*第二个构造器像之前一样---传数字,封装方法*/
   public LcfArrayList02(int capacity){
       /*数组长度=传入的数值---定义了自己的一个小内容*/
       elementData = new Object[capacity];
  }
?
   /*给这个类加一个add方法---这是一个简单的add方法,不考虑复杂的情况*/
   public void add(E element){
       elementData[size++] = element; //传入的值赋给新元素索引自增
  }
?
   /*希望输出的结果可视化,重写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();
  }
   /*
   这样写返回的会是一个自己写的"[]"
   内容是插入的内容,如果该索引没有内容会返回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方法
        */
  }
?
}
//version 2.0

 

4.22Java自定义实现ArrayList底层

原文:https://www.cnblogs.com/JunkingBoy/p/14691031.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!