底层用ArrayList模拟数据结构的集合类(一点堆栈内存问题以及解释)

运行ok代码如下(代码段1):

//用arrayList模拟数据结构的集合,可增替查遍历
public class ArrayListDemo {
	public static void main(String[] args) {
		ArrayListDemo_1 array = new ArrayListDemo_1();
		array.add("罗志祥");
		array.add("罗永浩");
		array.add("罗玉凤");
		array.add("小猪");
		array.add("龙哥");
		array.add("凤姐");

		array.bianLi();

	}

}
import java.util.ArrayList;

import java.util.Iterator;

public class ArrayListDemo_1 {
	private ArrayList<String> array;

	// 集合初始化------(焦点)
	ArrayListDemo_1() {
		array = new ArrayList<String>();
	}

	// 增加元素
	public void add(String s) {
		array.add(s);
	}

	// 删除元素
	public void delete(String s) {
		array.remove(s);
	}

	// 替换元素
	public void changeElements(String oldString, String newString) {

		if (array.contains(oldString)) {
			int i = array.indexOf(oldString);
			array.set(i, newString);
			System.out.println("替换成功!");
		}

		else
			System.out.println("对不起,你所要替换的元素不存在!");

	}

	// 查询元素
	public void check(String s) {

		System.out.println("你所要查询的元素索引是:" + array.indexOf(s));

	}

	// 遍历集合
	public void bianLi() {
		System.out.println("你所要遍历的集合内容如下:");
		Iterator<String> i = array.iterator();
		while (i.hasNext()) {
			System.out.println(i.next());
		}
	}

}

报空指针异常代码如下(代码段2):

//用arrayList模拟数据结构的集合,可增替查遍历
public class ArrayListDemo {
	public static void main(String[] args) {
		ArrayListDemo_1 array = new ArrayListDemo_1();
		array.add("罗志祥");
		array.add("罗永浩");
		array.add("罗玉凤");
		array.add("小猪");
		array.add("龙哥");
		array.add("凤姐");

		array.bianLi();

	}

}
import java.util.ArrayList;

import java.util.Iterator;

public class ArrayListDemo_1 {
	private ArrayList<String> array;

	// 集合初始化------(焦点)
	ArrayListDemo_1() {
		ArrayList<String> array = new ArrayList<String>();
	}

	// 增加元素
	public void add(String s) {
		array.add(s);
	}

	// 删除元素
	public void delete(String s) {
		array.remove(s);
	}

	// 替换元素
	public void changeElements(String oldString, String newString) {

		if (array.contains(oldString)) {
			int i = array.indexOf(oldString);
			array.set(i, newString);
			System.out.println("替换成功!");
		}

		else
			System.out.println("对不起,你所要替换的元素不存在!");

	}

	// 查询元素
	public void check(String s) {

		System.out.println("你所要查询的元素索引是:" + array.indexOf(s));

	}

	// 遍历集合
	public void bianLi() {
		System.out.println("你所要遍历的集合内容如下:");
		Iterator<String> i = array.iterator();
		while (i.hasNext()) {
			System.out.println(i.next());
		}
	}

}

辅助解释图片:

222157_sBow_3384770.png

解释如下:这是底层用ArrayList模拟数据结构的集合类
(我直接说重点,有不对的请指正)
      我给出两种情况,第一种是正常情况,程序运行ok,第二种,程序运行出现空指针异常。现在分析问题:
     (看焦点处构造方法),正常情况下,如辅助图片序号1,ArrayListDemo_1类对象经过无参构造方法进行初始化后,ArrayListDemo_1类中成员变量array有了在堆内存相应的对象地址,即array指向了堆内存中
相应的对象。序号1和序号2是同一个变量,指针没出现问题,程序是ok的。
      再看空指针异常情况(代码段2),刚开始,成员变量private ArrayList<String> array序号3集合是空,本身它在栈内存中有自己的位置,ArrayListDemo_1类对象经过无参构造方法进行初始化后,构造方法内的堆内存对象new ArrayList<String>()却指向了在这个方法内部定义的局部变量ArrayList<String> array序号4。而ArrayListDemo_1类的其他方法所用的array是成员变量private ArrayList<String> array,它在堆内存中是没有指引的对象的。所以整个程序,运行到{array.add(s);}语句立马报错空指针异常。这个语句的array是序号3的array。

    ArrayListDemo_1类的方法里面包装的都是ArrayList()里面的东西,所以,底层就是ArrayList。

      

 

 

 

转载于:https://my.oschina.net/u/3384770/blog/868755

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值