java String类定义字符串两种方式

Java中的字符串类String是程序中使用十分频繁而且在各大公司招聘笔试中必考的知识点之一。本文主要String的用法进行分析。 
用String来定义一个字符串一般有两种方法: 
1.String str=”hello world”;, 2.String str=new String (“hello world ”)
第一种方式:String str=”hello world”,生成的str是一个字符串常量。放在常量池中,所谓的常量池,是指给每个class类编译时分配的用来保存class中的常量值,或者常量字符串的一个区域。对于每一个字符串在常量池中只保留一个值,每次用第一种方式定义一个字符串时,jvm就会在常量池中找有没有相同的字符串,有就返回一个该字符串的地址,如果没有在常量池中生成该字符串。举个例子: 
定义String str=”helloworld”时 jvm会先在常量池中找有没有常量“helloworld”,因为我们是第一次定义因此并没有“helloworld”,此时jvm会在常量池中给“helloworld”分配一个地址,并且在栈中给str分配地址;如下图

这里写图片描述

先在在定义一个 String str1=“helloworld”,此时jvm会先在常量池中找看有没有常量值等于“helloworld”的找到了之后直接在栈中为str1分配一个地址,然后让str1引用常量池中的“helloworld”,此时不再生成“helloworld”如下图:

这里写图片描述

也就是说用第一种方法定义n个相同的字符串,它们都是指向常量池中的同一个常量。 
用第二种方式:String str=new (“hello world ”);是生成一个字符串对象,该对象存放在堆内存中,当用第二种方法生成多个相同字符串的对象时,便会在堆中生成多个字符串对象。如下:

<code>这里写图片描述</code>

 

最后我们用程序来检验一下看看方法一和方法二生成字符串的区别: 
在检验之前我们先对字符串中的两种常用的比较方法进行说明:str==str1,与str.equals(str1)的区别,str==str1是比较两个字符串是否指向的是同一个实体,或者说是不是对同一个实体的引用,str.equals(str1),则仅仅是比较两个字符串是否相同而不管他们是不是对同一个实体的引用。

public class StringTest {


    public static void main(String[] args) {
        String str="helloworld";
        String str1="helloworld";
        String str2=new String("helloworld");
        String str3=new String("helloworld");
        System.out.println(":"+(str==str1));
        System.out.println(":"+(str1==str2));
        System.out.println(":"+(str2==str3));
        System.out.println(":"+str.equals(str3));
    }


}

输出的结果如下: 
:true 
:false 
:false 
:true 
由此可知str与str1是引用的同一实体,而str2与str3引用的是不同实体。且str指向的字符串值与str3相同。

原文链接https://blog.csdn.net/u013309870/article/details/52060106

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值