public class Test
{
public static void main(String[] args)
{
String str1 = new String("abc");
//上面这句话创建了二个对象,一个对象是在字符串池创建的,另外一个对象是在堆里创建的。
//如果前面字符串池有字面值为"abc"的对象,则不会再次创建。
//String str1这个不是对象,它只是一个对象的引用。
String str2 = "abc";
//结合上面已经在字符串池已经创建了字面值为"abc"的对象。则不再继续创建。所以这句话没有创建任何对象。
String str3 = new String("abc");
//上面这句话创建了一个对象。就堆里的那个对象,字符串池中已经存在了字面值为"abc"的对象。
System.out.println(str1 == str2);// flase;
//一个字符串池中的对象和一个堆里创建的对象,不相等
System.out.println(str1 == str3);// false
//二个堆里创建的对象,不相等
System.out.println(str2 == str3);// false
//String类维护一个初始为空的字符串的对象池,当intern方法被调用时,
//如果对象池中已经包含这一个相等的字符串对象则返回对象池中的实例,
//否则添加字符串到对象池并返回该字符串的引用。
System.out.println(str1 == str1.intern());// flase;
//一个堆中对象一个返回池中的对象,二个值不相等
System.out.println(str2 == str2.intern());// true
//都是返回池中的对象,
System.out.println(str1.intern() == str3.intern());// true
//都返回字面值为"abc"的、在字符串池中的该对象值
String str4 = "hello";
String str5 = "hel";
String str6 = "lo";
System.out.println(str4 == "hel" + "lo");// true
//"hel" + "lo"这里创建了二个对象。在做完"+"操作后会先判断字符串池中是否存在""hello"的对象,如果存在则不再创建,否则创建。
//只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入字符串池中
System.out.println(str4 == "hel" + str5);// false
//对于所有包含new方式新建对象(包括null)的“+”连接表达式,它所产生的新对象都不会被加入字符串池中.
System.out.println(str4 == "hel" + str6);// false
}
}
详细讲解Java中的方法参数传递机制,介绍string的不可变性
最新推荐文章于 2022-10-19 10:44:45 发布