1.堆内存
凡是new出来的对象都存在堆内存(数组和封装类)
2.栈内存
存放方法和局部变量(方法内部声明的变量),其实也可以理解所有变量声明都在栈里面,最后用了一个指针去指向堆内存的地址。
3. String类
- String中存储的都是常量,当遇到+号后,需要用到StringBuilder。
2.StringBuilder是线程不安全的,但速度快。StringBuffer是线程安全的,速度没有StringBuilder快。
3.常量优化机制(?)
举例分析:堆,栈,以及String的概念
public class StringTest {
public static void main(String[] args) {
String s2=new String("abc");
}
}
-
主函数main进栈内存,里面声明了一个s1的变量(变量在主函数里,自然也就在栈内存里面)。
-
这个时候我们调用了new String(),在堆内存开辟出一个空间。"abc"会在字符串常量池创建一个对象。
-
开辟的堆内存会拷贝字符串常量池中"abc"的副本。俩者不在同一个内存地址上。
-
栈内存的s2然后指向堆内存开辟的空间。
4.例题
- 直接看函数change,传了两个形参。
其实可以等价于String str=ex.str 和 char ch[]=ex.ch; - 第一句str=“test ok”,这一句其实就是在字符串常量池里面新建了一个"test ok"。str指向字符串常量池。而ex.str仍指向堆内存。所有str指向的地方改变跟ex.str没有关系。
- 第二句,char ch[]指向,ex.ch已经在堆内存开辟好的地址。所以ch改变,ex.ch也改变。