`
冇心人
  • 浏览: 55307 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java常见笔试面试题目解析(一): 字符串相关

阅读更多
public class StringTest {  
  
    public static void main(String[] args) {  
        String str = new String("abc"); //语句(1)  
        String str1 = "abc";//语句(2)  
        String str2 = new String("abc");//语句(3)  
          
        System.out.println(str == str1);//语句(4)  
        System.out.println(str == str2);//语句(5)  
        System.out.println(str1 == str2);//语句(6)  
          
        System.out.println(str == str.intern());//语句(7)  
        System.out.println(str1 == str1.intern());//语句(8)  
        System.out.println(str.intern() == str2.intern());//语句(9)  
          
        String hello = "hello";//语句(10)  
        String hel = "hel";//语句(11)  
        String lo = "lo";//语句(12)  
          
        System.out.println(hello == "hel" + "lo");//语句(13)  
        System.out.println(hello == "hel" + lo);//语句(14)  
    }  
}  
public class StringTest {

    public static void main(String[] args) {
        String str = new String("abc"); //语句(1)
        String str1 = "abc";//语句(2)
        String str2 = new String("abc");//语句(3)
        
        System.out.println(str == str1);//语句(4)
        System.out.println(str == str2);//语句(5)
        System.out.println(str1 == str2);//语句(6)
        
        System.out.println(str == str.intern());//语句(7)
        System.out.println(str1 == str1.intern());//语句(8)
        System.out.println(str.intern() == str2.intern());//语句(9)
        
        String hello = "hello";//语句(10)
        String hel = "hel";//语句(11)
        String lo = "lo";//语句(12)
        
        System.out.println(hello == "hel" + "lo");//语句(13)
        System.out.println(hello == "hel" + lo);//语句(14)
 }
}
问题1:当执行完语句(1)时,在内存里面生成几个对象?它们是什么?在什么地方?
解答:当执行完语句(1)时,内存里面生成2个对象,它们的内容分别都是abc,注意:str不是对象,它是对象的地址,它叫做引用 (reference),str指向new...生成的对象。换句话说,在java里面,当我们定义一个类的变量(如:String str;),它永远都是引用,不是对象。那么什么是对象呢?当我们用关键字new时,它生成出来的东西叫做对象。为什么是两个对象呢?首先它生成一个对象是abc,这个abc对象在什么地方呢?它在一个叫String Pool的字符串池里面,只有String有这样一个String池。String池是一个什么概念呢?我们知道,String类是一个不可变的类,一但它的内容确定,它就不能去更改了。当你去生成一个字符串对象的时候,它的执行流程是这样的:它首先在你的String Pool里面去找,看有没有一个内容为abc的对象存在,因为tring str = new String("abc")它是main方法的第一个语句,那么在刚开始执行的时候,String Pool里面是没有对象的。它发现String Pool里面没有abc这个对象,那么它首先把new String("abc")的括号里面的abc对象放到String Pool里面,接下来它执行new ...这行语句,执行String的构造方法。我们知道new它生成一个对象,这个对象在什么地方呢?在java的堆里面。我们知道java的内存分为2部分,一个叫栈 (Stack),一个叫堆(Heap)。那么new String("abc")时,它在堆(Heap)里面,生成一个内容为abc的这样一个对象。这样就造成了在String Pool里面一个叫abc的对象,堆里面也有一个叫abc的对象。我们这里用的是public String(String original)这个构造方法。jdk api是这样叙述的:
Initializes a newly created String object so that is represents the same sequence of characters as the argument;in other words,the newly created string is a copy of the argument string.Unless an explicit copy of original is needed,use of this constructor is unnecessary since Strings are immutable.(翻译:初始化一个新创建的String对象,表示一个与该参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的一个副本。由于 String 是不可变的,不必使用该构造方法,除非需要original的显式副本。)

问题2:当执行完语句(2)时,在内存里面一共有几个对象?它们是什么?在什么地方?
解答:当执行完语句(2)时,内存里面一个新的对象都没有生成。为什么这么说?当我们定义语句(2)的时候,如果我们用字符串的常量值(字面值) 给str1赋值的话,那么首先java还是从String Pool里面去查找没有有内容为abc的这样一个对象存在,我们发现当我们执行完语句(1)的时候,StringPool里面已经存在了内容为abc的对象,那么就不会再在tring Pool里面去生成内容为abc的字符串对象了。而是会使用已经存在String Pool里面的内容为abc的字符串对象,并且会将str2这个引用指向String Pool里面的内容为abc的字符串对象,str2存放的是String Pool里面的内容为abc的字符串对像的地址。也就是说当你使用String str2 = "abc",即使用字符串常量("abc")给定义的引用(str2)赋值的话,那么它首先是在String Pool里面去找有没有内容为abc的字符串对象存在,如果有的话,就不用创建新的对象,直接引用String Pool里面已经存在的对象;如果没有的话,就在 String Pool里面去创建一个新的对象,接着将引用指向这个新创建的对象。所以,当执行完语句(2)时内存里面一共有2个对象,它们的内容分别都是abc,在String Pool里面一个内容abc的对象,在堆里面有一个内容为abc的对象。

问题3:当执行完语句(3)时,在内存里面一共有几个对象?它们是什么?在什么地方?
解答:执行完语句(3)时,执行过程是这样的:它首先在String Pool里面去查找有没有内容为abc的字符串对象存在,发现有这个对象存在,它就不去创建一个新的对象。接着执行new...,只要在java里面有关键字new存在,就表示它生成一个新的对象,new多少次,就生成多少个对象,而且新生成的对象都是在堆里面,所以它会在堆里面生成一个内容为abc的对象,并且将它的地址赋给了引用str2,str2就指向刚在堆里面生成的内容为abc的对象。所以,当执行完语句(3)时,内存里面一共有3个对象,其中包含了一个在String Pool里面内容为abc的字符串对象,另外在堆里面包含了两个内容为abc的字符串对象。

问题4:当执行完语句(4)(5)(6)后,它们的结果分别是什么?
解答:在java里面,对象用"=="永远比较的是两个对象的内存地址,换句话说,是比较"=="左右两边的两个引用是否指向同一个对象。对于 java里面的8种原生数据类型来说,"=="比较的是它们的字面值是不是一样的;对应用类型来说,比较的是它们的内存地址是不是一样的。在语句(1) (2)(3)中,由于str、str1、str2指向不同的对象,它们的内存地址就不一样,因此可以说当执行完语句(4)(5)(6),它们返回的结果都是false。

问题5:当执行完语句(7)(8)(9)后,它们的结果分别是什么?
解答:jdk api里对方法public String intern()是这样叙述的:
Return a canonical representation for the string object.(翻译:返回字符串对象的标准化表示形式。)A pool of strings,initially empty,is maintained privately by the class String.(翻译:一个初始时为空的字符串池,它由类 String 私有地维护。) When the intern method is invoked,if the pool already contains a string equeal to this String objectas determined by the equals(Object) method,then the string from the pool is returned.Otherwise,this String object is added to the pool and a reference to the String object is returned.(翻译:当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。)If follows that for any two strings s and t,s.intern() == t.intern() is true if and only if s.equals(t) is true.(翻译:它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。)All literal strings and string-valued consrant expressions are interned.String literals and defined in §3.10.5 of the Java Language Specification.(翻译:所有字面值字符串和字符串赋值常量表达式都是内部的。字符串字面值在《Java Language Specification》的 §3.10.5 中已定义。) Returns:a string that has the same contents as this string,but is guaranteed ro be from a pool of unique strings.  (翻译:返回一个字符串,内容与此字符串相同,但它保证来自字符串池中。) 当执行语句(7)时,首先,str这个对象指向的是堆中第一次new...生成的对象,根据jdk的api叙述,当调用 intern 方法时,如果String Pool已经包含一个等于此 String 对象的字符串(该对象由equals(Object)方法确定),则返回String Pool中的字符串对象的内存地址。因为String Pool中有内容为abc的对象,所以str.intern()返回的是String Pool中的内容为abc的字符串对象的内存地址,即是str1。而str==str1为false,所以,str == str.intern() 为false,即是语句(7)结果为false。而对于str1.intern(),它还是会首先检查String Pool中是否有内容为abc的对象,发现有,则将String Pool中内容为abc的对象的地址赋给str1.intern()方法的返回值,即str1.intern()的结果为str1。所以,str1 == str1.intern()的结果为true,,即是语句(8)结果为true。对于str.intern(),它首先检查String Pool中是否有内容为abc的对象,发现有,则将String Pool中内容为abc的对象的赋给str.intern()方法的返回值,即str.intern()的结果为str1。对于 st2r.intern(),首先检查String Pool中是否有内容为abc的对象,发现有,则将String Pool中内容为abc的对象的地址赋给str2.intern()方法的返回值,即str2.intern()的结果为str1。所以,str.intern() == str2.intern()的结果为true,,即是语句(9)结果为true。因此,当执行完语句(7)(8)(9)后,它们的结果分别是false、 true、true。

问题6:当执行完语句(13)(14)后,它们的结果分别是什么?
解答:执行完语句(13)结果为true,执行完语句(13)结果为false。分析:对于hello == "hel" + "lo",hello指向的是String Pool里面的内容为hello的字符串对象,对于"hel" + "lo",当"+"两边都是字面值(字符串常量)的时候,在执行完"+"之后,它接着去判断String Pool里面有没有内容为hello的字符串对象存在,有的话就直接返回String Pool里面的内容为hello的字符串对象的内存地址,所以,hello == "hel" + "lo"结果为true;对于hello == "hel" + lo,lo不是字面值,当"+"两边有一个不是字面值(字符串常量)的时候,那么"+"操作后又会在堆里面生成一个新的对象,也就是说hello的引用是指向String Pool里面的内容为hello的字符串对象,"hel" + lo的结果是返回在堆里面生成一个新的对象,一个在String Pool里面,一个在堆里面,当然为false了。
分享到:
评论

相关推荐

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

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

    java常见笔试、面试题深度剖析

    ### Java常见笔试、面试题深度剖析之String相关 #### 背景介绍 在Java编程语言中,`String` 类型是最常用的数据类型之一。它不仅代表文本数据,还涉及到了许多重要的概念,如字符串池(String Pool)、不可变性...

    java_经典笔试面试题目

    ### Java经典笔试面试题目解析 #### 1. int和Integer有什么区别? 在Java中,`int` 是一种基本数据类型,而 `Integer` 是 `int` 的包装类。这两种类型的本质区别在于: - **基本数据类型 vs 包装类**: - `int`...

    Java最新笔试面试题

    ### Java最新笔试面试题知识点详解 #### 第一部分:JAVA基础 ##### 1.1 JAVA语言基础 本章节主要涵盖Java语言的基础知识,包括但不限于运算符、转义字符、循环结构、排序方法以及Java的基本类型等内容。 **...

    java常见笔试面试题

    ### Java常见笔试面试题知识点详解 #### 一、final, finally, finalize的区别及Anonymous Inner Class的理解 1. **final**:此关键字用于定义不可变变量或类。当应用于变量时,意味着一旦为该变量分配了一个值,则...

    java面试笔试宝典

    以下是一些常见的Java面试和笔试题目及其解析: 1. 一个".java"源文件中可以包含多个类,但只能有一个公共类(public class),其他非公共类(非内部类)的数量不受限制,但需注意每个类必须有自己的命名空间。 2....

    java笔试面试题目,精品推荐

    Java笔试面试题目是每个Java开发者在求职过程中必须面对的一关,它涵盖了广泛的Java基础知识、进阶概念以及实际问题解决能力。这份"JAVA笔试题,面试题(免费下载,吐血推荐).doc"文档很可能是精心整理的一份Java面试...

    常见的Java上机面试题

    在众多上机面试题目中,字符串处理是一类高频考点,特别是涉及到多字节字符(如中文)的处理。以下是一道典型的字符串截取题目: **面试题1:怎样截取字符串** **题目描述**:设计一个函数,接受一个字符串和一个...

    Java面试笔试题目.docx

    以上是对Java面试笔试题目的详细解析,涵盖了Java语言的基础知识,包括关键字、数据类型、运算符优先级、循环控制、数组、接口、集合框架等多个方面。这些知识点是Java程序员必须掌握的基本技能,对于面试和实际工作...

    java笔试面试算法题

    在Java笔试面试中,算法题是考察候选者编程能力、逻辑思维和问题解决能力的关键环节。这些题目通常涵盖数据结构、排序、搜索、图论等多个领域,涉及到的基础知识包括但不限于以下内容: 1. **基础算法**:如冒泡...

    应届生java面试笔试大全

    "应届生java面试笔试大全"这个资料集将涵盖以上所有知识点,并可能提供具体的题目解析和解答策略,帮助你巩固基础,提升解决问题的能力,增加成功就业的机会。务必深入学习并实践,以便在面试中展现出你的专业能力和...

    java面试笔试题目汇总

    Java面试和笔试题目涵盖了许多核心概念,这些都是Java开发者在求职过程中必须掌握的关键知识点。下面将逐一解析这些要点。 1. **面向对象的特征** - **抽象**:抽象是将复杂的现实问题简化,关注主要部分,忽略...

    2020 兴业银行Java笔试题

    【Java笔试题解析】 在2020年兴业银行的Java笔试中,涉及了多个核心的Java编程和技术概念。以下是对部分题目进行的详细解答: 1. 输入一个正整数,计算并输出距离它最近的对称数 对称数是指从左向右读和从右向左...

    500强经典java笔试

    **解析:** 本题未给出具体选项,但从题目来看,可以讨论Java中字符串初始化的特点: - 字符串一旦初始化后不可改变,即字符串是不可变的。 - 字符串可以通过字面量或`new String()`两种方式进行初始化。 - 字符串...

    软件开发常见笔试面试题

    ### 软件开发常见笔试面试题解析 #### 一、实现`strcpy`函数 **题目描述**: 已知`strcpy`函数的原型是:`char *strcpy(char *strDest, const char *strSrc);` 其中`strDest`是目的字符串,`strSrc`是源字符串。...

    125条常见的java面试笔试题大汇总(PDF)

    ### 常见Java面试笔试知识点详解 #### 1. 抽象 **知识点解析**: - **定义**: 抽象是指在设计软件系统时,将复杂的问题简化处理,只关注与当前目标相关的方面,而忽略掉不重要的细节。这是一种减少系统复杂度的...

    中兴华维笔试面试题目

    中兴华维的笔试面试题目通常涵盖了多个领域,包括但不限于计算机基础知识、编程能力、网络技术、数据库管理、操作系统原理、项目管理以及逻辑思维能力等。下面将详细阐述这些领域的知识点。 1. 计算机基础知识:这...

Global site tag (gtag.js) - Google Analytics