关于arraylist源码实现问题

关于arraylist源码实现问题

package com.day01;

import java.util.Arrays;

/**
*
* @author Administrator ArrayList集合
* @param <E>
*/
public class ArrayList<E> {
private int head = 0;// 头指针
private static final int ARRAY_SIZE = 1;// 集合默认长度为0(1)
private E[] list;
private int size = 0;

public ArrayList() {
list = (E[]) new Object[ARRAY_SIZE];
}

/**
* 带参构造 指定大小
*
* @param size
*/
public ArrayList(int size) {
list = (E[]) new Object[size];
}

/**
* 元素数量
*
* @return
*/
public int size() {
return this.size;
}

/**
* 判断元素是否满
*
* @return
*/
private boolean isFull() {
return size == list.length;
}

/**
* 添加元素
*
* @param element
*/
public void add(E element) {
ensureCapacity();
list[head] = element;
head++;
size++;
}

/**
* 删除元素
*/
public void remove(E element) {
boolean flag = contains(element);// 先查找是否有该元素
E[] elements = (E[]) new Object[size];
if (flag) {
// 当值为真时
for (int i = 0; i < size; i++) {
if (list[i].equals(element) ) {
list[i] = null;
break;
}
}
size--;
} else {
System.out.println("没有找到有该元素");
}
}

/**
* 查询是否有元素
*
* @param element
* @return
*/
public boolean contains(E element) {
boolean flag = false;
for (E e : list) {
if (e.equals(element)) {
flag = true;
}
}
return flag;
}

/**
* 数组扩容
*/
public void ensureCapacity() {
if (isFull()) {
E[] e = (E[]) new Object[size + 1];
for (int i = 0; i < size; i++) {
e[i] = list[i];
}
list = e;
}
}

/**
* 返回元素内容
*/
public String toString() {
StringBuilder sb = new StringBuilder();
if (size == 0) {
sb.append("[]");
} else {
for(E e : list) {
if(e == null) {
continue;
}else {
sb.append(e+" ");
}
}
}
return sb.toString();
}
}

以上是我编写的代码,其中关于remove方法当中,为什么第一次删除没事,第二次删除则报空指针异常。  老师只需要操作add方法和remove方法即可,其他的我还没写好。只是不明白为啥remove方法会报这个错误

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿满 2021-01-26 15:11:26

同学你好,在之前学习集合时,有讲过List,ArrayList是List的一个主要实现类,如:

http://img1.sycdn.imooc.com//climg/600fbf0a09b77ebb12950383.jpg

问一下同学这里是实现这个ArrayList吗?如果是,必须实现List接口并实现接口中的方法。如果不是,建议同学换个名字。另外本课程中并没有涉及到数据结构。

在同学的代码中,删除元素时,将该位置设置为了null,如:

http://img1.sycdn.imooc.com//climg/600fbfb709ec587a06810377.jpg

当使用list元素调用方法时,使用null调用方法就会报空指针异常。

http://img1.sycdn.imooc.com//climg/600fc07b09a2308705090200.jpg

祝学习愉快~

  • 提问者 慕哥8310336 #1

    老师,这里我就不明白了,空指针异常不是只有对象未实例化的情况下才会报吗。  我在做添加操作时已经有三个元素了,我只是删除了一次操作变为Null,也只是数组中的其中一个值换成了Null,在删除一次就报了异常,但是该对象还是已经实例化的。是因为数组在jvm虚拟机的内存分配机制,当该索引下标变为Null时内存地址就被销毁了吗

    2021-01-26 16:08:55
  • 好帮手慕阿满 回复 提问者 慕哥8310336 #2

    同学你好,当对象为null时,调用方法就会报空指针异常,如:

    http://img1.sycdn.imooc.com//climg/600fdc0309faa05b06680336.jpg

    在同学的代码中,报空指针的地方是如下位置:

    http://img1.sycdn.imooc.com//climg/600fdd8a09f121e908240253.jpg

    list[i]=null,将某个元素设置为了null,在循环中,遍历到为null的元素,使用null调用equals()方法,就会报空指针异常。

    祝:学习愉快~

    2021-01-26 17:17:16
好帮手慕阿满 2021-01-26 11:22:58

同学你好,同学是要实现List接口的实现类ArrayList吗?如果是,ArrayList类需要实现List接口并实现接口中的方法。另外在Java中,并没有指针的说法。

祝学习愉快~

  • 提问者 慕哥8310336 #1

    是要实现arraylist的代码,我在用测试类进行添加操作后在进行remove操作,当remove两次就会报Nullpointerexception。 

    2021-01-26 11:32:41
  • 提问者 慕哥8310336 #2

    另外不懂老师你说的如果是要实现arraylist中的list接口方法这句。 我想实现数据结构中的这个集合的实现。但是用remove方法两次就提示异常

    2021-01-26 11:35:08
  • 提问者 慕哥8310336 #3

    当我用我自己所编写的add方法添加了三个元素时,我用自己所编写的remove方法进行删除元素,第一次删除没事,在删除一次就报null pointer exception

    2021-01-26 11:39:43
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师