java的内存可以分为栈内存和堆内存,堆内存负责保存new生成的对象的值。栈内存一般保存定义的变量或对象。当为一个对象定义成null时,相当于清除掉了该对象的引用,即堆内存保留的值就成了垃圾内存,等待JVM的回收。
1. 在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型,其余的都是引用类型。“==”是比较两个变量的值是否相等,“equals”是比较两个对象变量所代表的对象的内容是否相等。 因此"=="一般用在基本数据类型中,如int、boolean等;equals一般用在引用类型中,如String等。如下:
String a=new String("abc"); if(a==b)
if(a.equals(b)) |
2. String :引用类型。String类对象是一个常量对象。它在内存中的值是不可改变的。如String str="abc";str="def"。虽然str的值发生了变化,但是在内存中“abc”的值是存在的,一直等到垃圾回收或内存不够时,内存中的“abc”值才会消失。所以,在项目应用开发中,stri的值会经常发生变化,为节省内存空间一般用StringBuffer来代替String。StringBuffer直接可以修改内存中的值。
3. StringBuffer:默认长度是16个字符,随着字符数的增多,自动增长。它有一些比较重要的方法,如:capacity,返回类型:int,可以返回当前StringBuffer的容量。等等,详细见API。
4. 在Java中,传参时,都是以传值的方式进行。对于基本数据类型,传递的是数据的拷贝;对于引用类型,传递的引用的拷贝。
4.1 如下示例,对基本数据类型:
class StringTest
{
public static void change(int x,int y)
{
x=x+y;
y=x-y;
x=x-y;
}
public static void main(String[] args)
{
int x=3;
int y=4;
change(x,y);
System.out.println("x="+x);
System.out.println("y="+y);
}
}
我们可以看到输出的值:x=3,y=4;为什么调用了change方法,交换了x和y的值,可输出的结果还是没变呢?因此这就是“对于基本数据类型,传递的是数据的拷贝”最好的说法,我们可以用下图来表示:
从栈内存,我们可以看出,x和y的交换实际上是在change里面发生了改变。
4.2 对于引用类型,我们可以把引用看作对象的首地址,因此它copy的是首地址的引用。当引用类型的值发生变化时,原地址的值也就会化了。如下所示:
public static void change(int[] num)
{
num[0]=num[0]+num[1];
num[1]=num[0]-num[1];
num[0]=num[0]-num[1];
}
int[] num=new int[]{3,4};
change(num);
System.out.println("x="+num[0]+","+"y="+num[1]);
输出的内容为:x=4;y=3
注:java中的八种数据类型,都各自对应了封装类的引用类型(如:Boolean,Byte,Short,Integer,Long,Character,Float,Double),可以相互之间转换。详见API。