运行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());
}
}
}
辅助解释图片:
解释如下:这是底层用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。