Java String初始化String域例题解析
练习:
创建一个类,它包含了一个定义时就被初始化了的String域,以及另一个通过构造器初始化的String域,这两种方式有何差异.
看这一段程序以及结果,首先明确三个知识点:
1.String是引用对象
2.equals()比较的是值
3."=="是比较的地址
Strings1="abc"; Strings2="abc"; Strings3=newString("abc"); Strings4=newString("abc"); System.out.println(s1==s2);//true System.out.println(s3==s4);//false System.out.println(s1==s3);//false System.out.println(s1.equals(s2));//true System.out.println(s1.equals(s3));//true
java有两类存储类型,一类是基本类型的变量,如int,float等,一类是引用对象,如String,自己创建的各种class,数组等等,就是需要new的
一般存储在两个地方,栈中存放基本类型和对象的引用变量,new出来的对象放在堆中
除此之外,还有块区域常量池,Strings1="abc","abc"就存在常量池中,在我们又创建一个Strings2="abc"后,java底层在常量池中找到了"abc",就让s2指向这个值,不再重新创建.所以第一个为true,
而我们new的则在堆中,不会进行检查,所以地址不一样.
再看一个例子
Strings1="aaa"; Strings2="bbb"; Strings3="aaabbb"; System.out.println(s3==s1+s2);//false System.out.println(s3==("aaa"+"bbb"));//true
这个例子的中s3==s1+s2当进行比较时,java为"s1+s2"在堆中开辟一个内存,然后再拼接字符串
"aaa"+"bbb"则进行拼接后,在常量池发现"aaabbb"所以相等.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。