DESKTOP-JM545O1_20200828-李东鹏

一. 问题

 String x = "疑是" ;
 String y = "地上霜" ;
 String s = "疑是地上霜" ;
 String p = x + y ; // 注意这里的 + 起连接作用(连接字符串)
 System.out.println( s == p ); // false

这里

Sring p=x+y ;

是构造新的实例将地址传给p。p和s的hashcode都为-1468149244,p地址值identityHashCode为1562557367,s的地址值为1101288798,它们的地址值不一样,它们所指向的内存区间不同。

  
StringBuilder builder = new StringBuilder( x ); // 在缓冲区中存放 "疑是"
builder.append( y ); // 在缓冲区末尾追加 "地上霜"
String p = builder.toString(); // 将缓冲区中的内容 构造 成 String实例 (即创建新的String实例)
char[] data = { 'h' , 'e' , 'l' , 'l' , 'o' };
      // 注意,使用 new String(...)形式创建 String实例存在于堆空间中
      String x = new String( data ); // 此时,引用变量x指向堆中的String实例
      
      // 规范化表示形式
      String s = "hello" ; // "hello" 对应的String实例存在于 字符串池 ( String常量池 )
      
      // 当调用intern方法时,
      // 如果 字符串池 已经包含一个等于此 "String实例" 的 "String实例"(用 equals(Object) 方法确定),则返回 字符串池中 的 String实例 的引用。
      // 否则,将此 String实例 添加到 字符串池 中,并返回此  String实例 的引用
      String t = x.intern();
      System.out.println( s == t ); // true
      System.out.println( s == x ); // false

上面例子中,x调用intern的时候,字符串池存在"hello" 对应的String实例,并且字符串相等,所以返回字符串池中的 String实例s 的引用。s和t 的地址值相等。

char[] data = { 'h' , 'e' , 'l' , 'l' , 'o' };
String x = new String( data );
String t = x.intern();
String s = "hello" ;x
System.out.println( s == x ); // true
System.out.println( t == s ); // true
System.out.println( x == t ); // true

上面例子中,x调用intern的时候,字符串池不存在任何的String实例,x对应的String实例直接添加到字符串池中,"hello"的String实例与x对应的String实例进行比较,相等返回字符串池中的String实例x的引用

这两次比较都是返回字符串池里的String实例

二. 吐槽

一周又结束了,好快呀

标签

© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1