1.JVM内存占用
JVM在内存中分为栈(虚拟机栈),堆(JAVA堆),方法区,程序计数器,本地方法区(本地方法栈)
字符串位于常量池中,常量池属于堆
栈:凡是涉及到指令顺序控制的基本类型(方法里的基本类型而不是类里面的)才会放到栈中【重要】
线程栈是私有的,各个线程占一个线程栈,其中的各个类型变量和方法叫栈桢,栈里面只记录地址。
new的作用:划分一块新的独有的空间,new的内容放在堆里
2.按值传递
java是按值传递的,有些例子可能在函数调用中改变了main函数中的参数内容,所以让人觉得混乱,其实java的按值传递是分类型的,在基本类型的传递中是很容易理解的按值传递,但到了自定义类型和String型等引用类型时好像并不是按值传递一样,其实其中也是按值传递的,只不过与基本类型有所区别,其中的差异是,基本类型非引用类型,按值传递直接传递的就是内容数值;而在引用类型的传递中,引用类型通过指向地址来确定参数,这时的按值传递传递的并不是确定的参数,而是地址的值,这也就容易给人造成一种引用类型并不是按值传递的一种现象,其实只是引用类型的按值传递由基本类型的显性参数变为了隐性地址值的原因。
3.String类的存储
String型为不可变字符串,并没有提供用于修改字符串的方法,其原地址不可变,这是因为String类型是以数组类型存储的,如果对原变量进行修改,例如:
String a = "abc";
String b = "def";
a=b; //a,b指向同一个地址
System.out.println(a==b); //此时输出结果为true
这种情况下a会指向b所指向的def的地址,如果原来的abc没有任何变量指向它此时便会自动回收这段内存空间。
或者
a=a+b; //a = "abcdef"
此时系统会将a和b的内容进行拼接,接着将其在一个新的地址中放入一个新的数组存储“abxdef”。同样,如果abc没有指向它的变量其空间就会被回收。
也就是说,如果是引用方式a会指向引用的地址,如产生一种新的字符串内容,会在一个新的地址构造一个新的数组来承载这段新的字符串内容。
4.杂货铺
- 位运算取反+1和+1取反结果一样
- 无论符号位是什么>>>高位都用0补充
- 计算机位运算是最快的
- 枚举具有类的全部功能
- 字符串拼接时+常数时,全体内容都保持字符串格式,常数也会转为字符串形式
- 数组类型为什么从0开始:因为系统记录的是首地址,通过检索下标可跳到目标位置,+0为第一个位置,+1为第二个位置。
- equals函数只在String中比较值,在其他地方均比较的是地址
- 空占据内存,具有地址;null什么都没有没内存没地址
- 格式化输出 规定格式的替换输出
- 块的作用 提升性能,促进变量的提前释放