wo-05 10-10 dfeixtay original

[size=large]java中的数组和字符串[/size]

早有耳闻说java中的字符串String类都是常量,结合在程序中遇到的数据引用的问题,今天把数组和字符串的声明存储引用等来龙去脉摸了一下。暂且记下。
首先是存储的不同,在java中,有栈存储和堆存储之分。基本类型变量和引用型变量的声明等是放在栈存储中的,这样一旦超出变量所在的作用域,即释放;而堆存储有些像之前分析类的static成员变量是提到的类的命名空间,重点是它是有[color=red][size=large]new运算[/size][/color]创建的对象和数组。
下面是引用型变量的定义,即使在栈内存中的变量,使其指向堆内存的首地址,则栈中的变量就成为了引用性变量。

值得一提有两点:一是,在new后,数组的每个元素都将获得默认值,以归零 or false为主;二是数组和对象是在堆内存中分配,在栈内存的引用型变量引用,故引用型变量超过作用域后释放,但是只要还有其他引用型指向该数组或对象,数组对象不释放,直到没有变量指向它为止,成为垃圾。这也就是程序中写的某些数组,在应用中总是释放不掉的原因。嗯嗯!


另外,java的二维或多维数组可以是不相同的长度,不必是n*m的。将高维变量看做是引用型变量指向低维的数组或对象即可解释。


关于字符串。
java字符串常量 和 字符串变量都是用 类 来实现的,也就是说,标准的能够反映其结构的声明都是要用new来创建的。如:

String xx;
    xx = new String("字符串");

而我们通常简化写,


String xx = "字符串";



则知,


java中字符串是基于对象的引用型变量。



之前看过关于字符串常量的操作符“+”的讨论,由于String类是常量,创建即不可改变,在加操作中实质是创建了一个新的对象,指向它,在量大的情况下必然会影响其效率。



使用字符串变量,在代价明显的情况下,应使用StringBuilder类,或是StringBuffer类。