文档章节

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

大强森
 大强森
发布于 2017/03/27 22:51
字数 820
阅读 71
收藏 0

运行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。

      

 

 

 

© 著作权归作者所有

大强森
粉丝 2
博文 24
码字总数 9681
作品 0
奉贤
程序员
私信 提问
java数组、集合和数据结构知识*

一、数据结构知识。数据结构分为逻辑结构和物理结构,下面是百度百科的数据结构知识。 数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关...

cjun1990
2015/06/27
0
0
Vector、ArrayList、LinkList集合框架的使用与理解

说起集合框架也是老生常谈的话题,也是面试过程中面试官高频率问到的基础知识,新人在学习集合框架的时候总是会经常混淆这些概念和各自特性,这里简单对常用的几种集合做个简单总结,如有疏漏...

<E>, <E>, <E>
2018/09/25
0
0
Java集合详解1:ArrayList,Vector与Stack

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/80261556 这位大侠,这是我的公众号:程序员江湖。 分享程序员面试与技术的那些事。...

程序员江湖
2018/05/09
0
0
Java Collection 学习

Java Collection 学习 定义:Java 作为面向对象语言,对象的操作必比然是重中之重。要操作一个对象容易,如果需要存储多个对象,则需要一个容器,存储多个对象可以使用数组,但是数组的长度是...

推荐码发放
03/02
0
0
Java集合框架之Collection集合

一、引言 Java集合框架和IO框架一样,看似很庞杂的体系框架,但是当你逐一深入每个集合的用法后,就能明显的看出他们之间的区别和联系。最后拎出一个框架图,就一目了然了。由于Java的集合框...

忙碌的键盘
2014/12/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
21分钟前
0
0
高德API入门教程

项目需求 1、实现打开地图就能定位到中心显示标注点 2、点击标注显示保利可爱岛的详细信息 3、实现导航功能 <!doctype html><html><head> <meta charset="utf-8"> <meta http-......

我叫小糖主
33分钟前
6
0
聊聊Elasticsearch的MonitorService

序 本文主要研究一下Elasticsearch的MonitorService MonitorService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/MonitorService.java public class MonitorServic......

go4it
今天
3
0
二、Docker

1、Docker - The TLDR(Too Long,Don't Read,Linxu 终端工具 ) Docker是在Linux和Windows上运行的软件。它创建、管理和编排容器。该软件以开源方式开发,在Github上作为Moby开源项目的一部分。...

倪伟伟
今天
3
0
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部