`

通过六个题目彻底掌握String笔试面试题

    博客分类:
  • Java
 
阅读更多

1

public static void main(String[] args){     String a = "a1";     String b = "a"+ 1;     System.out.println(a==b); }

  2

public static void main(String[] args){     String a = "ab";     String bb = "b";     String b = "a"+ bb;     System.out.println(a==b); }

  3

public static void main(String[] args){     String a = "ab";     final String bb = "b";     String b = "a"+ bb;     System.out.println(a==b); }

  4

public static void main(String[] args){     String a = "ab";     final String bb = getBB();     String b = "a"+ bb;     System.out.println(a==b); } private static String getBB(){ return "b"; }

  5

private static String a = "ab"; public static void main(String[] args){     String s1 = "a";     String s2 = "b";     String s = s1 + s2;     System.out.println(s == a);     System.out.println(s.intern() == a); }

  6

private static String a = new String("ab"); public static void main(String[] args){     String s1 = "a";     String s2 = "b";     String s = s1 + s2;     System.out.println(s == a);     System.out.println(s.intern() == a);     System.out.println(s.intern() == a.intern()); }
深入理解String——之前六个题目答案解析

1、通过java源码分析String

我们都知道String是不可变的(immutable),不变性的体现是:String类内部通过char数组来保存字符串,而这个char数组被声明为:final。那么为什么要将String类声明为不可变呢?了解设计模式的你应该知道有一种模式叫做“不变模式”(immutable pattern),String类的设计就是使用了不变模式,有兴趣的朋友可以看看“不变模式”讲的具体是啥东东。

说完String的不可变性,需要说说String的“final性”(其实也还是不可变性决定的)。这也是有些面试官会问到的问题:我能不能写一个类继承自String?为什么?我们来看看String类的声明:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence

对于final关键字的作用不用多解释了。其实这也是“强不变模式”的一种要求(类本身声明为final或所有方法声明为final)。

2、理解String对象的存储机制

要深入理解String必须先了解Java内存机制——运行时数据区(Runtime Data Area)。《The JavaTM Virtual Machine Specification》中将运行时数据区分为六部分(参看第三章):
1)The pc Register;2)Java Virtual Machine Stacks;3)Heap;4)Method Area;5)Runtime Constant Pool;6)Native Method Stacks;
以上数据区的具体描述可参考规范。需要注意的是,以上只是一个规范说明,并没有规定虚拟机如何实现这些数据区。

在说明String对象存储机制之前,我们需要先了解数据区的三个部分:Java 虚拟机栈(可以简称为Java栈)、堆和运行时常量池(简称常量池)。对于Java栈和堆大家应该比较熟悉,这里有一个关键点是常量池,下面就重点介绍一下与String相关的常量池。

首先大概描述一下什么是常量池:

虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,包括直接常量(string,integer和floating point常量)和对其他类型、字段和方法的符号引用。池中的数据项就像数组一样是通过索引访问的。因为常量池存储了相应类型所用到的所有类型、字段和方法的符号引用,所以它在Java程序的动态链接中起着核心的作用。

2.1 String相关常量池

在《The JavaTM Virtual Machine Specification》第四章有一节是专门讲解各种常量池的,其中有两个常量池是关于String的。

1)The CONSTANT_String_info Structure

对于常量池的细节此文不做过多介绍,polaris以后可能会写一序列关于Java虚拟机的文章。现在您可以查阅规范或在网上收集相关资料阅读。规范上对该常量池结构的介绍是:
The CONSTANT_String_info structure is used to represent constant objects of the type String.
在该常量池结构中引用了另一个常量池结构,如2)

2)The CONSTANT_Utf8_info Structure

规范上的描述是:
The CONSTANT_Utf8_info structure is used to represent constant string values.

根据上面的介绍可以看出,字符串字面值会存储在常量池中。下面来分析String对象的存储机制。

2.2 String对象的存储

请看这样两个语句:

String x = "abc";
String y = new String("abcd");

现在来分析一下内存的分配情况。如图:
深入理解String | 北极星为您引航
可以看出,x与y存在栈中,它们保存了相应对象的引用。第一条语句没有在堆中分配内存,而是将“abc”保存在常量池中。对于第二条语句,同样会在常量池中有一个“abcd”的字符串,当new时,会拷贝一份该字符串存放到堆中,于是y指向了堆中的那个“abcd”字符串。不知道polaris有没有讲明白。如果您明白了,那么做前面那六道题就没什么问题了。

3、六道题答案详解

题目不重复给出,题目在《通过六个题目彻底掌握String笔试面试题》

1)true

要说明一点:当两个字符串字面值连接时(相加),得到的新字符串依然是字符串字面值,保存在常量池中。

2)false

当字符串字面值与String类型变量连接时,得到的新字符串不再保存在常量池中,而是在堆中新建一个String对象来存放。很明显常量池中要求的存放的是常量,有String类型变量当然不能存在常量池中了。

 3)true

注意此题与上一题的区别,此处是字符串字面值与String类型常量连接,得到的新字符串依然保存在常量池中。

4)false

此题中第条语句:final String bb = getBB();其实与final String bb = new String(“b”);是一样的。也就是说return “b”会在堆中创建一个String对象保存”b”,虽然bb被定义成了final。可见并非定义为final的就保存在常量池中,很明显此处bb常量引用的String对象保存在堆中,因为getBB()得到的String已经保存在堆中了,final的String引用并不会改变String已经保存在堆中这个事实。

5)false,true

可能很多人对intern()这个函数不了解。JDK API文档中对intern()方法的描述是:

返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。

上面字符串池即为字符串常量池。明白该题结果的原因了吧。

6)false,false,true

第五题看明白后,第六题就没什么好讲的了。

4、结语

通过上面的讲解,对于字符串的常见笔试面试题应该没什么问题了吧。最后polaris给点建议:有时间看看The JavaTM Virtual Machine Specification。不一定要全看,至少看看前面几章。如果英文不好,可以买本《深入Java虚拟机(第二版》中文版。看了虚拟机的原理后,对Java一下子会有一个新的认识,相信您的水平也会上一个台阶。当然,在看的过程中,建议您做笔记,以后可以多复习复习,理论的东西可能比较容易忘,多复习几遍就可以记牢了。

另外推荐阅读来自JavaEye的请别再拿“String s = new String(“xyz”);创建了多少个String实例”来面试了吧

作者: polaris

本文引用地址: http://www.beijixing001.com/post/613.html

分享到:
评论

相关推荐

    c#笔试面试题 c#笔试面试题

    在C#这个编程语言的世界里,笔试和面试是评估...以上知识点只是C#笔试面试中的一部分,实际题目可能还会涉及异常处理、线程同步、单元测试、设计模式等方面。在准备面试时,建议全面复习并实践这些概念,以提高通过率。

    JAVA程序员笔试面试题汇总及答案.pdf,这是一份不错的文件

    "Java程序员笔试面试题汇总及答案.pdf知识点总结" 以下是从给定的文件中生成的相关知识点: ...这些知识点涵盖了 Java 程序员笔试面试题汇总及答案.pdf 中的多个方面,包括访问控制符、集合操作、输入输出、流等。

    java面试笔试题大汇总

    Java是一种广泛应用的编程语言,java面试笔试题大汇总涵盖了Java的多方面知识点,包括Java面试题目、多线程编程、通信编程、数据库查询、异常处理机制、事件机制、多形与继承、抽象类与接口、String与StringBuffer的...

    C#笔试面试题带答案

    这些都是面试和笔试中的基础题,对C#的理解程度通常从这些基本概念开始测试。 2. **面向对象编程**:C#是纯面向对象的语言,理解类、对象、继承、多态、封装等概念至关重要。面试中可能会问到如何创建和实例化类,...

    java笔试面试题 java 面试 题目

    Java笔试面试题是每个Java开发者在求职过程中必须面对的挑战,涵盖了从基础知识到高级概念的广泛范围。以下是一些常见的Java面试题及其详细解释,帮助你深入理解和准备这些知识点。 1. **Java基础** - **数据类型*...

    史上最全Java面试题目大集合

    整理了网上的一些java面试题目,很全很强大 面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面。抽象并不5. 打算了解全部问题...

    java面试题集锦 java面试题集锦

    这些面试题通常用于测试开发者对Java基础知识的掌握程度。理解JDK与JRE的区别可以帮助开发者理解开发环境和运行环境的不同需求,而`==`和`equals`的使用则涉及到对Java内存模型的理解,这是编写正确、健壮的Java代码...

    java程序员经典笔试面试题汇总

    ### Java程序员经典笔试面试题汇总知识点解析 #### 一、程序执行顺序与静态变量初始化 **题目背景**:本题目旨在考察Java程序中类的加载过程以及不同成员(如静态变量、非静态变量等)的初始化顺序。 **题目示例*...

    各大软件公司笔试面试题

    这份"各大软件公司笔试面试题"集合,无疑为准备面试的求职者提供了宝贵的资源。 首先,让我们来看看C/C++面试题通常涵盖哪些知识点: 1. **基础语法**:包括变量声明、数据类型、运算符优先级、流程控制语句(如if...

    php笔试面试题详解大全

    【PHP笔试面试题详解】 在准备PHP的面试或笔试时,了解并掌握这些常见问题至关重要。以下是对给定题目的一些详细解释: 1. **抓取远程图片到本地**:在PHP中,可以使用`fsockopen`或者`file_get_contents`结合`...

    Java笔试面试题详解

    Java作为一门广泛使用的编程语言,其面试和笔试题目往往涵盖了多个方面,包括设计模式、并发控制、内存管理、数据库优化、网络通信等。以下是对这些知识点的详细解释: 1. **MVC设计思想**:MVC(Model-View-...

    Java常见笔试,面试题目深度剖析

    Java作为一门广泛使用的编程语言,其笔试和面试题目往往涵盖了多个核心领域。下面将对这些领域进行深入解析,帮助你更好地准备Java相关的技术面试。 ### 字符串(String) 字符串在Java中是常用的数据结构,面试中...

    收集的各公司的java笔试面试题

    Java笔试面试题是求职者在寻求Java开发职位时必须面对的重要环节。这些题目通常涵盖了从基础知识到高级概念的广泛范围,旨在评估候选人的编程技能、理解力和问题解决能力。以下是一些可能出现在Java笔试面试中的关键...

    字节跳动Java笔试面试题汇总.zip

    这份"字节跳动Java笔试面试题汇总"包含了丰富的题目,旨在帮助求职者深入了解Java编程语言和字节跳动的技术栈需求。以下是一些核心Java知识点的详细解释: 1. **基础语法**:理解Java的基本语法,包括变量、数据...

    java笔试题,宝丰能源笔试面试题

    【知识点详解】 1. Java编程基础: - 类与对象:题目中的`Department`类代表了组织部门,包含了`id`、`OrgName`、`ParentId`和`Status`等属性,以及对应的getter和...对于面试者来说,熟悉并掌握这些知识点是必要的。

    原创一道Java笔试面试题考考大家

    根据提供的文件信息,我们可以分析出这是一道关于Java继承与方法重写的相关笔试面试题。题目涉及到了Java类的继承、方法重写、实例化对象时的调用顺序以及对象多态性等知识点。接下来,我们将对这些知识点进行详细的...

    Java常见笔试面试题

    Java作为一门广泛使用的编程语言,其面试和笔试题目往往涵盖了众多核心概念和技术。以下是对给定部分内容的详细解释: 1. **面向对象的特征** - **抽象**:抽象是将复杂的实体简化为只关注关键特性的过程。在Java...

    c++笔试面试题汇总

    ### C++ 笔试面试题知识点汇总 #### 一、链表反转 **知识点概述**: 链表反转是C++编程面试中一个常见的题目,主要考察候选人对于链表这一数据结构的理解以及对指针操作的熟练程度。链表反转可以采用多种方法实现...

    IT企业笔试面试题分析

    这些题目涵盖了Java编程语言的基础知识...这些题目反映了Java基础语法和面向对象编程的关键概念,对于理解和准备IT企业的笔试面试具有很高的参考价值。理解这些问题的解答有助于提升Java编程能力,为面试做好充分准备。

Global site tag (gtag.js) - Google Analytics