String str=““与new String()的区别

一、基础概念

  • 1.1 常量池

用来存放一些常量,该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。

  • 1.2 字符串常量池

在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。当我们需要使用字符串时,首先会在字符串常量池中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。

  • 1.3 在编译期间创建的常量和运行期间创建的常量保存的地址

对象的引用都是存放在栈中,编译期间创建的常量保存在常量池中;
运行期间通过new创建时,会直接创建一个新字符串常量并会存储在堆中。所以在堆中可以有很多重复相同的字符串,而在常量池中,不会出现重复的值。

二、String str=""与new String()的区别

  • 2.1 String str=""
String str = "hello world";

在编译期间,先检查常量池中是否存在"hello world",如果不存在,就在常量池中开辟一个空间来存储"hello world";如果存在,就不用新开辟空间。在栈内存中开辟一个名字为str的空间,来存储"hello world"在常量池中的地址值。

  public static void main(String[] args) {
        String str1 = "hello world";
        String str2 = "hello world";
        System.out.println(str1 == str2);
    }

在这里插入图片描述
注意!这里就是上面说的,从常量池中直接取用,所以,两者引用地址应该也相同,即 == 比较结果为true。

  • 2.2 new String()
String str =new String("hello world");

在编译期间,先检查常量池中是否存在"hello world",如果不存在,就在常量池中开辟一个空间来存储"hello world";如果存在,就不用新开辟空间。在运行期间,将常量池中的"hello world"复制一份存放到堆中,在栈内存中开辟一个名字为str的空间,来存储"hello world"在堆中的地址值。

    public static void main(String[] args) {
        String str1 =new String("hello world");
        String str2 =new String("hello world");
        System.out.println(str1 == str2);
    }

在这里插入图片描述
注意!这里这里和上面不一样,这里直接在堆里创建对象,每新建一个都会创建一个,所以,两者引用地址肯定不相同,即 == 比较为false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值