- 浏览: 96552 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (61)
- Hibernate (5)
- WebService (6)
- Python (13)
- ExtJs (0)
- Java (20)
- SMB (1)
- Game (1)
- Java Advanced Image (1)
- CMD (4)
- Oracle (2)
- Windows (2)
- Linux (1)
- Forums (1)
- Struts (2)
- Internationalization (1)
- NTLM (1)
- HttpClient (1)
- Http (1)
- Form (1)
- Tomcat (2)
- Log4j (1)
- Eclipse (1)
- ant (1)
- soap (0)
- SSL (2)
- security (2)
- permission (1)
- 面试 (0)
- authentication (1)
- Spring (0)
- ioc (0)
- javascript (1)
- license (0)
- web (0)
- Maven (0)
- website (0)
- tool (0)
- git (1)
- Thread (2)
- 软件工程 (0)
- mongodb (1)
最新评论
-
howgoo:
OpenSystemArchitect 中文乱码。
免费的数据库建模工具 -
tojaoomy:
如果需要输出时不换行,在最后加上逗号即可。比如print 'H ...
Python静态属性,静态方法 -
tojaoomy:
http://www.oracle.com/technetwo ...
丢失更新 -
tojaoomy:
teasp 写道tojaoomy 写道teasp 写道toja ...
synchronized (this) 柳暗花明又一村 -
teasp:
tojaoomy 写道teasp 写道tojaoomy 写道t ...
synchronized (this) 柳暗花明又一村
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");现在来分析一下内存的分配情况。如图:
可以看出,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
发表评论
-
Filter,Servlet,Conponent如何获取ApplicationContext
2014-08-04 18:35 1245Filter 获取Context 在init()方法获取S ... -
synchronized (this) 柳暗花明又一村
2013-05-17 16:23 1548今天写一个测试类,主要是测试wait(long timeo ... -
同一个线程synchronized方法调用synchronized方法
2013-02-21 16:28 973一个线程里面有两个synchronized方法a(),b( ... -
Java开源工具:网站开发工具清单
2012-07-23 14:07 0【IT168 技术】美国程序员Jon Sco ... -
Maven construct Maven Project
2012-07-17 17:36 0<project xmlns="http ... -
开源中最好的Web开发的资源
2012-06-20 09:52 0文章来源:Best “must know” open sour ... -
SimulateSpringIOC
2012-05-20 15:05 0Code View: package jp.co.ri ... -
User Authentication
2012-05-18 14:35 1780The Java Authentication and Aut ... -
Java SSL
2012-05-14 16:40 1124一直调查SSL的问题,毫无进展,头疼,先把手头搞定的资料整理 ... -
Security Managers and Permissions
2012-05-11 17:44 997Once a class has been loaded in ... -
[转]Web Services Over SSL - HOW TO
2012-05-07 15:31 927一篇好文章,原文地址:http://www.pankaj- ... -
Java Use the keyword goto
2012-05-07 14:53 0Today,I am unconsciously found ... -
HttpClient Access to HTML Form
2012-03-19 17:27 977Sample Html Form Code: <s:f ... -
Top 10 Java Developer Forums
2012-03-08 15:46 1127Developers get into tricky situ ... -
发几个收藏的Java游戏
2012-02-29 13:47 644JavaMine.jar 扫雷 jdiamonds. ... -
How Java access to shared folder
2012-02-27 20:23 1123import java.io.IOException; im ... -
Axis2 integrate with tomcat occur "unsupport" error
2012-02-27 14:42 1872Creating a Dynamic web project ... -
PD(PowerDesigner) 导出的sql中去掉双引号
2012-02-20 23:21 0http://user.qzone.qq.com/714719 ... -
JAEE5.0工程JSTL不能正常使用解决办法
2012-02-21 18:21 930在Tomcat的安装路径下:apache-tomcat-7.0 ... -
PowerDesigner(15.1.0.2805)反向工程错误解决汇总
2012-02-20 23:14 1324错误一:Non SQL Error : Could not ...
相关推荐
在C#这个编程语言的世界里,笔试和面试是评估...以上知识点只是C#笔试面试中的一部分,实际题目可能还会涉及异常处理、线程同步、单元测试、设计模式等方面。在准备面试时,建议全面复习并实践这些概念,以提高通过率。
"Java程序员笔试面试题汇总及答案.pdf知识点总结" 以下是从给定的文件中生成的相关知识点: ...这些知识点涵盖了 Java 程序员笔试面试题汇总及答案.pdf 中的多个方面,包括访问控制符、集合操作、输入输出、流等。
Java是一种广泛应用的编程语言,java面试笔试题大汇总涵盖了Java的多方面知识点,包括Java面试题目、多线程编程、通信编程、数据库查询、异常处理机制、事件机制、多形与继承、抽象类与接口、String与StringBuffer的...
这些都是面试和笔试中的基础题,对C#的理解程度通常从这些基本概念开始测试。 2. **面向对象编程**:C#是纯面向对象的语言,理解类、对象、继承、多态、封装等概念至关重要。面试中可能会问到如何创建和实例化类,...
Java笔试面试题是每个Java开发者在求职过程中必须面对的挑战,涵盖了从基础知识到高级概念的广泛范围。以下是一些常见的Java面试题及其详细解释,帮助你深入理解和准备这些知识点。 1. **Java基础** - **数据类型*...
整理了网上的一些java面试题目,很全很强大 面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面。抽象并不5. 打算了解全部问题...
这些面试题通常用于测试开发者对Java基础知识的掌握程度。理解JDK与JRE的区别可以帮助开发者理解开发环境和运行环境的不同需求,而`==`和`equals`的使用则涉及到对Java内存模型的理解,这是编写正确、健壮的Java代码...
### Java程序员经典笔试面试题汇总知识点解析 #### 一、程序执行顺序与静态变量初始化 **题目背景**:本题目旨在考察Java程序中类的加载过程以及不同成员(如静态变量、非静态变量等)的初始化顺序。 **题目示例*...
这份"各大软件公司笔试面试题"集合,无疑为准备面试的求职者提供了宝贵的资源。 首先,让我们来看看C/C++面试题通常涵盖哪些知识点: 1. **基础语法**:包括变量声明、数据类型、运算符优先级、流程控制语句(如if...
【PHP笔试面试题详解】 在准备PHP的面试或笔试时,了解并掌握这些常见问题至关重要。以下是对给定题目的一些详细解释: 1. **抓取远程图片到本地**:在PHP中,可以使用`fsockopen`或者`file_get_contents`结合`...
Java作为一门广泛使用的编程语言,其面试和笔试题目往往涵盖了多个方面,包括设计模式、并发控制、内存管理、数据库优化、网络通信等。以下是对这些知识点的详细解释: 1. **MVC设计思想**:MVC(Model-View-...
Java作为一门广泛使用的编程语言,其笔试和面试题目往往涵盖了多个核心领域。下面将对这些领域进行深入解析,帮助你更好地准备Java相关的技术面试。 ### 字符串(String) 字符串在Java中是常用的数据结构,面试中...
Java笔试面试题是求职者在寻求Java开发职位时必须面对的重要环节。这些题目通常涵盖了从基础知识到高级概念的广泛范围,旨在评估候选人的编程技能、理解力和问题解决能力。以下是一些可能出现在Java笔试面试中的关键...
这份"字节跳动Java笔试面试题汇总"包含了丰富的题目,旨在帮助求职者深入了解Java编程语言和字节跳动的技术栈需求。以下是一些核心Java知识点的详细解释: 1. **基础语法**:理解Java的基本语法,包括变量、数据...
【知识点详解】 1. Java编程基础: - 类与对象:题目中的`Department`类代表了组织部门,包含了`id`、`OrgName`、`ParentId`和`Status`等属性,以及对应的getter和...对于面试者来说,熟悉并掌握这些知识点是必要的。
根据提供的文件信息,我们可以分析出这是一道关于Java继承与方法重写的相关笔试面试题。题目涉及到了Java类的继承、方法重写、实例化对象时的调用顺序以及对象多态性等知识点。接下来,我们将对这些知识点进行详细的...
Java作为一门广泛使用的编程语言,其面试和笔试题目往往涵盖了众多核心概念和技术。以下是对给定部分内容的详细解释: 1. **面向对象的特征** - **抽象**:抽象是将复杂的实体简化为只关注关键特性的过程。在Java...
### C++ 笔试面试题知识点汇总 #### 一、链表反转 **知识点概述**: 链表反转是C++编程面试中一个常见的题目,主要考察候选人对于链表这一数据结构的理解以及对指针操作的熟练程度。链表反转可以采用多种方法实现...
这些题目涵盖了Java编程语言的基础知识...这些题目反映了Java基础语法和面向对象编程的关键概念,对于理解和准备IT企业的笔试面试具有很高的参考价值。理解这些问题的解答有助于提升Java编程能力,为面试做好充分准备。