String

运行

package com.zw.util;

import com.zw.domain.Role;
import com.zw.domain.Shop;

import java.util.HashSet;
import java.util.Set;

/**
* @author liuzw
* @email liuzw1@hua-cloud.com.cn
* @date 2019/3/23 17:09
*/
public class Test {

public static void main(String [] args){
String s1 = "wangwu";
String s2 = "wangwu";
String s3 = "wang"+"wu";
String s4 = "wang";
String s5 = "wu";
String s6 = s4+s5;
String s7 = "wang".concat("wu");
String s8 = s4.concat(s5);
// s3 = s1;
// s1 = "lisi";

System.out.println(s2 == s6);
System.out.println(s2 == s6.intern()); //s4+s5是引用相加放在堆里 intern()如果常量池中已经存在该字符串,则直接返回常量池中该对象的引用,比从堆中拿快,提高效率
System.out.println(s2 == s7);
System.out.println(s3 == s7);
System.out.println(s6 == s8);
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s2==s3);
}
}


String存放位置

1.直接定义字符串变量的时候赋值,如果表达式右边只有字符串常量,那么就是把变量存放在常量池里面。

    2.new出来的字符串是存放在堆里面。

    3.对字符串进行拼接操作,也就是做"+"运算的时候,分2中情况:

      i.表达式右边是纯字符串常量,那么存放在栈里面。

      ii.表达式右边如果存在字符串引用,也就是字符串对象的句柄,那么就存放在堆里面。

原文地址:https://www.cnblogs.com/luizw/p/10641256.html