java中创建数组时怎么分配内存?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中创建数组时怎么分配内存?相关的知识,希望对你有一定的参考价值。

int[] arr=new int[3];
问题: 上面创建int数组时,怎么分配内存的?arr是一个引用变量,是通过指针指向new int[3](存在堆里面)对吧,那么,栈里面为arr分配几个指针,是3个还是1个?
>>>>>>>>>>>>>>>>>>>>
补充:
疑问1****: 其实我就是想知道java中创建数组时,栈中分配几个指针,是一个还是“数组长度”个?
疑问2****: 如果是一个,那么,这个指正指向谁????
疑问3****: 如果指向的是第一个元素,那么,该指针怎么索引数组的其它元素????
疑问4****: 如果疑问3中索引方式是通过指针值加上数组元素所占内存大小的来索引下一个元素,那么,当元素不是基本数据类型,而是摸个对象的实例时,又是怎么索引的???(实例对象数组的元素在元素创建时可是null的,对吧。而且在数组使用过程中数组元素指向的对象是可以变的,这不就意味着内存在变吗!!)

>>>>>>>>>>>>>>>>>>>>>>>>>>>>
综合上述:我觉得数组创建时(我指的是被new出来时),栈中会为数组创建数组长度个指针分别指向每个元素。
但是,问题又来了。
问题5****:
int[] arr;//这里分配几个指针(栈)??
arr=new int[3];

还请大神来解答我的疑惑,能解答一个是一个。。。谢谢。。

疑问1啊 分配指针只有一个 不是arr[0] 也不是arr[1] 就是arr
疑问2啊 java中数组指针指向头部元素
疑问3啊 原来你知道指向第一个.. 既然指向第一个了 后面方括号内的数字 就告诉你要跳过几个数据 比如arr[0] 就一个也不跳 直接从头读取一个元素 arr[1]就会跳过第一个再读取 至于跳多少 你定义的时候已经规定了类型
疑问4啊 原来你都知道... 我想你就是这么一个问题吧 其实不是基本类型的时候 变量变为引用变量 C++叫指针数组 也是和你的疑问3一样 通过索引到元素后 读取内部地址后再访问实例 也就是堆了
关于括号内的 楼主所谓的内存变 其实不过是"引用变量的内存"变 分配的空间是没变的 说白就是改变一个引用的地址 也就是他的值 改变一个变量的值 有啥好奇怪的??

问题5 int[]arr 就一个指针 arr

我提个问题好么 下次提这么多问题 多弄点分行么?追问

针对疑问4,我想问一下。也就是说当元素为对象时,栈里存储的指针不是指向第一个元素,而是指向一个“数”,这个“数”才是指向数组元素的指针(或则就是元素在堆中的存储地址)对吧?当数组元素有变动时,修改对应的“数”就行了,对吧??
其实我也是这样认为的。只是放上来看看其他人的意见。

追答

啊对对 就是修改地址 那个数

参考技术A arr在这里这是个对象引用,里面存储的是指向堆里的对象的一个元素的地址这个不变,根据第一个地址和元素的索引计算获得堆里对应的元素的地址。
arr只分配一个指针,那就是数组的第一个元素的地址

java中创建一个客户类数组customer[] 怎么给数组中的变量赋值?

如果可以的话,采用另外的方法也可以。
要求输出结果相同:

输入会员编号:20101
输入会员积分:1800
***会员列表***
编号 积分
20101 1800
1. 创建会员类 Customer 添加两个属性:会员编号、会员积分
2。创建会员操作类 CustManager

添加属性会员数组 customers
Customer [] customer = new Customer[100];

可添加多个会员编号和积分,要求接收add() 和打印所有 show()

先给数组元素new customer对象,然后通过customer对象在给属性变量赋值。

过程

customer类:

class customer//定义customer类
   public int a1;//顶一个变量属性a1

1、顶一个customer数组

customer[] ct = new customer[3];//定一个customer数组,数组长度是3

2、给数组中的customer赋值

for(int i=0;i<ct.length;i++)
    ct[i] = new customer();//实例化customer对象
    ct[i].a1 = 2;//给customer类的a1属性赋值

参考技术A 把会员信息封装成对象加到数据里面就行 要赋值就取出对象用setID 或者setJF方法就可以把 参考技术B public class Customer
int custNum;
int points;

public Customer()
public Customer(int custNum,int points)

this.custNum = custNum;
this.points = points;


public int getCustNum()
return custNum;

public void setCustNum(int custNum)
this.custNum = custNum;

public int getPoints()
return points;

public void setPoints(int points)
this.points = points;


public String lineInfo()
return this.custNum + "/t" + this.points;


/**
* 你的 show()
*/
public static void printList(Customer[] ca)
System.out.println("***会员列表***/r/n编号/t 积分");

if(ca!=null)
for(int i=0; i<ca.length; i++)
if(ca[i]!=null)
System.out.println(ca[i].lineInfo());



/**
* 你的 add()
* @return
* @throws IOException
*/
public Customer input() throws IOException
Customer c = new Customer();
System.out.println("输入会员号:");
c.setCustNum(System.in.read());
System.out.println("输入会员积分:");
c.setPoints(System.in.read());

return c;
参考技术C import java.io.IOException;

public class Customer
int custNum;
int points;

public Customer()
public Customer(int custNum,int points)

this.custNum = custNum;
this.points = points;


public int getCustNum()
return custNum;

public void setCustNum(int custNum)
this.custNum = custNum;

public int getPoints()
return points;

public void setPoints(int points)
this.points = points;


public String lineInfo()
return this.custNum + "/t" + this.points;


/**
* 你的 show()
*/
public static void printList(Customer[] ca)
System.out.println("***会员列表***/r/n编号/t 积分");

if(ca!=null)
for(int i=0; i<ca.length; i++)
if(ca[i]!=null)
System.out.println(ca[i].lineInfo());



/**
* 你的 add()
* @return
* @throws IOException
*/
public Customer input() throws IOException
Customer c = new Customer();
System.out.println("输入会员号:");
c.setCustNum(System.in.read());
System.out.println("输入会员积分:");
c.setPoints(System.in.read());

return c;




你要的大部分功能有了,自己拆补去吧!
参考技术D 为什么用数组而不用List。。。
Customer类:
int age;
String name;
Customer(int age,String name)

this.age = age;
this.name = name;


@Override
public String toString()

return "[" + name + "," + age + "]";


调用:
Customer[] customer = new customer[3];
customer[0] = new Customer (xxx,"XXX");

以上是关于java中创建数组时怎么分配内存?的主要内容,如果未能解决你的问题,请参考以下文章

Java 堆栈内存分配

数组,数字包装类,字符串的处理

释放 DeviceIoControl 分配的内存

C++中内存分配问题

面试官问:怎么保证线程安全在对象内存分配过程中不出问题?emmmm 让我想想

面试官问:怎么保证线程安全在对象内存分配过程中不出问题?emmmm 让我想想