数据结构与算法-使用下标访问的数据结构(数组)

本文深入探讨数组这一数据结构的特性与应用,包括数值数组和对象数组的区别,以及如何在Java中通过下标访问元素。揭示数组在内存中的存储方式,以及其背后的指针概念。

这个是正好是前面讲了一些排序算法,也用到了不少次数组了,所以就在这里想直接说一下。

数据结构有很多,每个都有自己的优点,因为每一个结构的产生都是因为实际的需要。学习数据结构需要,需要牢牢记住一句话:

结构决定功能

每一种结构的特点,决定了他们的用途,功能。

还是用java举例子,我么常用的数组

class Untitled {
	public static void main(String[] args) {
		int[] num = new int[]{1,2,3,4,5,6};
		char[] c = new char[]{'a','b','c','d','e','f'};
		for(int i=0;i<num.length;i++)
		{
			System.out.println(num[i]);
			System.out.println(c[i]);
		}
	}
}

#输出
1
a
2
b
3
c
4
d
5
e
6
f
sandbox> exited with status 0

我们首先来说这样的简单数组,即数值数组,它的特点是由基本元素组成,并且大小固定,例如int char

首先我们创建了数组变量,在编辑器中实际得到的变量名就是指向起始位置的指针。

int[] num = new int[]{1,2,3,4,5,6};

我们可以依靠序号找打对应的元素,原因是什么?? 我特意将int写在了上边,int的长度是四字节,所以所有元素的间隔都是一样的,那么不就很容易根据序号找到对应的元素

我们数组的地址为num  第一个元素位置就为num+0,第二个位置就是num+1*4,以此类推

我们就可以使用 内存位置+序号*元素占空间大小 (num+下标*4) 定位对应的元素内存位置,从而取出元素。

可能有人说,那我字符串数组大小可不一样了,怎么还能使用序号访问?

class Untitled {
	public static void main(String[] args) {

		String[] ss = new String[]{"asdfd","fdfs"};
		for(int i=0;i<ss.length;i++)
		{
			System.out.println(ss[i]);
		}
	}
}

#输出
asdfd
fdfs

这就是要说的第二类,对象数组。对象数组不是特定的值,我们java里使用的类就是一个对象,他们根据特定的规则组成,而不是确定的数据组成,在使用的时候,编辑器根据对象的规则解析出里面的数据和方法。需要注意的是,每个对象在内存中分配时也是由变量名指针指向,就拿String举例子

我们是两个字符串放在一个数组中,但是我们放的并不是他们的值,而是他们的指针(字符串的内存地址)。当我们访问对应序号的元素时,得到的是字符串变量的指针,那么我们就可以正常的访问该变量。对稍微复杂的也是如此,比如我们有一个测试的类,创建一个类的数组:


class Untitled {
	public static void main(String[] args) {

		test t1 = new test("wang");
		test t2 = new test("gugu");
		
		
		test[] tt = new test[2];
		tt[0]=t1;
		tt[1]=t2;
		
		for(int i=0;i<tt.length;i++) //遍历访问数组元素
		{
			tt[i].shout();
		}
	}
}

class test
{
	String a;
	test(String in)
	{
		this.a = in;
	}
	public void shout()
	{
		System.out.println(this.a);
	}
}

#输出
wang
gugu

这个道理是一样的。

 

虽然自C语言之后,大多数语言已经屏蔽了所谓的指针概念,但是底层难以避免,为的是减少我们的直接使用指针带来的风险。

对于数组这种结构,它的特点就是存储同类型的元素,并且支持使用下标访问对应的元素。

数组分为两种:数值数组好对象数组。数值数组根据变量大小计算内存偏移,而对象数组中存储的是对象的指针,不是具体的数值。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值