《Java程序猿面试笔试宝典》之字符串创建与存储的机制是什么

在Java语言中。字符串起着非常关键的数据。字符串的声明与初始化主要有例如以下两种情况:
(1) 对于String s1=new String(“abc”)语句与String s2=new String(“abc”)语句,存在两个引用对象s1、s2,两个内容同样的字符串对象”abc”。它们在内存中的地址是不同的。仅仅要用到new总会生成新的对象。

(2) 对于String s1 = “abc”语句与String s2 = “abc”语句。在JVM中存在着一个字符串池,当中保存着非常多String对象,并且能够被共享使用,s1、s2引用的是同一个常量池中的对象。因为String的实现採用了Flyweight的设计模式。当创建一个字符串常量的时候。比如String s = “abc”,会首先在字符串常量池中查找是否已经有同样的字符串被定义,它的推断根据是String类equals(Object obj)方法的返回值。

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

因为String是不可变类,一旦创建好了就不能被改动,因此String对象能够被共享并且不会导致程序的混乱。
详细而言:
String s=“abc”; //把“abc”放到常量区中,在编译时产生。
String s=“ab”+”c”; //把“ab”+“c”转换为字符串常量“abc”放到常量区中。
String s=new String(“abc”); //在执行时把“abc”放到堆里面的。
比如:
String s1=“abc”; //在常量区里面存放了一个”abc”字符串对象
String s2=“abc”; //s2引用常量区中的对象,因此不会创建新的对象
String s3=new String(“abc”) //在堆中创建新的对象
String s4=new String(“abc”) //在堆中又创建一个新的对象
为了便于理解。能够把String s = new String(“abc”)语句的执行人为地分解成两个过程:第一个过程是新建对象的过程,即new String(“abc”),第二个过程是赋值的过程,即String s=。

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

第一个过程中new String(“abc”)会调用String类的构造函数:
public String(String original){
//body
}
在调用这个构造函数的时候,传入了一个字符串常量。因此语句new String(“abc”)也就等价于”abc”和new String()两个操作了。假设在字符串池中不存在”abc”。则会创建一个字符串常量”abc”,并将其加入到字符串池中,假设存在。则不创建。然后new String()会在堆中创建一个新的对象。所以str3与str4指向的是堆中不同的String对象,地址自然也不同样了。

如图 5 5所看到的。

下图两种字符串存储方式

引申:对于String类型的变量s。赋值语句s=null与s=“”是否同样?
对于赋值语句s=null,当中s是一个字符串类型的引用,它不指向不论什么一个字符串。而赋值语句s=“”中 s是一个字符串类型的引用,它指向另外一个字符串(这个字符串的值为“”,即空字符串)。
常见笔试题:
new String(“abc”)创建了几个对象?
答案:一个或两个。假设常量池中原来有“abc”,那么仅仅创建一个对象,假设常量池中原来没有字符串“abc”,那么就会创建两个对象。

出自

p=180">Java程序猿面试笔试宝典官网

时间: 2024-10-07 06:02:17

《Java程序猿面试笔试宝典》之字符串创建与存储的机制是什么的相关文章

《Java程序猿面试笔试宝典》之volatile有什么作用

在由Java语言编写的程序中.有时候为了提高程序的执行效率,编译器会自己主动对其进行优化,把经常被訪问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(比如寄存器)中来读取这个值.而不会去内存中读取.这样做的一个优点是提高了程序的执行效率,但当遇到多线程编程时.变量的值可能由于别的线程而改变了,而该缓存的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致.比如,在本次线程内,当读取一个变量时,为提高存取速度,会先把变量读取到一个缓存中,当以后再取变量值时,就直接从缓存中取值.

《Java程序猿面试笔试宝典》之Java与C/C++有什么异同

Java与C++都是面向对象语言,都使用了面向对象思想(比如封装.继承.多态等),因为面向对象有很多非常好的特性(继承.组合等),使得二者都有非常好的可重用性. 须要注意的是,二者并不是全然一样,以下主要介绍其不同点: (1)       Java为解释性语言,运行的过程为:源码经过Java编译器编译成字节码,然后由JVM解释运行.而C/C++为编译型语言,源码经过编译和链接后生成可运行的二进制代码.因此,Java的运行速度比C/C++慢,可是Java能够跨平台运行,而C/C++不能. (2) 

《Java程序猿面试笔试宝典》之Statickeyword有哪些作用

statickeyword主要有两种作用:第一,仅仅想为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关.第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就能够通过类来直接调用方法或使用类的属性.详细而言.static在Java语言中主要有四种使用情况:成员变量.成员方法.代码块.内部类. (1)static成员变量 尽管Java语言中没有全局的概念,但能够通过statickeyword来达到全局的效果.Java类提供了两种类型的变量:用static

《Java程序员面试笔试宝典》之字符串创建与存储的机制是什么

在Java语言中,字符串起着非常重要的作用,字符串的声明与初始化主要有如下两种情况:(1) 对于String s1=new String("abc")语句与String s2=new String("abc")语句,存在两个引用对象s1.s2,两个内容相同的字符串对象"abc",它们在内存中的地址是不同的.只要用到new总会生成新的对象. (2) 对于String s1 = "abc"语句与String s2 = "

《Java程序员面试笔试宝典》终于在万众期待中出版啦~

<Java程序员面试笔试宝典>终于在万众期待中出版啦~它是知名畅销书<程序员面试笔试宝典>的姊妹篇,而定价只要48元哦,恰逢求职季节,希望本书的出版能够让更多的求职者能够走进理想的企业 在这里,众多知名企业面试官将为你撕开神秘的求职面纱: 在这里,各种求职达人将现身说法为你揭开求职谜团: 在这里,各种类型的企业招聘细节都会被展露无疑: 在这里,我们将为你抽丝剥茧,还原IT行业的真相: 在这里,我们将为你指点迷津,告诉你职场上的风风雨雨: 在这里,我们将为你点石成金,成为那盏指引你前

《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法

public staticvoid main(String[] args)为Java程序的入口方法,JVM在运行程序的时候,会首先查找main方法.其中,public是权限修饰符,表明任何类或对象都可以访问这个方法,static表明main方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名.main()直接访问,JVM在启动的时候就是按照上述方法的签名(必须有public与static修饰,返回值为void,且方

JAVA程序员面试笔试宝典1

1.为什么Java中有些接口没有任何方法? 这些没有任何方法声明的接口又被称为标识接口,标识接口对于实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明它的类属于一个特定的类型. 2.java中的clone方法有什么作用? Object类提供了一个clone()方法,这个方法的作用是返回一个对象的复制.返回的是一个新的对象,而不是一个引用. 使用clone()方法的步骤: 实现clone的类首先需要继承Cloneable接口.Cloneable接口实质上是一个标识接口,没有任何接口

《PHP程序员面试笔试宝典》——如何回答算法设计问题?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 程序员面试中的很多算法设计问题,都是历年来各家企业的"炒现饭",不管求职者以前对算法知识掌握得是否扎实,理解得是否深入,只要面试前买本<程序员面试笔试宝典>,应付此类题目完全没有问题.但遗憾的是,很多世界级知名企业也深知这一点,如果纯粹是出一些毫无技术含量的题目,对于考前"突击手"而言,可能会占尽便宜,但对于那些技术好的人而言是非常不公平的.所以,为了把优秀的求职者与一般的求

《PHP程序员面试笔试宝典》——如何回答系统设计题?

如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 应届生在面试时,偶尔也会遇到一些系统设计题,而这些题目往往只是测试求职者的知识面,或者测试求职者对系统架构方面的了解,一般不会涉及具体的编码工作.虽然如此,对于此类问题,很多人还是感觉难以应对,也不知道从何处答题. 如何应对此类题目呢?在正式介绍基础知识之前,首先列举几个常见的系统设计相关的面试.笔试题. 题目1:设计一个DNS的Cache结构,要求能够满足5000次/s以上的查询,满足IP数据的快速插入,查询的速度要快(题目