想到一个问题,在for或者while循环里面定义一个变量,这样是不是会每执行一次都申请一次内存?是不是应该把声明放在外面,初始化放在里面?
这个问题涉及到数据类型。int是基本数据类型,保存在stack,String等是引用数据类型,保存在heap。在网上查到一些二手知识:
两种数据类型的特点:
一、从概念方面来说
基本数据类型:变量名指向具体的数值
引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值
二、从内存构建方面来说
基本数据类型:变量在声明之后java就会立刻分配给他内存空间
引用数据类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。
三、从使用方面来说
基本数据类型:使用时需要赋具体值,判断时使用“==”号
引用数据类型:使用时可以赋null,判断时使用equals方法
另外:
回答开始的问题,在循环里定义和初始化数据会不会重复申请内存,答案是不会,因为编译器会把它优化到外面。
就是 for(){ int x = ...}会优化为 int x; for() { x = ...}
另外方法里的所有临时变量 都是在方法退出后再释放掉,就是一次性全部出栈。
例如,对于:
使用下面的命令可以得到字节码。
javap -verbose xxx.class > xx.txt
得到:
三个localVariable分别是: