(1)“==” 用于比较基本数据类型时比较的是值,用于比较引用类型时比较的是引用指向的地址。(2)Object 中的equals() 与 “==” 的作用相同,但String类重写了equals()方法,比较的是对象中的内容。
String创建的两种方式
String s1="aaa",在常量池获取对象,如果存在则直接引用
String s2=new String("aaa"); 一共会创建两个字符串对象一个在堆中,一个在常量池中(前提是常量池中还没有 "aaa" 对象)
1 String s1="aaa"; 2 String s2=new String("aaa"); 3 System.out.println(s1==s2); #flase 4 System.out.println(s1.equals(s2)); #true
String类型的常量池比较特殊。它的主要使用方法有两种:
(1)直接使用双引号声明出来的String对象会直接存储在常量池中。
(2)如果不是用双引号声明的String对象,可以使用 String 提供的 intern 方法。 String.intern() 是一个 Native 方法,它的作用是: 如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用; 如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用
String s1 = new String("AAA"); #堆 String s2 = s1.intern(); #常量池 String s3 = "AAA"; #常量池 System.out.println(s2);//AAA System.out.println(s1 == s2);//false,因为一个是堆内存中的String对象一个是常量池中的String对象, System.out.println(s2 == s3);//true, s1,s2指向常量池中的”AAA“
字符串拼接:
String s1="a"; String s2="b"; String c=s1+s2; String d="a"+"b"; String f="ab"; System.out.println(c==d); System.out.println(d==f);