程序执行过程
执行某个程序时,先由硬盘load到内存区,由操作系统执行代码,内存管理分为四个区域:代码区(code segment)、常量区(data segment)、栈(stack)、堆(heap)。
代码区(code segment)用于存放代码,常量区(data segment),用于存放静态变量和字符串常量,可以共享(String类型就存放在这个区域),栈(stack),用于存放局部变量,堆(heap),用于存放new出来的东西
如下图所示:
String和StringBuffer的区别
执行速度方面的比较:StringBuffer > String
简单来说:
1. String:字符串常量,生成后不可修改,重新赋值后必须创建一个新的对象,存储在data segment区
2. StringBuffer:对象引用传递特点,字符串变量,生成后可修改,需要进行增加、插入、修改、删除时用StringBuffer,修改即指向一个新的对象的引用
String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个Java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。
StringBuffer:StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。
StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。
其他详细区别
参考博客:[http://blog.youkuaiyun.com/lclai/article/details/6141548]