zoukankan      html  css  js  c++  java
  • 4.22Java自定义实现ArrayList底层

    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

     

    It's a lonely road!!!
  • 相关阅读:
    HDU 3911 线段树区间合并
    Memcache启动&amp;存储原理&amp;集群
    剑指Offer面试题27(Java版):二叉搜索树与双向链表
    ORA-12514: TNS: 监听程序当前无法识别连接描写叙述符中请求的服务
    Java.Lang.NoSuchMethod 错误
    poj2524
    特征价格(Hedonic price)
    特征价格(Hedonic price)
    苏州之行
    苏州之行
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14691031.html
Copyright © 2011-2022 走看看