String知识点

char 表示字符,初始化用单引号,只存储一个字符 ,char = 'a'.

String 表示字符串,初始化用双引号,可存储多个字符串,String ="helloword".

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池,用于存放编译期生成的各种字面量和符号引用,在类加载后存入方法区的运行时常量池。

字符串对象是一种特殊的对象。String 类是一个不可变的类。String 对象一旦创建就不允许修改。

String 类有一个对应的String pool缓冲池(虚拟机在内存中开辟出一块单独的区域,用来存储字符串对象)

两种创建字符串的方式

String str1 = new String("abc");//使用构造函数创建
String str2 = "abc";//使用双引号创建

 使用双引号定义时,java会先去缓冲池寻找内容相同的字符串,如果存在就拿出来使用,否则创建一个新的字符串放在缓冲池中。str2存放在栈中,"abc"存放在常量池,str2就是"abc"的引用。

使用构造函数创建的str1会在堆上创建一个对象,如果常量池中有"abc"就不创建,否则创建一个新的"abc",堆对象就是常量池中"abc"的引用,str1放在栈上是对堆对象的引用。

/**
 * 执行第一行时在缓冲池中创建"abc",
 * 在栈中创建对"abc"的引用a,
 * 执行第二行时因为缓冲池中已经存在"abc",
 * 故直接在栈中创建对"abc"的引用b
 */
String a = "abc";
String b = "abc";
System.out.println(a==b);//true
/**
 * 执行第一行时,在堆上创建一个a对象,在缓冲池中创建一个字符串"abc",
 * 堆中a对象指向这个字符串,在栈上创建a对象的引用a
 * 执行第二行时,在堆上创建一个b对象,因为缓冲池中已经有abc,b对象直接指向它,
 * 在栈上创建b对象的引用b
 */
String a = new String("abc");
String b = new String("abc");
System.out.println(a==b);//false
/**
 * java会在编译器进行优化,"ab"+"c" 都是字符串常量,
 * 拼接时就会优化为一个字符串常量"abc"
 */
String a ="abc";
String b ="ab"+"c";
System.out.println(a==b);//true
/**
 * 在字符串拼接时有字符串的引用b无法在编译期确定,只能在运行时期动态分配并将新地址赋给c
 */
String a = "abc";
String b = "ab";
String c = b+"c";
System.out.println(a==c);//false
/**
 * final 修饰的变量,会在编译期被解析为常量值的一个本地拷贝存储在常量池
 * b+"c" = "ab"+"c"
 */
String a = "abc";
final String b = "ab";
String c = b+"c";
System.out.println(a==c);//true

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值