天天看点

java基础面试题:字符串存储机制解析。字符串创建与存储的机制是什么?哈喽,大家好,我是架构师奶爸。在java语言中字符

作者:架构师奶爸

java基础面试题:字符串存储机制解析。

字符串创建与存储的机制是什么?哈喽,大家好,我是架构师奶爸。在java语言中字符串起着非常重要的作用。字符串的声明与初始化主要有如下两种情况:

·1、对于Strings1=newString("abc")语句。Strings2=newString("abc"),存在两个引用对象s1、s2,两个内容相同的字符串对象abc。它们在内存中的地址是不同的,只要用到new总会生成新的对象。

·2、对于Strings1=abc语句与Strings2="abc"语句。在jvm中存在着一个字符串池,其中保存着很多的String对象并且可以被共享使用。s1、s2引用的同一个常量池中的对象。

由于String的实现采用了Flyweight的设计模式,当创建一个字符串常量时,例如:Strings="abc",会首先在字符串常量池中查找是否已经有相同的字符串被定义,其判断依据是String类equals(Objectobj)方法的返回值。

若已经定义则直接获取对象的引用,此时不需要创建新的对象。若没有定义则首先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。

由于String是不可变类,一旦创建好了就不能修改,因此String对象可以被共享而且不会导致程序的混乱。

具体而言来看一段代码:

·第一个s是把abc放到常量区中,在编译时产生。

·第二个s是把abc转换为字符串常量abc放到常量区中。

·第三个s是在运行时把abc放到堆里面。

再看一段代码如上图:s1是在常量区里面放了一个abc字符串对象,s2引用常量区中的对象,因此不会创建新的对象。s3在堆中创建新的对象,s4在堆中又创建了一个新的对象。为了便于理解可以把String s=newString("abc")语句的执行。分解成两个过程。第一个过程是新建对象的过程,即newString("abc");第二个过程是赋值的过程,即String s。

由于第二个过程只是定义了一个名为s的String类型的变量,将一个String类型对象的引用赋值给s,因此在这个过程中不会创建新的对象。

·第一个过程中,newString("abc")会调用String类的构造函数,在调用这个构造函数时传入了一个字符串常量,因此语句newString(abc)等价于abc和newString两个操作了。若在字符池中不存在abc,则会创建一个字符串常量abc,并将其添加到字符串池中。若存在则不创建。

newString会在堆中创建一个新的对象,所以s3与s4指向的是堆中不同的String对象,地址自然也不相同了。如上图所示。

想学习更多java编程知识,请关注我架构师奶爸,共同筑基java架构师。

java基础面试题:字符串存储机制解析。字符串创建与存储的机制是什么?哈喽,大家好,我是架构师奶爸。在java语言中字符
java基础面试题:字符串存储机制解析。字符串创建与存储的机制是什么?哈喽,大家好,我是架构师奶爸。在java语言中字符
java基础面试题:字符串存储机制解析。字符串创建与存储的机制是什么?哈喽,大家好,我是架构师奶爸。在java语言中字符
java基础面试题:字符串存储机制解析。字符串创建与存储的机制是什么?哈喽,大家好,我是架构师奶爸。在java语言中字符

继续阅读