字符串在比较大小的时候,一般采用equals,equels比较的是字符串的内容是否相同。
虽然平时基本不会用 == 比较字符串的大小,但是使用 == 比较字符串大小可以学到很多知识。== 比较的是内存地址。
String s1 = "ab";
// 首先会在常量池中查找是否存在ab这个字符串,如果不存在就会创建,如果存在就直接引用。
String s2 = new String("ab");
// 会在堆内存中创建一个新的对象,与常量池中的字符串变量不是同一个位置。
System.out.println(s1==s2);
// false,因为所在的位置都不同,s1在常量池中,s2在堆内存中。
String s3 = "ab";
// 直接引用常量池中的ab字符串
System.out.println(s1==s3);
// true,s1和s3都是指向常量池中相同的对象
String s4 = new String("ab");
System.out.println(s2==s4);
// false, s2和s4都是堆内存中的对象,但是他们new时都会在堆内存中创建一个新的对象,所以不是同一个对象。
接下来时字符串拼接比较大小
String s1 = "ab";
String s2 = "cd";
String s3 = "abcd";
String s4 = "ab"+"cd";
String s5 = s1+s2;
System.out.println(s3=s4);
// true,s4是两个字符串常量进行拼接,在字符串常量拼接时会进行常量池优化,优化后的常量是abcd,所以s4指向的是常量池中abcd字符串。s3也指向常量池中abcd的字符串。
System.out.println(s3=s5);
// false,s5=s1+s2,因为s1和s2是对象,他们是指向常量池的引用,在拼接时不会进行常量池优化,会在堆内存中创建一个新的对象。
final String s7 = "ab";
final String s8 = "cd";
String s9 = s7+s8;
System.out.println(s3=s9);
// true,使用final定义的s7和s8,所以s7和s8是常量,在相加时会进行常量池优化,所以s9指向常量池中的abcd,所以s9与s3相同。