`
jefferent
  • 浏览: 79928 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

 
阅读更多

    Java中String类由于其特殊性(不变类),几乎是笔试面试中的必考题,当然有些题目其实没啥意思,不过关键是要通过题目掌握原理性的东西。下面六道题目,如果您全部做对了,且明白其所以然,那么Java中的关于String的笔试面试题应该难不到你了。也许您觉得polaris说的有点过了,然而彻底明白这些题目,对理解String类还是很有好处的。

写出下面各题的打印输出的结果:

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());
	}

 

 

(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程序的动态链接中起着核心的作用。

<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> String对象的存储

    请看这样两个语句:

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

 

 

 


 现在来分析一下内存的分配情况。如图:

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

 

3、六道题答案详解

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

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

分享到:
评论

相关推荐

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

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

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

    java常见笔试、面试题深度剖析 之 String 相关 之后的29个请大家等待

    JAVA技术综合面试题目(含参考答案)-100家大公司笔试题汇总

    C++语言里面的String类,让重写普通构造函数,拷贝构造函数,析构函数,还有一个改值函数 双向链表里面,在P后面的值之前插入s,用C语言写出逻辑代码 用VB语言实现冒泡排序 将“销售部”里面工资小于600的员工的工资...

    JAVA_笔试题

    JAVA_笔试题,是本人整理的java面试和笔试经常用到的题目,要面试或笔试的朋友可以看看。

    互联网公司面试必考题目集锦

    个人整理 原创 收集很多经典面试题 每年笔试面试必考题目 如 itoa实现 KMP算法实现 快排序 冒泡 static关键字用途 string类实现 数据库事物 游标 等等。。。吐血整理一个月 这是第一本 第二本邮箱索取

    BAT及各大互联网公司2014前端笔试面试题–JavaScript篇

    附上第二篇:BAT及各大互联网公司2014前端笔试面试题–Html,Css篇 前面几题是会很基础,越下越有深度。  初级Javascript:  1.JavaScript是一门什么样的语言,它有哪些特点?  没有标准答案。   2.JavaScript的...

    BAT及各大互联网公司2014前端笔试面试题:JavaScript篇

    很多面试题是我自己面试BAT亲身经历碰到的。整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是大有裨益。而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确,如...

    java面试题

    答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...

    Java面试笔试资料大全

    输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。 65 4、有一个字符串...

    C/C++面试题目及解答.doc

    a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题的至少一个不同解法。 第一种unsigned int TestAsOne0(char log) { int i; unsigned int num=0, val; for(i...

    asp.net 面试 笔试题目[附答案]第1/3页

    一名入门的asp.net程序员应该掌握的知识: (1)熟练使用Sql Server中企业管理器、查询分析器和事件探查器,能熟练编写T-SQL、存储过程、用户自定义函数、视图、触发器; (2)了解ASP.net服务器控件的生命周期; ...

    尚硅谷_宋红康_第9章_Java常用类.pdf

    ·企业级笔试面试题目深入源码级讲解,拒绝死记硬背 4.代码量更大、案例更丰富、更贴近实战: ·Java语言基础阶段:12720行代码,Java语言高级阶段:11684行代码 ·课堂实战项目3套,课后实战项目2套 ·近百道企业...

    Java面试宝典2010版

    输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。 4、有一个字符串,...

    Redis面试必会的题目

    string:最基本的数据类型,二进制安全的字符串,最大512M list:按照添加顺序保持顺序的 字符串列表 set:无序的字符串集合,不存在重复的元素 sorted set:已排序的字符串集合 hash:key/value对的一种集合 ...

Global site tag (gtag.js) - Google Analytics