内容简介:String类是final类,它内部的方法也默认被final修饰,不能重写.当这样声明一个字符串JVM会检测字符串常量池中是否存在这个值的字符串,如果存在,就直接赋值给str,否则创建一个新的,再赋值给str.
String类是final类,它内部的方法也默认被final修饰,不能重写.
字符串常量池
当这样声明一个字符串
String str = "hello java";
JVM会检测字符串常量池中是否存在这个值的字符串,如果存在,就直接赋值给str,否则创建一个新的,再赋值给str.
当连续用同样的方式声明两个字符串并作比较
String str1 = "hellojava"; String str2 = "hellojava"; boolean flag = str1==str2;//true
结果为true.
当我们这样声明
String str1 = "hello"; String str2 = "java"; String str3 = "hellojava"; String str4 = str1+str2; boolean flag = str3==str4;//false
结果为false.这是因为str4是有两个引用类型结合而成,它的值在编译期无法确定.
如果将str1和str2声明为final类型
final String str1 = "hello"; final String str2 = "java"; String str3 = "hellojava"; String str4 = str1+str2; boolean flag = str3==str4;//true
str1和str2都是被final修饰的字符串常量,那么str4在编译期就可以被确定.因此结果是true.
通过new创建字符串
String str3 = "hellojava";
String str4 = new String("hellojava");
boolean flag = str3==str4;//false
这是因为new会在堆中创建一个hellojava的实例对象,并用栈中的str4指向它.而str3指向的是方法区中字符串常量池中的hellojava.当然堆中的hellojava指向的也是字符串常量池中的hellojava(如果存在的话).
要了解一下str3和str4的声明做了什么?
先声明str3.会在方法区的字符串常量池中直接创建一个字符串"hellojava",使str3指向它.紧接着用new创建str4时,会先查找字符串常量池中是否包含字符串"hellojava".如果有直接返回,没有就在常量池中创建.然后在堆中创建实例对象,并将这个实例对象指向常量池中的字符串"hellojava",然后将实例对象赋给栈中的str4.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
RESTful Web Services Cookbook
Subbu Allamaraju / Yahoo Press / 2010-3-11 / USD 39.99
While the REST design philosophy has captured the imagination of web and enterprise developers alike, using this approach to develop real web services is no picnic. This cookbook includes more than 10......一起来看看 《RESTful Web Services Cookbook》 这本书的介绍吧!