java:String

栏目: Java · 发布时间: 6年前

内容简介: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.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

今日简史

今日简史

[以] 尤瓦尔·赫拉利 / 林俊宏 / 中信出版集团 / 2018-8 / 68

四年前,尤瓦尔•赫拉利的《人类简史》横空出世,颠覆了我们关于人类进化的认知。2016年,他的《未来简史》再度惊艳四座,刷新了我们对未来的想象,掀起了全球关于人工智能讨论的新思潮。现在,“简史三部曲”收官之作《今日简史》推出,将目光聚焦到当下,直面今天关乎我们每个人命运的问题和挑战。 尤瓦尔•赫拉利认为,智人之所以能够崛起成为地球的主宰者,主要原因在于其具备了虚构故事的能力。然而,在当前这样一......一起来看看 《今日简史》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具