Java 不同方式,不同位置创建String字符串的区别

Java 不同方式,不同位置创建String字符串的区别

最近翻看Java编程思想 第四版,其中一个练习题是:类中初始化的String和构造函数里初始化的区别,针对新建String的不同位置、方式来做如下测试
1、不同位置新建String的区别:

public StringTest{
private String str1 =  "cai"
private String str2;
public StringTest(){
str2 = "hua";
}
}
public class TestString {
    public static void main(String[] args)
    {
        System.out.println("str1 :" + new StringTest().str1);
        System.out.println("str2 :" + new StringTest().str2);
    }

}

输出结果:
str1:cai
str2:hua

针对以上输出结果,我们可以做出如下描述:
首先 new StringTest()时先会执行
String str1 = “cai”;
String str2;
这样str1 被初始化成了”cai”
str2被初始化成了null
然后再执行构造方法
str2成了”hua”

区别就是str2被初始化了2,str1被初始化了1回,同时str1声明时为成员变量赋值,那么我们一创建new StringTest()这个对象,这个String str1=”cai”赋值就进行,所以str1优先于构造函数里的str2执行。
我们每次创建这个类的对象,str1都是同一个值,那么每一个新创建的对象的str1值都是被初始成 cai,这样在某些应用场景时有些不灵活,如果我们把赋值语句写在构造函数里,比如:

StringTest(String str){
str= "cai";
}

那么我们每次创建对象时都可以单独为每一个对象赋值不同的str。比如我们创建10个StringTest对象,它们的传值参数可以有10种不同值,所以在有些合适的应用场景里初始化或者赋值可以写进构造器,为每一个对象赋不同的值。

2、不同方式创建的String区别:
String str=new String(“cai”);
String str=”cai”;
第一种创建方式是Java标准的创建方式,这种方式创建的对象将会保存在中,每采用这种方式创建一个对象,都会在堆上面新增一个对象;第二种方式会在栈中创建一个对象引用变量str,然后查看栈的字符串池中是否有”cai”,如果没有则把”cai”放入字符串池中,并让str的引用变量指向”cai”,如果字符串池中已经有”cai”的存在,则直接让str的引用指向”cai”即可。这样充分利用了栈的数据共享优点,当然也可能有问题出现,对象很有可能没有创建,只不过指向一个先前已经创建的对象;而new()方法则能保证每次都指向新创建象。
下面我们采用代码来验证:

public class Main {

 public static void main(String[] args) { 
    String strA = "cai"; 
    String strB = "cai"; 
   String strAA = new String("cai"); 
    String strBB = new String("cai"); 
     System.out.println(strA == strB); 
     System.out.println(strAA == strBB); 
 } 
}

输出结果:
true
false
strA 和 strB 都是指向同一个内存地址
jvm会先去常量字符串池中找有没有”cai”,有的话就把strA指向”cai”,没有就会先在池中创建一个,再让strB指向”cai”。
String s = new String(“cai”);
这句是先定义一个String变量s,然后在内存中分配新的空间”abc”再让s指向这个内存地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值