-
【JAVA】笔记(9)--- 装箱与拆箱;整数型常量池;String为什么是不可变的;St
楔子:我们需要向一个方法的形参里传一个数字,但是这个方法的形参类型是 Object ,怎么办?
8种基本数据类型对应的包装类型:
byte —> Byte
short —> Short
int —> Integer
long —> Long
float —> Float
double —> Double
boolean —> Boolean
char —> Character
装箱与拆箱:
1.概念:装箱 --- 基本数据类型 -->引用数据类型 ; 拆箱 --- 引用数据类型 -->基本数据类型 ;
2. 栗子老师:(以 Integer 为例)
public class pra {
public static void main(String[] args) {
//装箱:
Integer i=new Integer(100);
//拆箱:
int j=i.intValue();
System.out.println(j);
}
}
运行结果:
--------------------------
100
Process finished with exit code 0
3.自动装箱与自动拆箱:
1)概念:自从 java 5 之后,引入了这个新特性 --- 自动装箱与自动拆箱,如同字面意思,基本数据类型与引用数据类型的转换不需要再调用方法来执行了;
2)什么时候会触发自动装箱或自动拆箱 ?
栗子老师:
public class pra {
public static void main(String[] args) {
Integer i=100;//自动装箱
int j=i;//自动拆箱
Integer a=1;//自动装箱
System.out.println(a+1);// + 触发自动拆箱
System.out.println(a-1);// - 触发自动拆箱
System.out.println(a*1);// * 触发自动拆箱
System.out.println(a/1);// / 触发自动拆箱
}
}
运行结果:
----------------------
2
0
1
1
Process finished with exit code 0
整数型常量池:
1.概念:java 中为了提高程序的执行效率,将 [ -128 , 127 ] 之间所有的整数包装对象提前创建好,放到了方法区的整数型常量池中了,所以只要用到这个区间内的整数数据,就不需要再new了,直接从整数型常量池中取出来就行;
2.理解:所以说整数型常量池中的 256 个整数,是在类加载时就创建好的,无论用不用的到,这 256 个对象都是存在的,这种机制也叫做 cache 缓存机制;缓存机制的优点是效率高,缺点是耗费内存;
3.栗子老师:
public class pra {
public static void main(String[] args) {
//a,b指向的 127 是类加载时,在方法区的整数型常量池中创建的,且均为127,所以a,b储存的地址是相同的
Integer a=127;
Integer b=127;
System.out.println(a==b);
//因为128不在整数型常量池中,所以c,d储存的地址指向的分别是在堆内存中new出来的俩个对象,所以a,b储存的地址不同
Integer c=128;
Integer d=128;
System.out.println(c==d);
}
}
运行结果:
------------------------
true
false
Process finished with exit code 0
int,Integer,String 间的类型转换:
随笔:
1. String为什么是不可变的 ?
第一,我看过源代码, String类中有一个byte [ ] 数组,这个数组采用了final修饰,所以此数组一旦创建长度不可变;
第二,并且被final 修饰的引用,指向某个对象之后,不可再指向其它对象;
2、StringBuilder / StringBuffer 为什么是可变的呢?
我看过源代码, StringBuffer / StringBuilder 内部实际上是一个byte [ ] 数组,且数组没有被final修饰,;数组的初始化容量是16,当存满之后会进行扩容,底层调用了数组拷贝的方法 System . arraycopy ( ) 是这样扩容的,所以StringBuilder / StringBuffer 适合于字符串的频繁拼接操作;所以综上,...可变。
来源:https://www.cnblogs.com/Burning-youth/p/15563247.html