String类和常量池

String对象的创建方式
String str1 = "abc";
String str2 = "abc";	// 此时str1 == str2,因为他们都是常量池中的abc
String str3 = new String("abc")		// 这会在堆中创建一个abc新对象,此时str1≠str3
  • 第一种:直接赋值,若字符串存在于常量池中,会直接引用常量池中字符串;若不存在,会在常量池中创建并返回引用
  • 第二种:new创建(先检测常量池中是否存在该字符串),若字符串存在于常量池中,则直接在堆中创建字符串对象;若常量池中不存在,会现在常量池中创建字,再从堆中创建字符串
  • 下面思考一下String str = new String("abc")到底创建了几个对象?答案一个或两个,当常量池中存在abc时,只在堆中创建对象abc,当常量池中不存在abc时,先在在常量池中创建abc,然后从堆中创建对象abc
String常量池的使用
  1. 双引号赋值,使用常量池
  2. String类的intern方法,如果常量池中有等于此String的字符串,返回常量池中该字符串引用。如果没有,在常量池中创建与此String内容相等字符串并返回常量池中字符串的引用(此处说法笼统:具体可以看这篇博客
8种基本类型的包装类和常量池

除了Float和Double外,其他几种基本类型的包装类(Byte,Short,Integer,Long,Character,Boolean)都实现了常量池技术,包装类默认创建数值 [-128,127] 的相应类型的缓存数据,超出此范围仍然会去堆中创建对象,

以Integer缓存为例
// 缓存[-128,127]之间的数值否则堆中创建对象
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
应用场景
  1. Integer i1 = 40; 编译时将代码封装成Integer i1 = Integer.valueOf(40);
  2. Integer i2 = new Integer(40); 创建新对象

转载自Java 学习/面试指南(JavaGuide)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值