JAVA系列:String容易出错的用法

 

 

(1)下面这段代码的输出结果是什么? 

String a = "hello2";   

String b = "hello";  

String c = b + 2;  

System.out.println((a == c));

 

 由于有符号引用的存在,所以  String c = b + 2;不会在编译期间被优化,不会把b+2当做字面常量来处理的,因此这种方式生成的对象事实上是保存在堆上的。因此a和c指向的并不是同一个对象。 输出结果为:false。

 

(2)下面这段代码的输出结果是什么?

String a = "hello2";    

final String b = "hello";      

String c = b + 2;      

System.out.println((a == c));

  对于被final修饰的变量,会在class文件常量池中保存一个副本,也就是说不会通过连接而进行访问,对final变量的访问在编译期间都会直接被替代为真实的值。那么String c = b + 2;在编译期间就会被优化成:String c = "hello" + 2;输出结果为:true。

 

(3)下面这段代码输出结果为:

public class Main {

    public static void main(String[] args) {

        String a = "hello2";

        final String b = getHello();

        String c = b + 2;

        System.out.println((a == c));

    }

     

    public static String getHello() {

        return "hello";

    }

}

这里面虽然将b用final修饰了,但是由于其赋值是通过方法调用返回的,那么它的值只能在运行期间确定,因此a和c指向的不是同一个对象。输出结果为false。

 

(4)

  public static void main(String[] args) {

        String a = "hello";

        String b =  new String("hello");

        String c =  new String("hello");

        String d = b.intern();

         

        System.out.println(a==b);

        System.out.println(b==c);

        System.out.println(b==d);

        System.out.println(a==d);

    }

false

false

false

true

这里面涉及到的是String.intern方法的使用。在String类中,intern方法是一个本地方法,intern方法会在运行时常量池中查找是否存在内容相同的字符串,如果存在则返回指向该字符串的引用,如果不存在,则会将该字符串入池,并返回一个指向该字符串的引用。因此,a和d指向的是同一个对象。

>> String的intern()方法的使用

 

 

相关文章:

  • 2022-02-17
  • 2021-11-11
  • 2021-07-24
  • 2022-12-23
  • 2021-12-12
  • 2021-04-20
  • 2021-09-23
  • 2021-08-02
猜你喜欢
  • 2021-11-22
  • 2021-10-21
  • 2022-12-23
  • 2021-10-01
  • 2021-07-26
  • 2022-01-10
相关资源
相似解决方案