【JAVA】笔记(9)--- 装箱与拆箱;整数型常量池;String为什么是不可变的;StringBuilder / StringBuffer 为什么是可变的?

楔子:

        我们需要向一个方法的形参里传一个数字,但是这个方法的形参类型是 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 适合于字符串的频繁拼接操作;所以综上,...可变。 

 

posted @   猿头猿脑的王狗蛋  阅读(205)  评论(2编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
1
点击右上角即可分享
微信分享提示