大佬教程收集整理的这篇文章主要介绍了4.22Java自定义实现ArrayList底层,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
目的:
练习、复习容器、复习之前的知识、练手敲更多的代码
简单的ArrayList底层实现代码:
package com.@H_552_1@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 @H_552_1@main(String[] args) { /*调用方法创建对象*/ LcfArrayList s1 = new LcfArrayList(20); //调用的时候就会创建一个默认数组,如果不传值就是默认的10 }}/*这样就定义了一个最基本的数组内容长度完成了一个简单的ArrayList实现代码 */
再简单的基础上加一些方法:
package com.@H_552_1@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 @H_552_1@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方法 */ }}/*