最近在看java编程思想,疯狂补java基础,下面写下自己看书之后的一些细小的知识点的总结。
java中,经常会使用到一些变量,不管是基本数据类型还是引用数据类型,但是我们又会有问题,那么这些变量到底存储在哪里呢?
对于基本数据类型,不论是局部变量还是成员变量都是存储在栈中,
public class Test {
int c =100000;
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 100000;
Test t = new Test();
if(a==t.c){
System.out.println("true");
}else{
System.out.println("false");
}
}
}
输出的是true
在java编程思想中也有提到,对于基本数据类型,会直接将变量存储在栈中。同时我们也可以通过上面的代码来得出结论。
这里我们首先知道方法中的a变量是存储在栈中,若是成员变量c存储在堆中的话,那么地址也就不一样,会输出false,但是却输出true,说明也是存储在栈中的,同时由于共享性的关系,使得两个变量指向同一个地址。
对于引用数据类型。
深入Java虚拟机中有说:new出来的对象全是存储在堆中。
这里String字符串比较特殊:存储在常量池中,当字符串值相等的时候,这个时候他们实际上也是同一个对象。
比如:
public class MtTest {
public static void main(String[] args) {
String a = "1234";
// String b = new String("1234");
String b= "1234";
if(a==b){
System.out.println("同一个对象");
}else{
System.out.println("不是同一个对象");
}
}
}
输出结果是同一个对象
public class MtTest {
public static void main(String[] args) {
String a = “1234”;
String b = new String(“1234”);
// String b= “1234”;
if(a==b){
System.out.println(“同一个对象”);
}else{
System.out.println(“不是同一个对象”);
}
}
}
输出的不是同一个对象
因此,第一种,“1234” 都是指向同一个地址,所以是同一个对象,而第二种,因为通过new了一个新对象,因此不是指向同一个地址,所以,不是同一个对象。
注意:==无论如何都是比较地址,而equals原本也是比较地址,但是通过重写这个方法,可以比较值,很多类都重写了这个方法,比如String。