1.判断定义为String类型的s1和s2是否相等?
String s1 = " abc ";
String s2 = " abc ";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
结果:
true
true
知识点 | 内容 |
---|---|
== | “等于”,Java中如果是基本数据类型,==比较的是其值是否相等;若果是引用数据类型,比较的是其在内存中存放的地址是否相等。若相等返回为true,反之为false。 |
equals | Java中所有的类都是继承于Object这个超类下的,在Object中定义了一个equals的方法,这个初始行为是比较对象的内存地址,但是一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自生的实现,而不再是比较类在堆中的存放地址了。String类中equals比较的是其对象的内容(字符序列)是否相同。 |
2.下面这句话在内存中创建了几个对象?
String s1 = new String(" abc ");
结果:
两个对象
知识点 | 内容 |
---|---|
public String( String original ) | 优先在常量池中创建“abc”字符串参数,在堆内存中创建的字符串参数是常量池中的副本其地址值指向引用s1。 |
3.判断定义为String类型的s1和s2是否相等?
String s1 = new String( "abc" );
String s2 = " abc ";
System.out.println( s1 == s2 );
System.out.println( s1.equals( s2 ));
结果:
false
true
- 题中s1指向的是堆内存的地址值,s2指向的是常量池的地址值。
4.判断定义为String类型的s1和s2是否相等?
String s1 = "a" + " b " + " c ";
String s2 = " abc ";
System.out.println( s1 == s2 );
System.out.println(s1.equals( s2 ));
结果:
true
true
知识点 | 内容 |
---|---|
常量优化机制 | Java编译器有常量优化机制,题中“abc"为字符串常量,譬如类似的面试题 byte b1 = 3; byte b2 = 4; byte b3 = b1 + b2; byte b4 = 3 + 4; b3错误,b4正确。 |
5.判断定义为String类型的s1和s2是否相等?
String s1 = " ab ";
String s2 = " abc ";
String s3 = s1 + " c ";
System.out.println( s3 == s2 );
System.out.println( s1.eaquals( s2 ));
结果:
false
true
- s1+ “ s2 ” 中,s1相当于一个字符串变量,不能直接相加了。Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的。