JAVA与C中一维数组的类似之处与区别
因为我写C比较多,在学java的时候总是会不自觉想去了解了解和C关联,毕竟底层实现是差不多的
首先,在java中,基本数据类型不需要new而直接定义,而引用数据类型在定义实例时需要new实例对象。
1、不同于String类,String由于实现了常量池 所以new 和不new 有区别:new的话,引用变量指向堆区。不new的话,引用变量指向常量池。下面是来自网络的内存结构图
2、对于数组的定义,初始化时用new与不用new 没区别,只是两种方式罢了,因为数组是引用数据类型,建立对象时,无论用不用new,数组实体都是放在堆内存中,引用变量放在栈内存。
这是由于java设计之初为了契合用户习惯做得妥协(也可以说是优化)。
大家都知道java是1995年设计出来的,相比c(1972年)、c++(1983年)这些语言来说是后起之秀。而c、c++定义数组习惯使用 int a[] = {1, 2, 3}; 这样的方式。因此java也顺势继承了下来。
接下来看看看看与C的联系之处:
在C中的数组在定义之初,就已经分配好了首地址了,有指针指向其首地址。java规避了指针这个概念,用引用来代替指针,所以在java中我们叫引用数据类型(这个是我个人理解吧)。java在内存还是需要在堆上开辟空间作为数组的实体,类似于C的首地址来找到这个数组,而new感觉有点类似于malloc的感觉来开辟空间,例如用int[] arr=new int[5],new意思是创建空间,创建 多大的空间呢?就是int[5]这么大。但是为什么要开辟空间呢?因为我们在Java中,数组实体是在堆中的,所以要开空间。
java作为纯面向对象语言,同时数组在java中以对象形式存在。C的写法 int a[] = {1, 2, 3}看着好像有点有点违背了对象创建的方式,而它实际上只是一种语法糖(简化写法)。编译器遇到 int a[] = {1, 2, 3}; 会编译成和 int a[] = new int[] {1, 2, 3}; 完全一样的中间代码。
因此 int a[] = {1, 2, 3}; 和 int a[] = new int[] {1, 2, 3}; 实际上是等价的,任何一种写法都能正确编译,所以当然不会报错了。