本帖最后由 舞动炫龙 于 2016-1-21 13:31 编辑
1.判断定义为String类型的s1和s2是否相等
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
解释:
1.String类型的字符串是常量,存储在常量池中,常量池中没有这个字符串对象,就创建一个,如果有直接用即可,所以s1和s2里面存储的是一样的地址
2.String类中的equals()方法重写了父类的,判断的是相同字符序列的字
2.下面这句话在内存中创建了几个对象?
String s1 = new String("abc"); //创建两个对象,一个在常量池中,一个在堆内存中
依据:API参考文档:
public String(String original)
初始化一个新创建的 String 对象,在堆内存中新创建的字符串对象是该参数字符串的副本。
解释:
1.先在常量池中创建"abc",并分配一个地址值(当然要是常量池中有就直接用不在创建)
2.new String就是在堆内存中创建一个对象,然后把常量池中的"abc"的副本放到了堆内存中的new String中,并把分配的地址值赋值给s1,并且和常量池中的地址不一样
3.判断定义为String类型的s1和s2是否相等
String s1 = new String("abc"); //记录的是堆内存对象的地址值
String s2 = "abc"; //记录的是常量池中的地址值
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
4.判断定义为String类型的s1和s2是否相等
String s1 = "a" + "b" + "c";
解释:java中有常量优化机制,编译器编译的时候就会使其变成"abc"; 就像byte b = 3+4; 在编译时就变成7,把7赋值给b,常量优化机制
String s2 = "abc";
解释:由于上句就已经在常量池中创建了"abc"了,所以就直接用就行了
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2));//true
5.判断定义为String类型的s2和s3是否相等
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2); //false
System.out.println(s3.equals(s2)); //true
解释:1.s1指向常量池中的"ab";s2指向常量池的"abc";
2.s1 + "c";字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。也就是说s3里面存储的是堆内存中的地址值
3.s2记录的是常量池的地址值,s3记录的是堆内存中的地址值,所以是false
|
|