看了之后让我的JAVA明白不少哦!

1.定义一个数组a是new出来的, 里面分配了a.length个空间吗?.   
String[] s = new String[5];

jvm中有三类内存区域,栈内存、堆内存和静态存储。
栈内存(stack)在随机访问存储器(RAM)内,一般通过堆栈指针进行操作,它是按顺序分配内存空间的,当堆栈指针下移一位则分配一个单元内存空间,上移则释放空间。String[] s = new String[5];这个语句是在栈内存中分配了五个空间,它们可以通过变量s[0]...s[5]进行索引,它的内容是在堆内存中分配的5个空间的内存地址。我们可以把它们当作5个指针。
例如:Java的基本数据类型(int byte boolean ....)分配内存都是在栈内存上。

堆内存(heap)同样在RAM中,它保存对象和前者不一样,编译器不知道将要分配多大内存空间给该对象,也不知道这个对象要存在多长时间,用它保存数据将会获得很大的灵活性。我们都知道,JAVA中我们无法直接做任何回收的动作,而只能提示jvm该回收垃圾了。那么堆内存中的对象,时刻要被java回收机制线程监控,判断是否该变量已经超过了作用域,从而回收它。灵活性和回收机制,让堆内存比栈内存更消耗系统资源,效率更低。

当我们做s[0] = new String("123");才完成对堆内存中s[0]指向的内存空间初始化,我们才可以引用这个对象。
当你调用System.out.println(s[0]); jvm将会从s[0]中读取到它的内存地址,将内容输出在控制台上。而如果你输出的是s[0].toString();那么你将看到s[0]所保存的内存地址。

静态存储(static)同样在RAM中,这里的静态意味着位置固定,它在类被加载时,就已经在RAM中分配了空间,并完成了初始化。例如:
A a;这个类声明语句,就已经完成了初始化。

2.==号是不是地址和值两项的比较 
“==”比较的是内存地址,例如:
String s1 = "123";
String s2 = "123";
s1 == s2,这里比较的是栈内存中s1与s2的值。java中,比较对象的内容是通过s1.equals(s2);这种方式进行的。
当然上面的比较结果是true的。但是下面这种情况,结果就是false:
String s1 = "123";
String s2 = "1" + "23";
我们通过equals方法比较,才能得到true的结果。


5. a[i] 代表什么,是代表了值,还是地址,还是代表了两项?  
a[i]是引用,你可以把它仅仅当作一个名字,它的内容是内存地址,而当你调用它时,jvm拿给你的是它所保存的内存地址(即heap内存上的地址)上的实际值。

以前很多关于java值传递和引用传递的帖子,总结一下吧!
class A {
  int i = 10;
}

int i = 100;
这里有两个对象a.i与i(a是A的一个实例)。

接下来有一个方法,如下:
public void Add(int i) {
  i = 20;
}
分别调用:
Add(a.i);
Add(i);

当你输出a.i和i时,你会发现:
a.i = 20; 
i = 100;
a.i传递的是引用,Add方法将a.i的指向转变了,它不在指向heap堆中的内容为“i = 10”的对象了,而指向“i = 20”的对象;i传递的是值,也就是说是一个副本,Add方法修改的只是一个copy,而栈内存中i还是等于100。
 

6. 如果a[i] 只代表了一项,那另一项是靠什么来区分?.    
7.a[i] == a[j] ; 为true时;  有没有比较他们的地址?,  
你这样问,让我怎么回答你呢?


“在java里面没有指针,有的人把引用也当作指针,举例来说。java的引用相当于电视的遥控,有了遥控就可以控制换台,在java中,引用就是地址”
java中指针无处不在,只是说,作为程序员你无法感觉到它的存在,无法直接操作它。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值