底层用ArrayList模拟数据结构的集合类(一点堆栈内存问题以及解释)
2017-03-27 00:00
375 查看
运行ok代码如下(代码段1):
报空指针异常代码如下(代码段2):
辅助解释图片:
解释如下:这是底层用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。
//用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()); } } }
辅助解释图片:
解释如下:这是底层用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。
相关文章推荐
- 返回解释Java乔晓松-Android SD卡路径问题以及如何获取SDCard内存大小
- Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good
- 多线程与托管以及堆栈共同作用造成的内存问题
- 内存以及和堆栈有关的问题
- ArrayList集合底层源代码展示以及结构解析,扩容机制
- C++内存问题大集合(指针问题,以及字符串拷贝问题,确实挺危险的)
- HashMap集合源码以及底层结构解析(何时数组+单项链表变为数组+红黑二叉树)
- 由String看Java堆栈问题,包括==以及equal()。
- 每天学一点flash(24) air程序内存问题
- windows核心编程学习笔记(四)windows内存结构/虚拟内存/线程的堆栈
- 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定
- buffer cache深度分析:概念以及内存结构
- 关于内存对齐以及通过偏移获得结构地址
- c语言的一结构数据的堆栈实现问题
- 并发内存分配问题以及TBB的解决方案
- (原创)VB调用DLL(VC)使用结构体参数时的内存对齐及分配的问题.
- 关于C++内存的一点解释。
- 每天学一点flash(24) air程序内存问题
- 数据结构问题---链表运算集合
- 深入了解.net类在内存中的结构以及安全线程同步