由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
/************************************************************************************************************************************************/
1、 java中数据类型:基本数据类型和引用数据类型;
2、 java中虽然没有说明程序在运行的时候,内存是如何分配的,不过通常java开发人员或学习者,会将内存分为三个区域:栈空间、堆空间、方法区;
堆区:
a.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
b.jvm只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
a.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
b.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
c.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
a.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
b.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。字符串常量在方法区分配 ,数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小。
上面明白之后,接下来我们来分析 String str=new String("abc");
String str 是定义了一个String类型的变量,此时只定义了而没有创建对象,而new Sring(“abc”)到底做了什么?我们可以查看String的源码,发现如下:
public final class String
implements java.io.Serializable, Comparable
{
/** The value is used for character storage. */
private final char value[];
……
发现她有一个Value的属性,类型是char[],而此数组又做了什么事情?如果读源码会发现他保存了String对象的值,此时也说明String就是char[]来组织的。
当执行String a="abc";时,JAVA虚拟机会在栈中创建三个char型的值'a'、'b'和'c',然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'}对象,而这个新创建的String对象会被添加到字符串池中。
此时就存在了两个对象:一个在堆中;一个在字符串池中。
/**************************************************************************************************************************/
String str1 = "abc";
String str2 = new String("abc");
/*******************************************************有关==与equels的区别*************************************************************/
参考:Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例
这篇博客举例很详尽,不错的一篇博客。。。。。