VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Java教程 >
  • 【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


相关教程