String str1="Hello",String str2=new String("Hello")

package com.HelloWorld;
/*
String str1= "hello", String str2="he"+"llo";之所以str1==str2返回true是因为两者都是在字符串常量池中
(由于初始化就会在此区域分布内存)而常量池中的有个与栈区类似的特性,就是当str2指向的常量在常量区已存在时,
他不会创建新的内存空间来存此常量,而是指向已有常量的内存(应该是以此节约空间),此时str1与str2这两个引用变
量的值都是存"hello"的内存空间地址,但是String str3= "he"+a;String a="llo";时str1==str3返回的为false,
是因为:str1指向的hello在编译期一如既往的还是分配在常量区内,a指向的llo也在常量区,虽然str3也是初始化但是
编译器无法判断a这货到底是什么个情况,进而不会将str3的等号右侧声明在常量区内,而是在通过构造时在堆区中的非常
量池外的内存中声明,至此str3与str1不止是分配内存的时期不同(一个在编译期,一个在运行期)而且在内存空间的区
域也不同,上面最高票答案只区分了时间没区分空间。
*/
public class StringOne {

public static void main(String[] args) {
  String str1="kobe";
  String str7="kobe";//str1与str7同时指向kobe字符串
  String str2="bryant";
  String str3="kobebryant";
  String str4="kobe"+"bryant";
  String str5="ko"+"be"+"bryant";
  String str6=str1+str2;
  System.out.println(str1==str7);//true
  System.out.println(str3==str4);//true
  System.out.println(str3==str5);//true
  System.out.println(str3==str6);//false
  System.out.println(str3.equals(str6));//true
  String str8;
  str8=str7;
  str8="ok";//str8重新指向ok字符串
  System.out.println(str1);//kobe

  }

}

猜你喜欢

转载自www.cnblogs.com/zhujialei123/p/8971720.html
今日推荐