问题1:String s1 = new String("abc");
String s2 = "abc";两者有区别么?
两句语句是同样的效果,但方式不同;
s1在内存中创建了两个对象,在堆内存中new出了一个对象,又因为字符串是存放在常量池中的,new出来的对象里面只是存了一个方法区地址,然后在常量池中创建了一个“abc”的对象,new出来的对象指向了常量池中“abc”的地址,然后又把new出来对象的地址给s1。
s2只是在常量池中创建了一个对象,然后直接把方法区中的常量池中的地址给s2。
问题2:String s = "hello";
s += "world";
System.out.println(s);请问打印s的值是什么?
这个问题的难点在于字符串是常量,不能改变,但对象的引用地址值是可以改变的,会打印出helloworld。
问题3:String s1 = "hello";
String s2 = "world";
String s3 = "hello"+"world";
String s4 = "helloworld";
String s5 = s1+s2;
提问:(==比较的是地址值,equals比较的是内容,因为String类重写了了此方法)
System.out.println(s3==s4); //true 因为字符串是常量,JVM在编译的时候会自动处理,s3和s4指向的是同一个地址
System.out.println(s3.equals(s4));//true equals 在Object默认是比地址的哈希码值的,但是String重写了equals方法,比较的是内容
System.out.println(s4==s5);//false 因为JVM在处理程序的时候,s5是由两个变量得来的,会重新开辟一个地址
System.out.println(s4.equals(s5));//true equals 在Object默认是比地址的哈希码值的,但是String重写了equals方法,比较的是内容
|
|