java final String和String笔记

final String a="hello";
String b="hello";
String c="hellow";
String d=new String("hello"); 
System.out.println(a==b);
System.out.println("hell"+"ow"==c);
System.out.println((a+"w")==c);
System.out.println((b+"w")==c);
System.out.println(b==d);

上面代码的执行结果为

true
true
true
false
false

下面是我在看了别人的文章后,结合对于C/C++的了解后得出的分析:
对于修饰变量的final关键字可以理解为C语言中的const关键字,表明了变量是一个常量。对于String类的底层实现,和C++中的类似,也可以理解为对const char的封装。因此a,b,c的初始化都是将常量区中字符串的地址赋值给变量,不同的是对于变量a的理解为:typedef const char String; const String a="hello";即a指向地址不能变并且地址保存内容不能变。而d变量保存的则是通过new操作得到的堆上的地址,然后会把常量区字符串给拷贝到堆上的地址空间。java中对于final修饰的变量,在编译前直接把变量替换为值,类似于宏,因此a+"w"会替换为"hello"+"w",对于这一个操作,java会直接在常量区中找"hellow",如果没找到,就会在常量区创建一个"hellow",这一点可以从"hell"+"ow"c为true得到验证。而对于b变量没有被final修饰,所以b+"w"的操作,应该是String类型重载的+操作,这是在编译后执行的,由于String底层是const char*,所以应该会重新在堆上开辟空间后将地址赋值给b。上面这些比较的都是地址值,所以会出现上述执行结果。

posted @ 2020-07-12 23:43  qetuo[  阅读(1917)  评论(0编辑  收藏  举报