Java把内存分成两种,一种叫做栈内存,一种叫做堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。这就意味着随着代码块的结束,内存得到释放。堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。栈中的变量指向堆内存中的变量,这就是 Java 中的指针。
String并不是基本数据类型,而是一个对象,并且是不可变的对象(String类为final型的(当然也不可被继承),几乎每一个修改String对象的操作,实际上都是创建了一个全新的String对象)。String 作为一种对象,表现的更加特殊一些,有基础变量的一些特性,也有对象的特点(Java将所有类型均定义为对象)。
一、初始化:
1.字符串为对象,那么在初始化之前,它的值为null,
String a=null;//对象的引用还没有创建,也没有分配内存空间
String a="";//已经new了,只不过内部为空,但是它创建了对象的引用,是需要分配内存空间的。
String a=new String();//同上
2.在java中有一个“字符数据池”的内存管理机制。在字符串直接赋值时,会触发。当然字符数据池也在堆内存中。
String s1=new
String("abc");//直接在堆中生成新的“abc”和字符数据池无关
String s2=new String("abc");//直接在堆中生成新的“abc”和字符数据池无关
String
s3="abc";//先去“字符数据池”搜索时候有“abc”这个字符串,如果有,则将字符串的首地址赋值给s3,如果没有,则在“字符数据池”中生成一个新的字符串“abc”并且将首地址赋值给s3;
这个机制是非常有用的,因为可以提高效率,减少了内存空间的占用。由于这种机制的存在,使用字符串的过程中,推荐使用直接赋值(即String s=”abc”),除非有必要才会新建一个String对象(即String s = new String(”aa”))。
二、字符串比较
原文:http://www.cnblogs.com/lance-/p/3587656.html