_数组_模拟ArrayList容器的底层实现_JDK源码分析ArrayList
_数组_模拟ArrayList容器的底层实现_JDK源码分析ArrayList
容器里面很多实现都是数组。
ArrayList数组这一章的练习,也可以了解容器
package cn.bjsxt.myCollection;
public class Human {
// 定义一个变量成员name private私有的
private String name;
// 创建构造方法,将局部变量name指向成员变量name
// 单击右击选择Source再选择Generate Constructor using Fields然后 Generate
public Human(String name) {
// super();
this.name = name;
}
// 单击右击选择Source再选择Generate Getters and Setters然后 Generate
// 获取姓名
public String getName() {
return name;
}
// 修改姓名
public void setName(String name) {
this.name=name;
}
}
package cn.bjsxt.myCollection;
//import java.util.ArrayList;
/**
* 模拟实现JDK中提供的ArrayList类
* @author 神奇的梦
* 最重要的是创意
* 写代码按照思维写,一个一个改
*/
public class MyArrayList {
// StringBuilder s;
// 创造一个容器,装 各种各样的框
/**
* The value is used for Object storage.
* 该值用于对象存储。
*/
private Object[] value;
/**
* The size is the number of objects used.
* 计数是使用的对象数。
*/
private int size;
// 需要构造器了 容器也是对象
public MyArrayList() {
// value = new Object[16];
// 这里的this可以调另一个构造器
this(10);
}
public MyArrayList(int size) {
// value=new Object[size];
if(size<0) {
// 程序里面一定不能出现不可预测结果,必须是可预见的
// 在这里丢一个异常出去,这样程序就停在这里了
try {
// 手动抛出一个异常。讲到异常章节再说,先混个眼熟
throw new Exception();
}
catch(Exception e) {
e.printStackTrace();
}
}
// new出一个Object类型的数组对象下标为size
value = new Object[size];
}
// 来一个方法,方便调用
public int size() {
return size;
}
// isEmpty() 方法用于判断动态数组是否为空。
public boolean isEmpty() {
// 计数是使用的对象数等不等于0 ,是否为空
return size == 0;
}
/*
// contains 数组对象里面是不是包含这个对象
public boolean contains(Object o) {
// indexOf某一个对象是不是属于我list这个对象
return indexOf(o) >= 0;
}
*/
// 给容器里面丢东西
public void add(Object obj) {
value[size] = obj;
size++;
// 判断对象的长度size 大于等于 对象存储长度value。length我们的所有范围是0~length-1
if(size >= value.length) {
//装不下了,扩容吧
// 老容量 对象存储长度value.length*2
int newCapacity = value.length*2;
// new一个新容量 计数时使用的对象数为newCapacity
Object[] newList = new Object[newCapacity];
// 拷贝数组 把老容器里面的东西考进来
// System.arraycopy(newList, newCapacity, obj, newCapacity, newCapacity);
// value = newList;
// value.length也行size也行
// i++以此递增
for(int i=0;i<size;i++) {
// 这样就挨个堆进去了 把Objext里面的老数组 加到新数组里面
newList[i] = value[i];
}
value = newList;
}
}
// 我们要写通用,什么都能往里丢,所以只能是Object了
public Object get(int index) {
// index数组范围在{0,size-1}
if(index<0||index>size-1) {
// 程序里面一定不能出现不可预测结果,必须是可预见的
// 在这里丢一个异常出去,这样程序就停在这里了
try {
// 手动抛出一个异常。讲到异常章节再说,先混个眼熟
throw new Exception();
}
catch(Exception e) {
e.printStackTrace();
}
}
return value[index];
}
// indexOf函数某一个子字符串是不是属于我这个字符串
// Object obj这个叫目标对象
// indexOf方法 数组字符串内容从左向右比较 从0开始算
// 有返回值是int类型 返回计数对象下标
public int indexOf(Object obj) {
// 如果obj为空返回-1 为空
// 判断字符串是否为空
if(obj==null) {
return -1;
}
// 不为空
else {
// i小于value.length,i自动加一
for(int i=0;i<value.length;i++) {
// 如果其中有value[i]等于obj 返回i
if(obj==value[i]) {
return i;
}
}
// 否则返回-1
return -1;
}
}
// Object obj这个叫目标对象
// lastIndexOf方法 数组字符串内容从右向左比较 从末尾开始倒着算
public int lastIndexOf(Object obj) {
// 如果obj为空返回-1 为空
if(obj==null) {
return -1;
}
// 不为空
else {
for(int i=size-1;i>=0;i--) {
// 如果其中有value[i]等于obj 返回i
if(obj==value[i]) {
return i;
}
}
// 否则返回-1 return语句两个作用 1.停止,2.返回值
return -1;
}
}
// 这里不用泛型了,泛型还没学 类型是Object
// 创建一个新的对象,把旧的对象丢在对象里面
public Object set(int index, Object object) {
rangeCheck(index);
// 创建一个变量调用刚才原有的数组
Object old = value[index];
// 将新值赋给value相应的index
value[index] = object;
// 返回重新赋值后的old对象
return old;
// return value[index];
}
// 将判断 元素 在不在数组范围内
public void rangeCheck(int index) {
if(index<0||index>size-1) {
// 程序里面一定不能出现不可预测结果,必须是可预见的
// 在这里丢一个异常出去,这样程序就停在这里了
try {
// 手动抛出一个异常。讲到异常章节再说,先混个眼熟
throw new Exception();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// 实际上不光new了一个对象也把对象里面的数组也new好了 这里调用构造方法
MyArrayList list = new MyArrayList(2);
// 往里面丢东西
list.add("aaa");
// new Human类的构造方法需要初始化new一下
list.add(new Human("神奇的梦"));
list.add("234");
list.add("bbbb");
list.add("bbbb");
list.add("bbbb");
list.add("bbbb");
// MyArrayList01 list对象
System.out.println(list.set(5, "1212121212dddd"));
System.out.println("-----------------");
// ArrayList 属于import java.util.ArrayList;
// ArrayList list2 =new ArrayList();
System.out.println("-----------------");
// 强制类型转换为Human类型
// 在这里调用了Object.toString()需要强制转型
// 此处list.get(1)默认的类型是list类型 get方法返回Object
// 将list类型强制转型为Human类型
// 将list对象强制转换为Human类型的h对象
Human h=(Human) list.get(1);
// String name;成员变量不是私有变量时可以调用
// System.out.println(h.name);
// getName方法 使用Human类中的getName方法 获取name属性 姓名
System.out.println(h.getName());
System.out.println("-----------------");
// 定义name 修改name名称
String name="des";
// Humen h对象
h.setName(name);
System.out.println("-----------------");
// Humen h对象
System.out.println(h.getName());
// MyArrayList01 list对象
// 调用size()返回size的个数
System.out.println(list.size());
System.out.println("-----------------");
// MyArrayList01 list对象
// 返回value数组内 某个元素
System.out.println(list.value[5]);
System.out.println("-----------------");
// MyArrayList01 list对象
// 用于判断动态数组是否为空。
list.isEmpty();
System.out.println(list.isEmpty());
System.out.println("-----------------");
// MyArrayList01 list对象
// 数组字符串内容丛左向右比较
list.indexOf("234");
System.out.println(list.indexOf("234"));
System.out.println(list.indexOf("bbbb"));
System.out.println("-----------------");
// MyArrayList01 list对象
// 数组字符串内容从右向左比较
list.lastIndexOf("234");
System.out.println(list.lastIndexOf("234"));
System.out.println(list.lastIndexOf("bbbb"));
System.out.println("-----------------");
// 修改name通过list对象下面的set方法修改姓名
// MyArrayList01 list对象
System.out.println(list.set(6, "开始"));
}
}
本文来自博客园,作者:神奇的梦,转载请注明原文链接:https://www.cnblogs.com/fantasticDream/p/16405315.html